Jemand hat mich kürzlich nach dieser Technik gefragt und meine erste Reaktion war, dass sie wahrscheinlich zu alltäglich sei, um sie als Tutorial zu behandeln. Aber dann dachte ich, dass hier tatsächlich ein paar interessante Dinge passieren und der Stil trendig genug ist, dass die Leute interessiert sein könnten.
Die Idee ist einfach, Text über einem Bild einzublenden, aber als Blöcke, die vom linken Rand abstehen und rund um den variablelängen Text einen gleichmäßigen Abstand haben. Hier ist ein Screenshot-Beispiel

Die Schematik

Das HTML
<div class="image">
<img src="images/3754004820_91a5c238a0.jpg" alt="" />
<h2>A Movie in the Park:<br />Kung Fu Panda</h2>
</div>
Das Bild als Hintergrundbild des umgebenden Divs einzufügen, wäre einfacher, aber in diesem Szenario betrachte ich die Bilder als Inhalt und sie gehören somit in das HTML. Wir werden dieses umgebende Div als Container für die absolute Positionierung verwenden.
Das CSS
.image {
position: relative;
width: 100%; /* for IE 6 */
}
h2 {
position: absolute;
top: 200px;
left: 0;
width: 100%;
}
Dies wird unseren Text schön über das Bild legen, aber es erreicht nicht die transparente schwarze Box, die wir hinter dem Text haben wollen. Dafür können wir nicht denh2verwenden, da dies ein Block-Level-Element ist und wir ein Inline-Element ohne eine spezifische Breite benötigen.
Lassen Sie uns das Innereh2des in einen Span
<h2><span>A Movie in the Park:<br />Kung Fu Panda</span></h2>
einpacken. Verwenden Sie dann diesen Span, um den Text und den Hintergrund zu gestalten.
h2 span {
color: white;
font: bold 24px/45px Helvetica, Sans-Serif;
letter-spacing: -1px;
background: rgb(0, 0, 0); /* fallback color */
background: rgba(0, 0, 0, 0.7);
padding: 10px;
}
Problem

