Ich habe neulich eine Werbung gesehen, in der diese Buchstaben über einen schwarzen Bildschirm geflogen kamen und ein Bild darunter enthüllten. Es war ein ziemlich cooler Effekt und erinnerte mich daran, wie WebKit diese coole Eigenschaft `-webkit-background-clip` hat, mit der man Hintergründe durch Text zeigen kann. Also machte ich mich daran zu sehen, ob ich etwas Ähnliches machen könnte. Das ist möglich, aber es gibt einige interessante Stolpersteine...
Das ist das Endergebnis

Demo ansehen Dateien herunterladen
Dies wird nur in WebKit-Browsern (Safari, Mobile Safari, Chrome) richtig aussehen. Der Download enthält nicht die schicke Schriftart (siehe unten).
Knockout-Grundlagen
Es steckt nicht viel dahinter
.display-sweet-image-behind {
/* fallback color */
color: white;
/* overrides color with nothingness */
-webkit-text-fill-color: transparent;
/* remember non WebKit browsers will see all of this EXCEPT the text */
background: url(images/zombies-making-out.jpg) no-repeat;
/* the magic */
-webkit-background-clip: text;
font: bold 100px Impact, Sans-Serif;
}
<div class="display-sweet-image-behind">Nom nom nom</div>
Buchstaben verschieben
Es stellt sich heraus, dass es absolut in Ordnung ist, wenn man die Buchstaben in `span`-Tags einschließt, so wie hier
<div class="display-sweet-image-behind">
<span>N</span>
<span>o</span>
<span>m</span>
nom nom
</div>
Die Buchstaben werden immer noch ausgeschnitten und alles ist gut. Es sind nicht nur `span`-Tags, sondern dass man sie in ein Inline-Level-Element einschließt. Wenn man `inline-block` oder `block` oder etwas anderes verwendet, funktioniert der Ausschnitt nicht mehr. =(
Da die `span`-Tags funktionieren, könnte man meinen, wir könnten sie mit relativer Positionierung verschieben. Mega Spaß!
.display-sweet-image-behind span {
position: relative;
}
.display-sweet-image-behind span:nth-child(1) {
top: -20px;
left: -20px;
}
Der obige Code würde den ersten Buchstaben nach oben und links verschieben. Aber nein! Fehlschlag! Irgendetwas an der Positionierung lässt den Ausschnitt fehlschlagen. Doppelt =( =(.
Als Test habe ich versucht, Ränder (`margin`) für diese `span`-Tags zu verwenden, und das ist erlaubt, also Halleluja, das reicht für den Spaß mit Animationen. Obwohl, da dies Inline-Elemente sind, haben wir nur linken und rechten Rand, oben und unten haben keine Auswirkung.
.display-sweet-image-behind span:nth-child(1) {
margin-left: -100px; /* remember this will yank all the letters over this far */
}
Lettering.js
Also ja, muss man jeden einzelnen Buchstaben manuell in einen `span` einschließen? Nein, das ist was für Verlierer. Lettering.js ist ein jQuery-Plugin, das genau das tut. Wortwörtlich. Man ruft es auf einem Satz von Elementen auf und es schließt jeden einzelnen Buchstaben in einen `span` mit einer Klassenbezeichnung ein, die seine Position referenziert.
$(".display-sweet-image-behind").lettering();
Super einfach, super cool. Ich hätte darauf kommen sollen.
Animieren
Das Hauptziel hier ist, dass sich die Buchstaben selbst an ihren Platz animieren. Hier ist also unser Markup für das endgültige Beispiel
<div id="poster">
<h1>Red Sonja</h1>
<p>Coming 2011</p>
</div>
Wir werden alle Buchstaben mit Lettering.js mit einer Zeile JavaScript in `span`-Tags einfügen
$("#poster h1, #poster p").lettering();
Für die Knockout-Buchstaben geben wir ihnen eine Übergangszeit (`transition`), damit sich alle Eigenschaften, die sich ändern, animieren. Nur WebKit-Browser haben den Knockout, aber wir könnten die Buchstaben genauso gut gleich behandeln.
#poster h1 span {
-webkit-transition: all 2.5s;
-moz-transition: all 2.5s;
-o-transition: all 2.5s;
}
Die von Lettering.js angewendeten Klassen sind `char1`, `char2` usw. Wir werden also diese Klassen verwenden, um große Ränder anzuwenden und die Buchstaben irgendwie von der Seite wegzuschieben.
#poster h1 span.char1 { margin-left: -1450px; }
#poster h1 span.char2 { margin-left: 200px; }
#poster h1 span.char3 { margin-left: 200px; }
#poster h1 span.char5 { margin-left: 1450px; }
#poster h1 span.char6 { margin-left: 200px; }
#poster h1 span.char7 { margin-left: 200px; }
#poster h1 span.char8 { margin-left: 200px; }
#poster h1 span.char9 { margin-left: 200px; }
Wir werden eine kurze Verzögerung vor dem Start der Animation wählen. Dies gibt Lettering.js eine Chance, seine Sache zu machen und die schicke Schriftart zu laden. Außerdem ist dies eine Art "Erlebnis"-Effekt, bei dem das Warten einer Sekunde die Spannung erhöht.
Wir werden einfach eine Sekunde warten und dann dem `html`-Element eine Klasse hinzufügen.
setTimeout(function() {$('html').addClass("step-one");}, 1000);
Wir werden diese Klassenbezeichnung verwenden, um all die Ränder, die wir gesetzt haben, zu überschreiben und sie auf Null zurückzusetzen, sodass die Buchstaben wieder an ihrer natürlichen Position sind.
.step-one #poster h1 span { margin: 0; }
Die anderen Buchstaben in der Demo verwenden ebenfalls die Lettering.js `span`-Tags und machen ihre Animation über CSS-Übergänge und verzögert angewendete Klassen, nur dass sie keine Knockouts sind. Da sie keine Knockouts sind (nur weißer Text), **können** wir `position: relative` verwenden.
Lassen Sie uns zufällig ihre Position festlegen und dann "Schritt Zwei" der Animation ein paar Sekunden später stattfinden lassen, wo eine Klassenbezeichnung sie zurück an ihren Platz bewegt.
$("#poster p span").each(function() {
$(this).css({
top: -(Math.floor(Math.random()*1001)+1500),
left: Math.floor(Math.random()*1001)-500,
});
});
setTimeout(function() {$('html').addClass("step-two");}, 3000);
Diesmal müssen wir `!important`-Regeln verwenden, da jQuery die CSS-Werte mit Inline-Styling anwendet, und `!important` ist erforderlich, um dies zu überschreiben.
.step-two #poster p span {
top: 0 !important;
left: 0 !important;
}
Zusammenfassung
Falls Sie neugierig sind, die hier verwendete Schriftart ist Newcomen, erhältlich auf Typekit.
Auch wenn der Rand nur den linken und rechten Rand beeinflussen konnte, kam die Auf- und Ab-Animation von der Animation des oberen `padding` des Elternelements. Trickreich.
Oh, und ich habe keine Ahnung, ob sie Red Sonja wirklich neu verfilmen werden oder nicht. Es scheint ein Gerücht zu sein.
Wirklich großartig, guter Tipp für Landing Pages im Bau.
hahaha, hat meinen Tag gemacht!
Jetzt braucht es nur noch einen "Animation überspringen"-Button. ;) Im Ernst, das sieht wirklich gut aus.
Das ist eher lustig als cool. Es versetzt mich zurück in die Flash5-Zeiten.
Ich weiß nicht, was die Reaktion wäre, wenn man so etwas einem Kunden präsentieren würde. Ich schätze ein gutes Schmunzeln.
Sie würden Ihrem Kunden sagen
1) Es ist ganz normales semantisches HTML. Das bedeutet, es ist suchmaschinenfreundlich und für jeden zugänglich.
2) Der Text ist leicht zu aktualisieren, da es buchstäblich nur Webtext ist.
3) Die Hintergrundgrafik ist leicht zu aktualisieren, da es nur ein normales JPG ist.
4) Nicht jeder Browser erhält die gleiche Erfahrung, aber für jeden Teil gibt es Fallbacks, sodass es für alle decent ist.
Dann würden Sie und Ihr Kunde sich köstlich darüber amüsieren, wie großartig es ist und wie weit das Web in so kurzer Zeit gekommen ist.
haha Chris, ich liebe deine Antwort hier.
Ich sprach von Performance und Qualität. Schlechte Bildrate, Text als Maske ohne Kantenglättung und so weiter. Das ist etwas, das man nicht mit gültigem Code und semantischem HTML verkaufen kann.
Ich denke, das wäre eine vollkommen gültige Methode, wenn Ihr Kunde eine solche Animation wünscht. Ich persönlich würde diese Methode gegenüber Flash bevorzugen.
Haben Sie in Erwägung gezogen, Transforms für die Animation zu verwenden, anstatt des `setTimeout`-Ansatzes? Die aktuelle Animation ist auf dem iPad extrem ruckelig, aber ich glaube, eine CSS 3D-Translate-Transition wäre flüssig...
Entschuldigung – du meine Güte, Sie verwenden bereits Übergänge, ich habe den Quellcode nicht genau genug gelesen. Aber Sie verwenden keine 3D-Übergänge, also nutzen Sie keine Hardwarebeschleunigung, was vielleicht der Grund für die Ruckeligkeit ist...?
Hier passiert nichts 3D-mäßiges... Obwohl ich 3D-Transforms noch nicht viel erforscht habe. Wenn Sie mehr wissen, können Sie diese Demo gerne erweitern und uns coole Erweiterungen der Idee zeigen.
Der Sinn der Verwendung von 3D für iOS besteht darin, die Hardwarebeschleunigung zu aktivieren. Normale 2D-Translate-Transforms nutzen die Beschleunigung nicht und sind daher auf iOS SEHR langsam.
Ich bin mir nicht sicher, wer das zuerst entdeckt hat, aber ich habe es von Thomas Fuchs gelernt und kann es mit unserem eigenen Code absolut bestätigen: http://mir.aculo.us/2010/06/04/making-an-ipad-html5-app-making-it-really-fast/
*Beachten Sie die Verwendung davon, da Mobile Safari etwas mit der Speicherzuweisung herumspielt – die 6,5-MB-Grenze gilt immer noch, aber mit 3D-Transforms haben Sie jetzt eine weitere Speicherzuweisungsgrenze, die einen harten ABSTURZ des Browsers erzwingt, wenn Sie sie überschreiten. Es reicht nicht aus, einfach die Quelle der Bilder zurückzusetzen, Sie müssen das DOM-Element, das Sie transformieren, auslöschen, um den Speicher zu löschen.
Sie verwenden einfach `-webkit-transform3d: translate(x,y,0)` anstelle von `-webkit-transform:translate(x,y)`, um die Hardwarebeschleunigung zu erhalten (anscheinend!).
Ich wollte schon lange eine Testseite erstellen, um zu sehen, ob dies in iOS4+ gleich ist.
Also können wir es entweder so machen und dann unzählige Hacks erstellen, um all die Browser zu berücksichtigen, die es nicht richtig rendern können, oder wir können einfach ein einzelnes Bild erstellen und das Bild aktualisieren, wenn wir es brauchen. Stimmt das ungefähr?
Sie sprechen also von einem animierten GIF? Wenn Sie ein neues animiertes GIF schneller erstellen können als ich dieses hier aktualisieren und es eine akzeptable Dateigröße hat, dann ja, denke ich, könnten Sie das tun. Ansonsten ist dies weitaus flexibler und hat eine kleinere Dateigröße.
Außerdem geht es hier um Möglichkeiten, Lernen und neue Technologien und nicht um spezifische Anwendungsfälle. Jeder spezifische Anwendungsfall muss für sich selbst bewertet werden.
Korrekt, ein animiertes GIF oder (gasp) Flash. Da Sie Hacks für verschiedene Browser benötigen würden, damit es funktioniert, sehe ich keinen Vorteil darin, die von Ihnen beschriebene Methode zu verwenden, abgesehen von einer möglicherweise reduzierten Dateigröße.
Ich bin ganz für das Erlernen neuer Technologien, aber das hier scheint nur eine seltsame Art zu sein, es zu tun.
Wir könnten genauso gut Multimedia-CD-Präsentationen per Post verschicken, dann können wir sicher sein, dass sie es richtig rendern :)
Diese Art von Technik funktioniert nur in modernen Browsern (Webkit + Firefox 4). Wenn dies also in Produktion verwendet würde, würde man die Animation einfach für ältere Browser weglassen. Wenn wir weiterhin Code für die am wenigsten fähigen Browser schreiben, wird das Web jahrelang gleich bleiben – wir müssen innovativ sein!
@Rich, Sie verwechseln den Wunsch zu innovieren mit der Notwendigkeit, Hacks und Workarounds für eine noch nicht vollständig entwickelte Technologie zu entwickeln. Nach Ihrem CD-Mailing-Beispiel sollte ich auch eine Papierkopie senden, wenn jemand keinen Computer hat.
Wirklich cool. Ein Call-to-Action-Button oder Einstieg: bereit für eine Landingpage für Fotografen... danke.
Es ist erstaunlich für mich, all diese relativ "neuen" Webtechnologien (jQuery, CSS3, etc.) zusammenkommen zu sehen, um Erlebnisse wie dieses zu schaffen. Seitdem ich vor 6 Jahren angefangen habe, HTML und CSS zu lernen, scheint die Geschwindigkeit, mit der sich Webtechnologie entwickelt, exponentiell zu sein. Ich wünschte fast, die Dinge würden sich ein wenig verlangsamen, damit ich mithalten kann.
Es wird immer schwieriger zu definieren, was ein Webdesigner eigentlich ist. Er könnte visuelles Design, Frontend-Coding, UX usw. umfassen. Früher hat ein Webdesigner alles gemacht. Aber da das Web komplexer geworden ist, stellen wir fest, dass einzelnen Personen bestimmte Rollen zugewiesen werden. Da HTML5 und CSS3 weiter expandieren, frage ich mich, wie viel weiter die Rollen aufgeteilt werden, um die Zunahme an Wissen und Zeit zu berücksichtigen, die für die Erstellung des Webs erforderlich ist.
animationpasst besser dazuOff-Topic, aber von Interesse: Sie sollten Ihr Scripting auf der Homepage überprüfen. Ich habe bei der Arbeit IE7, und in diesem Browser wird der gesamte Hauptinhalt nicht angezeigt, bis ich zum Latest Screencast scrolle. IE wirft auch eine Meldung "Fehler auf der Seite" aus. Es ist ein eingeschränktes System und ich kann nicht in die Einstellungen gehen, um etwas zu untersuchen, sonst könnte ich vielleicht mehr sagen. Es ist ein konsistenter Fehler, der jedes Mal auftritt, wenn ich die Seite lade. Es ist durchaus möglich, dass das Problem bei mir liegt, obwohl ich JS aktiviert habe. Ich wollte Ihnen nur Bescheid geben.
Einfache Lösung: Konzentrieren Sie sich auf die Arbeit, wenn Sie bei der Arbeit sind, und haben Sie Spaß zu Hause mit WebKit-basierten Browsern :)
Amit, das stimmt zwar, aber Chris verliert Zuschauer mit IE7 und 6 (ich habe 6 zu Hause zum Testen, und es funktioniert auch in diesem Browser nicht). Funktioniert in 8 und, nehme ich an, 9.
jQuery ist nett, aber Ihr Beispiel ist auf meinem Computer nicht sehr flüssig.
danke
Mit Firefox gebe ich an ...
Schöner Effekt mit jQuery. Warum macht Firefox nicht mit und lässt das in ihrem Browser funktionieren. Funktioniert einwandfrei in Safari.
Es sollte in Firefox 4 funktionieren
Funktioniert ausgezeichnet im Safari-Browser.
Das ist fantastisch Chris, ich kann es kaum erwarten, es auszuprobieren :)
Danke :)
Ich finde das einfach großartig. Stilvoll, aber leichtgewichtig und sehr schnell herunterzuladen. Ich hoffe, in Zukunft mehr von so etwas zu sehen.
Liebe es! Tolle Arbeit, Chris.
Großartige Arbeit… wunderschönes Denken, wirklich cool, ersetzt Flash mühelos… ich würde gerne mehr coole Dinge von Ihnen sehen..
Flash wird nicht mehr existieren… Ich schätze.