This is a pretty basic trick that will be obvious to many of you. But for whatever reason, the solution to it always kind of eluded me so I’m sharing it here. I like padded links. Where you give links in body content a little padding, background, and rounded corners.
a {
padding: 2px 6px;
background: #eee;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
}

A “padded” link
The problem is that when you make images into links, this padding shows up in ungainly ways.

Falsche Lösungswege
Wie ich es früher gelöst habe, war wie mit einem Vorschlaghammer statt mit einem Meißel. Das heißt, ich habe etwas jQuery geschrieben, um den Padding für diese Bilder zu entfernen.
$("a:has('img')").css(padding, 0);
Das habe ich getan, weil jQuery die `.has()` Funktion hat, die sehen kann, ob ein Element ein anderes Element enthält, was CSS fehlt. Es wäre cool, wenn wir das in CSS machen könnten…
a:contains img { padding: 0; }
…aber das können wir nicht. Eine andere Möglichkeit wäre, allen Links, die Bilder enthalten, eine Klasse hinzuzufügen, wieclass="imageLink". Ich habe kein besonderes Problem mit der Semantik dessen, aber es ist nicht so zukunftssicher, wie ich es mir wünschen würde. Vielleicht verwendet ein zukünftiges Design der Website keine gepolsterten Links mehr und nun haben all diese alten Links einen unnötigen Klassennamen.
Der einfache Weg
Wie sich herausstellt, ist der einfache Weg, dies zu handhaben, dem Bild im Inneren einige negative horizontale Ränder zu geben.
a img { margin: 0 -6px; }
Das zieht den zusätzlichen Polster von außen weg und lässt ein sauberes, nubby-freies Bild zurück.
Beachten Sie, dass ich im Demo eine Klasse verwendet habe, um das Problem zu beheben, genau das, was ich Ihnen oben gesagt habe, nicht zu tun. Das war nur zu Demozwecken, da ich ein Problembild und ein behobenes Bild auf derselben Seite haben wollte.
Hallo Chris,
Ich habe neulich über gepolsterte Links nachgedacht. Ich habe versucht, einen auf einer Website zu verwenden, stieß aber auf ein Problem, wenn die verlinkte Phrase umbricht.
Nehmen wir an, ich habe einen Satz mit fünf Wörtern, der am Ende einer Zeile beginnt und auf die nächste Zeile übergeht. Bei gepolsterten Links wird der Polster effektiv in der ersten Zeile angewendet, aber wenn die Zeile umbricht, erscheint das Wort nun DIREKT neben der Hintergrundfarbe des gepolsterten Links, ohne Polsterung.
Wie behebt man das? Das hat mich verrückt gemacht :)
So funktioniert es hier, oder?
Ich weiß, was Sie meinen, und ja, das ist ärgerlich und nicht ideal. Da Sie nicht wissen, wo eine Zeile umbricht, fallen mir keine sofortigen Lösungen ein. Obwohl ich mich frage, ob ein wenig Wortabstand helfen könnte?
Das hat mich auch gestört. Das Beste, was *mir* eingefallen ist, ist die Verwendung von für die Leerzeichen innerhalb der Links, sodass, wenn der gesamte Link nicht auf die Zeile passt, er zur nächsten Zeile springt. Was natürlich zu einer wirklich unschönen Zeilenlänge darüber führt, aber besser aussieht als ein seltsam gestalteter geteilter Link.
Ich bin mir jedoch nicht sicher, ob es semantische Probleme mit der Verwendung eines nicht umbrechenden Leerzeichens für diesen Zweck gibt. Ist das schlechte Form?
Das ist eine weitere Möglichkeit… Wahrscheinlich ist es aber sauberer, `white-space: nowrap;` auf die Links anzuwenden. Bei Davids Beispiel eines Satzes mit fünf Wörtern könnte das jedoch zu noch seltsameren Zeilenumbrüchen führen.
Eine super einfache Lösung wäre, sich an die Faustregel zu halten, dass ein Link im Fließtext nicht mehr als zwei Wörter enthalten sollte – das löst die meisten Probleme mit gepolsterten Links.
"Nubbies" ist ein Wort, das nicht oft genug verwendet wird. Schöner Tipp auch!
Validiert das?
Irgendwann habe ich mir eingeredet, dass Negativ-irgendwas schlecht ist und vermieden werden sollte, ich weiß nicht warum.
Warum können wir nicht `a img {padding: 0}` verwenden?
Ich erinnere mich, dass ich einmal einen dicken unteren Rand für meine Links verwendet habe und um zu vermeiden, dass Bilder ihn bekommen, habe ich so etwas gemacht.
Weil das das Bild anvisiert, nicht den Link, und der Link ist es, der den Polster hat.
Oh, verstehe. Danke für die Klärung.
Ich hatte den gleichen Gedanken ;)
Negativer Polster ist gültig. Aber negative Ränder nicht. Negative sollten mit Vorsicht verwendet werden. Können Nebenwirkungen auf andere Teile Ihrer Website haben, aber ich denke, die Verwendung, wie Chris sie im Tutorial verwendet hat, ist in Ordnung und ein ziemlich guter Tipp.
Ich erstelle normalerweise nur eine Span-Klasse für Textlinks mit Polster, hat mich noch nie im Stich gelassen.
Ich wette, Sie meinten es andersherum – negative Ränder sind in Ordnung, aber negativer Polster nicht
http://jigsaw.w3.org/css-validator/#validate_by_input
Ha, ja danke! Ich war am Ende eines sehr harten Arbeitstages!
Ich werde meine Website neu gestalten, viel testen mit verschiedenen Browsern und (lustigerweise!) unter IE7 tritt das Problem mit den negativen Rändern nicht auf. Normalerweise ist es umgekehrt…:-). Ich nehme an, dass dies trotzdem ein Fehler in IE ist.
Auf jeden Fall funktioniert Ihre Technik auch in IE7 gut.
Das ist css-tricks vom Feinsten! ;) Ich mag diese kleinen Tipps wirklich, danke Chris
Ein weiteres Problem mit Bildlinks, das ich früher hatte, ist, wenn man ihnen einen `border-bottom` gibt. Die Bilder werden auch unterstrichen, aber das kann man mit `img { vertical-align: middle }` beheben, wie in Ihrem Beispiel im Demo
Hey, danke für den Tipp! Ich habe mich damit herumgeplagt :)
Kopf…
neugierig, wie ein dreifaches Anführungszeichen hier aussehen wird!
Warum wäre es außerdem schlecht, jQuery zu verwenden, um dies zu beheben? Leistungsverlust?
Warum etwas mit Javascript machen (und dem Aufwand, das gesamte DOM des Dokuments zu durchlaufen), wenn es einfach mit einer CSS-Anweisung erledigt werden kann. :)
Dies ist ein weiterer Fall, in dem wir wirklich einen übergeordneten Elementselektor benötigen, um den Kindselektor zu ergänzen.
d. h. anstatt
a > img { ... }was natürlich jedes IMG-Element auswählt, das ein Kind eines A-Elements ist. Wir brauchen
a < img { padding: 0; }Ich habe viele Gelegenheiten gefunden, bei denen es praktisch wäre, Zugriff auf das übergeordnete Element wie oben zu haben, es wäre in der Tat perfekt für diesen Fall, ohne negative Ränder zu benötigen. ;)
Wow, das wäre so nützlich!
Wahr, aber ich habe gehört, dass es für die Browserhersteller (fürs Erste) zu schwer zu implementieren ist.
Es ist ein lange gewünschtes Feature.
Danke für diesen "Trick" Chris!
Ich habe unter diesem gepolsterten Bild gelitten, als ich mit gepolsterten Links gearbeitet habe.
Das ist die Lösung, nach der ich gerade gesucht habe!
Mach weiter so! Wirklich schätzen!
Beste Grüße
Was ich an negativen Rändern mag (und leicht überrascht war) ist, dass sie vollständig validieren.
Ich gebe zu, ich hatte gezögert, sie zu verwenden, weil es sich anfühlte, als würde ich etwas falsch machen und es in einigen Fällen eine "Klebebandlösung" war… in diesem Beispiel ist es das nicht. Aber ich gebe zu, ich habe sie verwendet, um in IE einen Rand zwischen meinem Header und den Containern zu ziehen, als ich wahrscheinlich anderen ungültigen Code hatte, der das Problem verursachte….oder vielleicht war es nur IE. ;)
Interessanter Tipp. Ich musste dieses Problem beheben, da ich solche Links noch nie zuvor in meinem Fließtext verwendet hatte.
Eines, bei dem ich mir nicht sicher bin, ist, in welchem Kontext dies geschieht.
Ist es, wenn ein Artikel ein Feature-Bild hat? Normalerweise rechts oder links davon geschwommen? Oder wäre es als Inline-Bild zwischen Text? Oder beides?
Der Grund, warum ich das frage, ist, dass ich in einer verrückten Theorie in meinem Gehirn denke, dass es einen Weg geben muss, dem Bild einen Float zuzuweisen, wodurch es aus dem Fluss des Anker-Tags genommen wird (was bedeutet, dass man mit etwas Hokuspokus den Anker-Tag verstecken könnte), aber nicht den Absatztext.
Gibt es eine solche CSS-Eigenschaft, die es einem übergeordneten Element ermöglicht, ein gefloatetes Element zu zähmen, wenn es sich zwischen Text befindet?
xD
Einfach, aber nützlich =)
Chris, danke für eine großartige Website, ich schaue täglich vorbei, um weiter zu lernen.
Wenn ich mir das Demo in IE7 ansehe, sehe ich grauen Polster oben und rechts vom Bild. Das nicht behobene hat graue Farbe rundherum.
Du hast also doch meinen Kommentar auf deinem anderen Blog gelesen :)
Ja! Das ist tatsächlich der Funke dieses Artikels. Vielen Dank.
Danke dir, Chris. Ich bin ein großer Fan.
Hallo, es funktioniert nicht in Internet Explorer 7 XP, ich sehe die graue Farbe links von den Bildern, Lösung?
Negativer Rand für ein Bild in einem Hyperlink-Tag. Clever.
Ist dieser CSS-Code dafür korrekt, siehe ok in ie und firefox
p.cccp a {
color: blue;
text-decoration: none;
padding: 2px 6px;
background: #eee;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
}
p.cccp a:hover {
text-decoration: none;
color: #FFFFFF;
padding: 2px 6px;
background: #CC0000;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
}
Ist dieser Code korrekt, um dasselbe zu tun, aber nur für Links, die sich in einem Absatz mit dem Stil cccp befinden?
p.cccp a {
color: blue;
text-decoration: none;
padding: 2px 6px;
background: #eee;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
}
p.cccp a:hover {
text-decoration: none;
color: #FFFFFF;
padding: 2px 6px;
background: #CC0000;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
}
Ich mag dieses neue CSS 3 wirklich. Und mit dem Fallback für ältere Browser ist es großartig für die Benutzerfreundlichkeit.
Sie werden das Problem des negativen Randes in IE6 sehen. IE6 tut nicht, was Sie vom Browser erwarten.
Ich mag die runden Ecken um die In-Text-Links. Wie könnten die Kurven in IE ohne Bilder angezeigt werden? Jquery?
Sam Miller