Sie kennen CSS Sprites, richtig? Sie sind fantastisch, wenn Sie sowohl die Höhe als auch die Breite des Elements kennen, auf das Sie sie anwenden, da Sie dann ein sehr kompakt zusammengeschobenes Sprite-Bild erstellen und sehr genaue Koordinaten verwenden können, um genau den Teil anzuzeigen, den Sie möchten.
Sprites sind auch sehr nützlich, wenn Sie *entweder* die Breite oder die Höhe des Elements kennen. In diesem Fall richten Sie alle Ihre Sprites in dieser bekannten Richtung aus. Angenommen, Sie kennen die Breite – Sie können sie anhand ihrer X-Koordinate und Breite referenzieren, aber sich keine Sorgen machen, dass eine unbekannte/veränderliche Höhe versehentlich andere Bilder enthüllt.

Sprites versagen, wenn Sie sie auf einem Element verwenden möchten, dessen Breite oder Höhe Sie nicht kennen können. Denken Sie an ein Absatz-Element (<p></p>). Möglicherweise haben Sie ein flüssiges Layout, sodass Sie sich nicht auf die Breite verlassen können1, und Absätze können beliebig viele Wörter enthalten, sodass Sie sich nicht auf die Höhe verlassen können. Aber Sie wünschen sich trotzdem, ein Bild aus Ihrem Sprite darauf verwenden zu können.

In diesem Szenario benötigen Sie ein Element, in das Sie eine Breite/Höhe/beides einfügen können, um den Sprite darauf anzuwenden. Sie könnten denken
<p>
<span class="star"></span>
Lorem ipsum...
</p>
Dann könnten wir den span verwenden, um den Stern anzuwenden.
.star {
/* Size of star within sprite */
width: 24px;
height: 24px;
/* Sprite */
background: url(sprite.png) -24px 0 no-repeat;
/* Position/Spacing */
float: left;
margin: 0 10px 2px 0;
}
Aber dieser Stern, den wir anzuwenden versuchen, ist rein ästhetisch und daher wäre es am besten, dafür keine dedizierte Markup zu verwenden. Lassen wir ihn weg und verwenden stattdessen ein Pseudo-Element! Pseudo-Elemente sind die perfekte Antwort, wenn Sie ein Element benötigen, um damit auf der Seite zu arbeiten, aber keine zusätzliche Markup möchten.
Wir geben dem Absatz die Klassenbezeichnung (wahrscheinlich ohnehin semantischer)
<p class="star">
Lorem ipsum...
</p>
Und verwenden ein CSS-Pseudo-Element (:before), um ein Element mit bekannter Breite und Höhe hinzuzufügen, auf das das Bild angewendet werden kann
.star:before {
/* Empty content, but required for pseudo element to display */
content: "";
/* Size of star within sprite */
width: 24px;
height: 24px;
/* Sprite */
background: url(sprite.png) -24px 0 no-repeat;
/* Position/Spacing */
float: left;
margin: 0 10px 2px 0;
}

Ein anderer Weg?
Eine weitere mögliche Methode, um mit dem Szenario unbekannter Höhe/Breite umzugehen, ist das diagonale Anordnen von Sprites (eine Technik, die ich zuerst von Aaron Barker gesehen habe). Auf diese Weise können Sie einen einzelnen Sprite quasi "herausschneiden", auch wenn das Elternelement unbekannte Breite und Höhe hat.