Wenn ein Inline-Element umbricht, bricht der Block **sofort** nach dem letzten Zeichen der Zeile ab und beginnt **sofort** bündig links in der nächsten Zeile. Abstand hilft uns hier nicht.
Um dies zu lösen, werden wir einige weitere Spans auf beiden Seiten des<br />Elements anwenden, um diesen Abstand zu simulieren.
<h2><span>A Movie in the Park:<span class='spacer'></span><br /><span class='spacer'></span>Kung Fu Panda</span></h2>
Diese neuen Spans werden wir verwenden, um Abstände anzuwenden.
h2 span.spacer {
padding:0 5px;
}
Semantik korrigieren
An diesem Punkt ist das Design erreicht, aber es gibt eine Menge zusätzlicher HTML-Elemente, die rein aus Designgründen hinzugefügt wurden. Nämlich all diese Spans. jQuery kann hier helfen und uns retten. Entfernen Sie einfach alle Spans aus dem Markup und wenden Sie sie dynamisch wie folgt an
$(function() {
$("h2")
.wrapInner("<span>")
$("h2 br")
.before("<span class='spacer'>")
.after("<span class='spacer'>");
});
Danke für die rgba-Sache. Wusste nicht, dass es das gibt.
Vielleicht können Sie in Zukunft einige CSS-Eigenschaften behandeln, die nicht oft verwendet, aber nützlich sind.
Die rgba-Sache funktioniert nur in Firefox, Safari, Chrome. Können Sie erraten, bei welcher es nicht funktioniert? IE. Nicht einmal Version 8. Trauriger Zustand der Dinge.
Was gibt es sonst Neues ;D
Deshalb gibt es die Fallback-Farbe – damit eine Volltonfarbe verwendet wird, wo rgba nicht unterstützt wird. Nicht so schick, aber besser als nichts. Ich denke, das ist die Art von Ansatz, den die meisten Leute bei CSS3 und IE verfolgen.
Er hat rgba in einem seiner Screencasts behandelt, ich glaube, es war der über CSS3.
Ich habe hier (www.qualityreglaze.com) etwas sehr Ähnliches gemacht, aber nicht mit Transparenz. Gute Arbeit!
Übrigens: Das DEMO in IE7 und Opera zeigt einen soliden schwarzen Hintergrund, keine Transparenz. Und in Firefox und Flock überlappen sich die Hintergründe, wodurch eine schwarze Linie zwischen den beiden entsteht.
Wenn Sie die Transparenz in IE7 / Opera zum Laufen bringen möchten, könnten Sie den Hintergrund mit einem Volltonbild als transparentes PNG festlegen, wie in diesem Demo. Es gibt ein ganzes Paket dieser PNGs im Download-Bereich.
Cool! Danke für den Link.
Was ist mit dem Überlappungsproblem?
Dann gibt es noch das (ehem...) IE6-Problem. Ich weiß, ich habe es gesagt, Sakrileg. Tolle Sachen, ich nehme an, das kann zu WP und einer jQuery-Galerie hinzugefügt werden? Tutorials dazu wären auch großartig. Danke.
Ist diese Methode browserübergreifend?
Danke Chris, du bist der Hammer, Kumpel!
Auf Safari 4 überlagert der Spacer-Hintergrund die Haupt-Span, wodurch er dunkler wird.
Ich denke, es muss auf die rgba-Werte zurückgesetzt werden.
Ich habe ein ähnliches Problem mit einer Zeile, bei der sich die Hintergründe überlappen, wie bei Joel.
Ah ja, lustig, wie Safari damit umgeht (rgba-Überlappung). Ich denke, das ist wahrscheinlich der richtige Weg. Aber trotzdem, eine weitere Sache für die Cross-Browser-Kompatibilität, auf die man achten muss.
Sie können einfach die Zeilenhöhe anpassen, um die überlappende Zeile zu beheben. In meinem Browser sieht es gut aus, aber es kann mit leicht unterschiedlichen lokalen Versionen von Helvetica zu tun haben.
Hey, was ist mit der jQuery-Funktionalität? Ich habe es nie herausgefunden, sehr interessant, man muss keinen zusätzlichen HTML-Code in das endgültige HTML-Dokument einfügen. Oder irre ich mich?
Chris, würde die Verwendung von inline-block auf dem Span das Abstandsproblem beheben? Ich habe es nicht getestet, aber das war mein erster Gedanke.
Hey Chris – toller Beitrag wie immer!
Nur um das JQuery zu hinterfragen (HA HA HAAaaaa… äh) – wird das nicht alle h2-Tags auf der Seite beeinflussen? Ich bin nicht gut in JQuery, also vielleicht fehlt mir etwas…
Es ist hier nur ein Beispiel. Natürlich sollten Sie den Selektor ändern, um Ihren Bedürfnissen zu entsprechen…
Könnten Sie die 'spacer'-Spans nicht einfach durch ' ' ersetzen?
Ursprünglich habe ich nur die Spans verwendet, um super genau beim Abstand zu sein, aber schließlich habe ich die Demo so geändert, dass sie sowohl Spans als auch verwendet – da IE den leeren Span nicht mochte (er hat ihn zusammengeklappt, anstatt den Abstand darauf anzuwenden).
Oder könnte man nicht einfach einen Rand zum Zeilenumbruch hinzufügen?
h2 span br { margin: 0 5px; }
Man könnte ihm natürlich eine Klasse geben…
Schöner Effekt. Sieht gut auf WordPress aus.
Danke! Wie würden Sie das Problem mit dynamischem Text und Abständen lösen?
Das JavaScript. Ich verstehe.
Ich konnte den Hintergrund nicht sehen, es sei denn, ich hatte JavaScript aktiviert (in FF). Benötigt rgba JS, um zu funktionieren?
Ich dachte jetzt, da Sie JS verwenden, um Ihren Code semantischer zu machen, wäre es besser, das Bild-Div und h2 vollständig zu entfernen und sie über JS hinzuzufügen? Vielleicht das h2 aus dem Alt-Att des Bildes erstellen…
Coole Sachen. Ich mache das bei Mouseover, anstatt die Titel sofort anzeigen zu lassen. Anfangs würde ich display:hidden verwenden und dann :hover verwenden, um display: block auszulösen, damit der Text angezeigt wird. Guter Beitrag. Weiter so, Chris.
display:none nicht display:hidden. Entschuldigung.
Wenn Sie zusätzlichen Markup hinzufügen (und ich würde argumentieren, dass selbst der 'br' zusätzlicher Markup ist), warum nicht einfach zwei span-Elemente verwenden – eines um "Movie in the Park:" und eines um "Kung Fu Panda".
Sie können sie dann beliebig positionieren, aber der einfachste Weg ist, sie einfach zu fluten.
Siehe http://www.thinktherefore.co.uk/tests/text-blocks-over-image für ein Beispiel.
Ich mag das. Das einzige Problem, das ich sehe, ist, dass Sie dann die Spans im Markup einfügen müssen und sie nicht dynamisch anhängen. Es sei denn, Sie werden richtig schick und erfinden eine Art "Trennsymbol", das Sie mit JavaScript parsen können, um anzugeben, wo ein Span enden und der nächste beginnen soll.
Nun, wenn Sie bereits einen 'br' in das Markup zwingen, könnten Sie argumentieren, dass ein paar Spans keine große Sache sind. Die von Ihnen verwendeten Beispiele deuten ohnehin auf eine Art Unterüberschrift hin, die das Aufteilen des Textes in zwei Elemente rechtfertigen könnte.
Ihre Idee eines "Trennzeichens" wäre perfekt umsetzbar (Sie könnten sogar einen Tab verwenden, der standardmäßig als Leerzeichen gerendert wird), aber ich bin wirklich kein Fan davon, JavaScript für rein stilistische Zwecke zu verwenden und würde es nach Möglichkeit vermeiden.
Ich wollte dasselbe vorschlagen. Ich musste dies kürzlich als Hover-Stil für einen Kunden implementieren und es funktionierte gut, bis die Zeile aufgrund der Länge von selbst umbrach/umgebrochen wurde.
Die einzige Lösung, die ich fand, war, die Bruchpunkte zu "kennen" oder explizit zu vertrauen. Wenn Sie wüssten, wo sie auftreten sollen und dass die Länge niemals dazu führt, dass das Element von selbst umbricht, funktioniert dies gut.
Wenn Sie jedoch die Bruchpunkte bereits kennen, ermöglicht das Umwickeln jedes einzelnen in einen eigenen Span mit display:block und float den Effekt mit leeren Spans oder Umbrüchen.
Wir mussten die Implementierung tatsächlich aufgeben, da der verwendete Inhalt zu dynamisch war, um zu wissen, wo die Umbrüche auftreten würden.
Ich habe die Idee ein wenig weiter gesponnen, wie Sie und @Hassan sagten. Leider bin ich kein jQuery-Guru, also hier ist, was ich mir ausgedacht habe
Das HTML
Das 
 ist tatsächlich eine neue Zeile, also denke ich, es ist sicher und soweit ich mich erinnere, sieht es in IE ziemlich gut aus; versteh mich nicht falsch, ich bin ein Mac-Typ und kann nicht testen :D