Das ist clever, hat aber einige ziemlich erhebliche Nachteile.
- Die Abmessungen (und wahrscheinlich die Dateigröße) des Sprites sind garantiert größer als bei Sprites in einer einzigen Reihe oder besser, zu einem kompakten Quadrat zusammengeschoben.
- Die oben gezeigte Diagonale funktioniert, wenn Sie das Bild in der oberen linken oder unteren rechten Ecke positionieren möchten, aber nicht in der oberen rechten oder unteren linken (oder irgendwo anders).
Die Pseudo-Element-Methode hat keine dieser Nachteile.
Verwandt
Gleich und gleich gesellt sich gern. Rick Harris hat einen ähnlichen Artikel: Sprites and CSS Pseudo Elements.
1 Selbst wenn Sie sich auf die Breite eines Absatzes verlassen könnten, ist die Verteilung Ihrer Sprites über die gesamte Breite eines Absatzes unpraktisch und widerspricht der Kernidee von Sprites: Effizienz.
Toller Artikel. Er hat genau das artikuliert, was ich in letzter Zeit immer häufiger selbst tue. Gibt es irgendetwas, das Pseudo-Elemente nicht können?
In IE<8 funktionieren.
Per CSS-Übergängen in Webkit animiert werden.
Großartig, danke!
Wenn Sie einen Sprite für die obere rechte oder untere linke Ecke benötigen, können Sie die Icons einfach auf eine andere Diagonale legen (von der oberen linken zur unteren rechten Ecke).
Gute Verwendung von Pseudo-Elementen... ein paar Anpassungen/Ergänzungen, falls jemand daran interessiert ist, Textumbrüche zu verhindern!
Ich verwende aus genau diesem Grund seit einiger Zeit diagonale Sprites. Wenn Sie Sprites auf Elementen verwenden, die nicht die feste Größe des Bildes haben (wie z. B. li), müssen Sie berücksichtigen, dass der Inhalt umbricht oder sich unerwartet ausdehnt.
Ich habe diese Technik entwickelt, nachdem ich meine statischen Vorlagen in Staging-Sites mit CMS's mit Kundeninhalten gesehen habe, die die Grenzen traditioneller Sprites aufdecken würden. Bis man auf so etwas stößt, erkennt man in der Regel nicht die Notwendigkeit besserer Sprites.
Hallo Bainton! Kleine Welt...
Hmm, das hätte "(wie z. B. li's)" heißen sollen.
https://css-tricks.de/9189-browser-support-pseudo-elements/
Lieber Weihnachtsmann. Zu Weihnachten wünsche ich mir dieses Jahr unbegrenzt viele Pseudo-Elemente. Danke.
Gute Verwendung dort, kämpfen Sie diesen guten Kampf, halten Sie diese Markup unten.
Das ist eine wirklich tolle Idee, danke dafür!
Auch diagonale Sprites scheinen in bestimmten Situationen cool zu sein.
Ein wirklich schönes Beispiel.
Eine Sache, die man bedenken sollte – übertreiben Sie es nicht mit der Anzahl der Icons in Ihrem diagonalen Sprite. Alle Sprite-Bilder haben das Speicherproblem aufgrund von verschwendetem Weißraum, aber bei diagonalen Sprites wird es quadriert.
Im Beispiel sind die Icons 24×24, sodass der resultierende (unkomprimierte) Sprite 24*24*n*n Pixel groß sein wird. Wenn jedes Pixel 4 Bytes (RGBa – obwohl ich es selbst nicht getestet habe [1]) sind, können 20 Icons fast 1 MB RAM kosten. 40 Icons kosten fast 4 MB RAM. Fügen Sie 10 weitere Icons hinzu und Sie können das iPhone Safari effektiv lahmlegen [2].
Hinweis: Ich befürworte Sprites nicht. Ich sage nur, übertreiben Sie es nicht mit diagonalen ;)
[1] http://blog.vlad1.com/2009/06/22/to-sprite-or-not-to-sprite/
[2] http://cubiq.org/testing-memory-usage-on-mobile-safari
Ja, ich finde diese Technik recht praktisch, wenn man keine leeren
span-Elemente verwenden möchte oder muss. Ich habe diese Technik in einen Artikel über CSS-Hintergrundbild-Hacks aufgenommen – http://nicolasgallagher.com/css-background-image-hacks/Ziemlich lahm von Chris, dir die Technik nicht anzurechnen.
Ja, Nicolas war definitiv der Erste. Ich habe ehrlich gesagt nicht gesehen (oder mich zumindest nicht daran erinnert, ob ich es gesehen habe), dass sein Artikel diese Technik enthielt. Nun, zumindest habe ich es auf eine andere und originelle Weise aufgeschrieben und das Wort über diese super nützliche Technik ein bisschen verbreitet.
Ja, ich verwende diese Technik ziemlich häufig. Besonders für nicht-kritische ästhetische Verzierungen, die das Layout nicht beeinträchtigen oder deaktivieren, wenn sie in älteren Browsern, die Pseudo-Elemente nicht unterstützen, nicht angezeigt werden.
Eine Sache, die man jedoch beachten sollte. Wenn Sie eine clearfix-Methode verwenden, die das ::after-Element mit visibility:none verwendet, müssen Sie diese Sichtbarkeitseinstellung möglicherweise überschreiben, sonst sehen Sie das Element gar nicht. Dieses Problem trieb mich vor ein paar Monaten stundenlang in den Wahnsinn!
Ich habe einen Artikel über etwas Ähnliches geschrieben, mit einem Hack für den Internet Explorer.
http://coding.smashingmagazine.com/2011/03/19/styling-elements-with-glyphs-sprites-and-pseudo-elements/
Beeinträchtigt das wiederholte Aufrufen von background: url die Leistung?
Ich dachte, der beste Teil eines Sprites sei, dass man ihn nur einmal aufrufen und dann background-position für den Rest verwenden müsse?
Danke für alle Ratschläge, die Sie mir geben können.
Ein Vorteil dieser Technik wäre bei RTL-Sprach-Stylesheets. Es ist ziemlich unmöglich oder sehr schwierig, Sprites in RTL-Stylesheets zum Laufen zu bringen. Die Verwendung von Pseudo-Elementen macht es sehr einfach.
Danke Chris!
Ich habe die CSS-Sprites-Methode und die Pseudo-Sprites-Methode in 30 Minuten gelernt. Ich kann nicht glauben, dass ich mich immer davor gedrückt habe, insbesondere bei CSS-Sprites... Ich werde sie auf jeden Fall bald verwenden.
Charbs
Lustig... Das habe ich schon immer so gemacht, ich dachte, das sei einfach gesunder Menschenverstand.
Interessanter Artikel. Nun, Sprites oder Data URIs... Entscheidungen, Entscheidungen :-)
Genug Verbesserung, um die Nicht-Unterstützung von IE7 oder dessen Polyfilling zu rechtfertigen!
Wir können auch die CSS-Clip-Eigenschaft verwenden, um das benötigte Bild in einem Sprite präzise zu lokalisieren.
clip: { shape | auto | inherit } ;
Guter Artikel: http://www.ibloomstudios.com/articles/misunderstood_css_clip/
Wow! Das ist sehr hilfreich! Das ist es, was ich immer mit dem Span-Syntaxproblem bei der Positionierung von Bullet-Points oder Icons im Text von Boxen hatte. Sie haben mein Problem gelöst, dank dieser wunderschönen Tricks, vielen Dank.
Bester Beitrag des Jahres!
Ich liebe das? Sehr exzellent in der Tat. Ich erinnere mich nur an die umfangreichen Sprites, die ich früher erstellt habe; die einzige Möglichkeit, einen Sprite im obigen Szenario zu verwenden, war, ihn in der oberen linken Ecke zu platzieren und eine lächerlich negative Hintergrundposition zu verwenden.
Intelligente Verwendung von Pseudo-Elementen, gefällt mir sehr!
Ich habe gestern meinen ersten Sprite verwendet und diesen Artikel im Smashing Network gefunden.
Ich bin so froh, ihn gefunden zu haben, weil ich nicht glücklich damit war, ein zusätzliches, bedeutungsloses Span zu verwenden :)
Performance UND Semantik, ich bin dabei!!! ;)
Wir haben vor einiger Zeit all unsere Sprites geändert... das hilft bei der Seitengeschwindigkeit.
Mehr für einen Programmierer als für einen Designer!
Es wäre interessant, einen 'background'-Modifikator wie 'no-repeat' zu haben, um diese Einschränkung zu umgehen und solche Tricks zu vermeiden.
Beispiel
background: url(sprite.png) -24px 0 no-repeat crop;
Der gesamte Bereich um den zugeschnittenen Bereich könnte mit 'background-color' gefüllt werden.
Exzellentes Tutorial, sehr gut gemacht, danke.
gute Arbeit. Suche nach anderen CSS-Tutorials. Danke fürs Teilen.
Ich habe einige Probleme mit Sprites und kann einige Dinge einfach nicht verstehen. Die Tutoria, die ich gesehen habe, sind informativ und ich kenne den Hintergrund von Sprites, warum sie vorteilhaft sind usw. Es gibt ein paar Dinge, die mich immer noch verwirren, aber das Wichtigste ist: Wie ersetzen die Sprites ein bestehendes Menü? Alle Tutoria, die ich gesehen habe, erstellen ein neues Menü oben und links (oder rechts) von der Seite. Ich sehe keine, die eine bestehende Website bearbeiten und die aktuelle Navigation durch die neue gespriteten Navigation ersetzen.
Ich wäre für jede Hilfe dankbar. Sie alle sprechen aus erfahrener Perspektive und das ist für Sie ein Kinderspiel, aber als neuer, begeisterter und ehrgeiziger Designer kann mir jemand eine verständliche Richtung für einen Neuling wie mich weisen. Vielen Dank!
Ich habe vergessen zu erwähnen, dass ich fast immer WP verwenden werde. Wie funktioniert das mit dem grundlegenden Layout, das sie mir geben, oder mit irgendeinem Layout? Ist die Verwendung von WP für ein gespritetes Navigationsmenü anders als bei DW oder ähnlichem?
Das ist eine fantastische Technik. Ich liebe die Art und Weise, wie sie funktioniert, und sie macht die Verwendung von Sprites so viel einfacher.