Das JavaScript
$(function(){
$("img.text-block").wrap("");
$("div.image").append("");
$.each($("div.image img.text-block").attr("alt").split("\n"), function(){
$("div.image h2").append("" + this + "</span");
});
});
Wenn es jemanden gibt, der bereit ist, dieses Durcheinander zu bereinigen (ich bin sicher, es gibt viel Raum dafür), lassen Sie es mich bitte wissen.
Es ist ein interessanter Artikel und ich muss gestehen, ich mochte schon immer die Beschriftungen auf Bildern.
Vielen Dank für das Posten.
Viele Grüße,
Vlad
Ich habe das gestern veröffentlicht – ich habe ein jQuery-Plugin für Bildüberlagerungen geschrieben, das eine ähnliche Technik verwendet, nur auf dynamischere Weise. Schauen Sie es sich hier an: http://www.ferretarmy.com/files/jQuery/ImageOverlay/ImageOverlay.html
Sehr cool, Jon! Ich habe auch darüber nachgedacht, dies zu einem Plugin zu machen, vielleicht für einen Screencast. Nicht, dass ich mich messen will oder so =) – ich finde nur, es ist ein schönes einfaches Beispiel, um das Konzept der Plugin-Erstellung zu erklären.
Das sehe ich wirklich gerne.
Hallo Jon, das ist brillant. Ich habe auch an etwas Ähnliches gedacht. Und Sie haben mir ein fertiges Ergebnis geliefert. Vielen Dank.
Was ist mit
/* für IE */
filter:alpha(opacity=60);
/* CSS3-Standard */
opacity:0.6;
Filter funktioniert in IE7/8 und der CSS3-Opacity-Standard funktioniert in allen anderen Browsern, einschließlich Opera 10. Sie können Transparenz leicht für Bilder und Hintergrundfarben anwenden. Tatsächlich hat W3 ein sehr einfaches Tutorial (von dem ich das obige übernommen habe) und erklärt, wie beide verwendet werden
http://www.w3schools.com/Css/css_image_transparency.asp
Das ist nicht ideal, da es auch den Text transparent macht.
Ist (rgba) ein Standard?
Ist es möglich, ein ganzes Div (das ein Bild als Hintergrund hat) transparent gegen das Hintergrundbild des Body-Tags zu machen?
Das ist es, was ich habe
Körper {
background:url(IMG/site/clouds.jpg) no-repeat;
……
}
#main-content {
background:url(IMG/site/trans.jpg) repeat-x bottom center;
…..
}
Es passiert nichts, wenn ich "background: rgba(0, 0, 0, 0.7);" vor den #main-content-Selektor setze. Irgendwelche Ideen?
Ich bin ziemlich sicher, dass "background: rgba(0, 0, 0, 0.7)" das Div nicht wirklich transparent macht, sondern einen transparenten Hintergrund festlegt.
Sie müssten also entweder trans.jpg in ein transparentes .png umwandeln oder "opacity:0.7;" zu #maincontent hinzufügen. Beides ist jedoch in IE problematisch (siehe Billy Whites Kommentar oben).
Ich mag das Aussehen des Textblocks über dem Bild. Sieht sehr sauber aus.
Sehr cool. Mir gefällt das Aussehen und das Design.
Vielen Dank, sehr nützlich.
Ich verwende diese Technik für Karten. Wenn Sie möchten, dass die Legende einer Karte klickbar ist, legen Sie ein Kartenbild (das nur die Konturen, aber keine Legende enthält) als Hintergrund eines relativen Divs und eine ungeordnete Liste innerhalb des Divs. Die ul enthält alle Kartenpunkte und Städte. Jedes Listenelement sollte eine ID haben und absolut positioniert sein. Zum Beispiel: Wenn Sie eine Karte der USA haben, legen Sie Seattle 5px oben und links und Boston 5px oben und 200px links usw.
Sollte etwas wie das nicht für die IE666-Transparenz funktionieren?
Ha! Ein tatsächlicher CSS-Artikel! Gut gemacht.
Ist das nicht möglich, indem man den z-index des überlappenden Textes setzt und kein JavaScript verwendet?
Wie bekomme ich die Breite der Textüberlagerung gleich der Breite des Divs, in dem sie sich befindet, da Spans Inline-Elemente sind?
Irgendwelche Ideen?
Verwenden Sie einfach die Spans gar nicht, sondern gestalten Sie das h2 so, wie die Spans es tun. Der Grund, warum Spans überhaupt verwendet werden, ist, damit sie nicht die gesamte Breite einnehmen.
Chris, vielen Dank für Ihre Antwort darauf.
Die Methode, die ich zuvor ausprobiert hatte, war einigermaßen ähnlich, aber ich konnte den Hintergrund nicht um den Text herumwickeln. Erwarten Sie bald einen Blogbeitrag von mir, in dem ich die Links teile.
Hallo Chris,
Das ist ein toller Trick. Ich habe vor etwa einem Jahr mit Webdesign angefangen und Ihre Videotutorials haben mir sehr geholfen. Ich mag diesen Text-über-Bild-Trick besonders. Ich bin sicher, ich werde ihn für einige Bilder für meine Freunde zu Hause verwenden…
Danke
Sehr praktisch. Danke für das Posten.
Zuerst einmal ein schönes neues Kommentar-Ding! Ich weiß, es ist keine große Sache, aber ich schätze diese kleinen Änderungen immer und man bemerkt sie eine Weile.
Cooler Beitrag, nichts Neues, aber ich benutze diese Technik (position absolute in relative) immer, um Play-Icons auf Thumbnails und Ähnliches zu legen, und es funktioniert großartig.
Ich denke, man kann auch negative Margins verwenden, um den gleichen Effekt zu erzielen, und ich bin mir ziemlich sicher, dass jeder Browser gleich darauf reagieren würde und es weniger Markup gäbe (hoffentlich), obwohl es meist ein Hack ist, und als ich Ihren Beitrag sah, sagte ich mir nur: "position absolute, auf jeden Fall).
Ich habe das auf meiner Website erfolgreich zum Laufen gebracht, auf eine leicht andere Weise. Diese Version verwendet kein jQuery oder Spans, sieht aber auch nicht genau gleich aus.
http://paradoxdgn.com
Beachten Sie die 2. Folie im Scroller oben, sie zeigt eine mehrzeilige Version.
Die einzigen Änderungen, die ich vorgenommen habe, waren der Ersatz von <h2><span> durch ein einziges <div>, dann ein paar Anpassungen an der CSS, um sie mit der neuen Änderung funktionsfähig zu machen.
Schöner Beitrag wie immer. Obwohl Sie sagten, dass dies möglicherweise zu einfach sei, war es sicherlich lohnenswert, da ich ein paar Dinge gelernt habe, wie die Verwendung von jQuery zur Bereinigung des Codes und rgba mit dem Alphakanal.
Wenn ich die Kommentare lese, sehe ich, dass es in IE nicht funktioniert. Nun, ich muss sagen, ich bin schockiert! nicht!
Hallo!
Ich versuche, dieses Tutorial zu verwenden, aber als ich die Funktion in meine functions.php eingefügt habe… als ich das nächste Mal eine meiner Seiten besuchte, kam dies:
Parse error: syntax error, unexpected ‘(‘, expecting T_VARIABLE or ‘$’ in /home/another8/public_html/mock-heroic.net/wp-content/themes/thematicpowerblog/functions.php on line 28
Was mache ich falsch?
Übrigens versuche ich, es mit WordPress zu verwenden, darum geht es.
Ich muss einfach sagen: eine so schlimme Verwendung von h2! Das sollte doch kein Header sein, oder?
Ich habe sinnvollere Markup in einem Blogbeitrag mit dem Titel Captions over images vorgeschlagen.
Guter Stil
Gute Arbeit.. Danke
Hallo!
Ich habe nach so etwas gesucht. Aber ich bin mir nicht sicher, ob Sie es bemerkt haben, aber auf der Demo-Seite gibt es eine schwarze Linie zwischen den beiden Textzeilen. Und ich konnte keinen Weg finden, das zu beheben.
Irgendwelche Ideen?
Mit freundlichen Grüßen,
Andor Nagy
Hallo,
Ich versuche, den Trick mit einer Diashow anzuwenden… aber es funktioniert nicht auf meiner Seite.
http://www.masduprieure.com/test/
Die Beschriftung bleibt hinter der Diashow.
Ich weiß nicht, wie ich die Beschriftung in den Vordergrund bringen kann?
Mit freundlichen Grüßen
Alexandra
Ich habe das auf meiner Website ausprobiert und es hat wunderbar funktioniert. Aber leider wurde das CSS auf ALLE meine h2s auf der Seite angewendet. Was muss ich tun, um es einzugrenzen und nur auf das eine h2 zu beschränken?
Danke!
Fügen Sie eine separate Klasse für h2 hinzu, die Sie ändern möchten, z. B. wenn Sie CSS für
schreiben, wirkt es sich nur auf dieses h2 aus.
Hallo – ich versuche etwas sehr Ähnliches, möchte aber, dass das Bild rechts ausgerichtet ist, mit der Textbox (wenn man so will) links ausgerichtet. Und dann möchte ich, wenn möglich, dass die Textbox die gesamte Breite des Containers einnimmt. Wenn der Container beispielsweise 900 Pixel breit ist und das Foto 600 Pixel breit ist, soll die schwarze transparente Box die gesamten 900 Pixel Breite einnehmen.
Entschuldigung für die lange Erklärung – irgendwelche Vorschläge?
Danke!
Ich habe eine Frage dazu. Ich ziehe einen Posttitel über ein Feature-Bild in einem Slider. Ich habe eine Klasse angewendet, die den Titel in zwei Zeilen umbricht, indem sie die Zeilenbreite begrenzt. Mein Span funktioniert, hat aber das hässliche Abstandsproblem. Da ich in PHP keine weiteren Spans hinzufügen kann, was mache ich, um das hässliche ästhetische Problem zu beheben?
.title {
z-index: 20;
position: relative;
top: 255px;
width: 15em;
margin-top: -85px;
line-height: 1.75;
}
h1 span {
farbe: #fff;
background: rgb(0, 0, 0); /* fallback color */
background: rgba(0, 0, 0, 0.7);
padding: 10px;
margin: 0px;
}