Dieser Artikel wurde seit seiner Erstveröffentlichung im Jahr 2007 mehrmals überarbeitet und neu geschrieben, um die Informationen aktuell zu halten. Die jüngste Überarbeitung wurde von Flip Stewart im Januar 2015 vorgenommen.
Was sind CSS Sprites?
Spoiler-Alarm: Es sind keine Feen, die deine Stylesheets für dich schreiben. Ich wünschte. Kurz gesagt: CSS Sprites sind eine Methode, um mehrere Bilder in einer einzigen Bilddatei für die Verwendung auf einer Website zu kombinieren, um die Leistung zu verbessern.
Sprite mag wie eine kleine Fehlbezeichnung erscheinen, wenn man bedenkt, dass man ein großes Bild erstellt, anstatt mit vielen kleinen zu arbeiten, aber die Geschichte der Sprites, die bis ins Jahr 1975 zurückreicht, sollte die Dinge klarstellen.
Zusammenfassend: Der Begriff „Sprites“ stammt von einer Technik in der Computergrafik, die am häufigsten in Videospielen verwendet wird. Die Idee war, dass der Computer eine Grafik in den Speicher laden konnte und dann nur Teile dieses Bildes auf einmal anzeigte, was schneller war, als ständig neue Bilder laden zu müssen. Das Sprite war die große kombinierte Grafik.
CSS Sprites basieren auf derselben Theorie: Lade das Bild einmal, verschiebe es und zeige nur Teile davon an. Dies reduziert den Aufwand, mehrere Bilder laden zu müssen.
Warum CSS Sprites verwenden?
Es mag kontraintuitiv erscheinen, kleinere Bilder in ein größeres Bild zu stopfen. Würden größere Bilder nicht länger zum Laden brauchen?
Schauen wir uns einige Zahlen an einem tatsächlichen Beispiel an
| Bild | Dateigröße | Dimensionen |
|---|---|---|
| canada.png | 1.95KB | 256 x 128 |
| usa.png | 3.74KB | 256 x 135 |
| mexico.png | 8.69KB | 256 x 147 |
Das ergibt eine Gesamtgröße von 14.38KB zum Laden der drei Bilder. Die drei Bilder in einer einzigen Datei wiegen 16.1KB. Das Sprite ist letztendlich 1.72KB größer als die drei separaten Bilder. Das ist kein großer Unterschied, aber es muss einen guten Grund geben, diese größere Datei zu akzeptieren ... und den gibt es!
Während die Gesamtbildgröße (manchmal) mit Sprites ansteigt, werden mehrere Bilder mit einer einzigen HTTP-Anfrage geladen. Browser begrenzen die Anzahl der gleichzeitigen Anfragen, die eine Website stellen kann, und HTTP-Anfragen erfordern ein bisschen Handshaking.
Daher sind Sprites aus denselben Gründen wichtig, aus denen das Minifizieren und Zusammenfassen von CSS und JavaScript wichtig ist.
Wie verwendet man CSS Sprites?
Hier ist ein Beispiel-Sprite, bei dem drei verschiedene Länderflaggen zu einem einzigen Bild kombiniert wurden

Du definierst dasselbe background-image für mehrere CSS-Klassen und legst die Hintergrundposition und die Abmessungen der einzelnen Klassen fest, um einen einzelnen Teil des Sprites anzuzeigen. Hier ist etwas Code, der das Konzept demonstriert
.flags-canada, .flags-mexico, .flags-usa {
background-image: url('../images/flags.png');
background-repeat: no-repeat;
}
.flags-canada {
height: 128px;
background-position: -5px -5px;
}
.flags-usa {
height: 135px;
background-position: -5px -143px;
}
.flags-mexico {
height: 147px;
background-position: -5px -288px;
}
Wenn du denkst, dass es einen Weg geben muss, dies zu automatisieren, damit du diese Sprites nicht manuell erstellst und dann dein Stylesheet anpasst, um übereinzustimmen, hast du Recht, und du hast Glück!
Sprites mit Grunt / Gulp / Node generieren
Wenn du Grunt, Gulp oder Node im Allgemeinen verwendest, ist css-sprite (jetzt sprity genannt) ein wunderbares Node-Paket, das Sprites aus einer Gruppe von Bildern erstellt. Sprity hat viele großartige Funktionen, darunter die Formatierung der Ausgabe als PNG, JPG (oder Data URIs davon) und die Stylesheet-Generierung in CSS, LESS, Sass und Stylus.
Um Sprites über die Kommandozeile zu kompilieren, installiere css-sprite global mit
$ npm install sprity -g
Führe dann Folgendes aus, um Sprites und das entsprechende Stylesheet zu generieren
$ sprity ./output-directory/ ./input-directory/*.png
Weitere Informationen zur Verwendung von css-sprite mit Grunt oder Gulp (oder vielen anderen Umgebungen) findest du im Repository des Projekts auf GitHub.
Sprites mit Compass generieren
Das Generieren von Sprites mit Compass erfordert etwas zusätzlichen Einrichtungs- und Wartungsaufwand, aber wenn du bereits Compass verwendest, passt es gut in deinen bestehenden Workflow.
Beginne damit, ein Verzeichnis in deinem `images`-Verzeichnis zu erstellen (ja, es muss sich im `images`-Verzeichnis befinden, um zu funktionieren) mit einem Namen, der den Sprites entspricht, die du erstellen möchtest. Stelle sicher, dass die Bilder, die du in Sprites konvertierst, PNGs sind, und lege sie in dein neues Verzeichnis. Ich erstelle Flaggensprites, also habe ich mein Verzeichnis flags genannt und drei PNGs in das Verzeichnis gelegt.
In einer neuen SCSS-Datei, die ich `flags.scss` genannt habe (der Name hier ist nicht wichtig), werden die folgenden drei Zeilen nacheinander die Sprite-Erstellungstools von Compass importieren, die PNGs, die in Sprites konvertiert werden sollen, glob-importieren (beachte, dass der Pfad hier images/ nicht enthält) und dann das CSS für die Sprites generieren. Beachte, dass das mittlere Wort der @include-Anweisung mit dem Verzeichnis in der Zeile davor übereinstimmen muss.
@import "compass/utilities/sprites";
@import "flags/*.png";
@include all-flags-sprites;
Dies ist ein ziemlich einfacher Prozess zum Generieren von Sprites, hat aber einige Nachteile/Eigenheiten
- Das generierte CSS enthält keine Breiten oder Höhen für die Sprites.
- Es gibt keine gemeinsame Klasse zwischen den Sprites; das background-image wird auf jede Klasse angewendet.
Sprites mit ImageMagick generieren
ImageMagick kann verwendet werden, um ein Spritesheet über die Kommandozeile mit den folgenden Befehlen zu erstellen
convert *.png -append sprites.png # append vertically
convert *.png +append sprites.png # append horizontally
Dadurch werden alle durch den Glob ausgewählten PNG-Dateien verkettet und in einer einzigen Datei zusammengefasst, aber es wird nicht das entsprechende Stylesheet erstellt. Wenn du ImageMagick zum Erstellen deiner Sprites verwendest, solltest du den folgenden Abschnitt über die Verwendung von Sprite Cow lesen.
Sprite Cow mit deinen Sprites verwenden

Sprite Cow ist ein gehostetes Tool zum Generieren eines Stylesheets, das deinen Sprites entspricht. Es erstellt das Sprite nicht für dich, sondern hilft dir lediglich dabei, die Zahlen zu erhalten, die du zum Verwenden des Sprites benötigst (die Breite, Höhe und background-position der einzelnen Teile des Sprites). Es bietet 2x-Bildkompatibilität und eine einfache Benutzeroberfläche, um schnell festzulegen, welche Bereiche des Sprites jedes Bild ausmachen, um CSS zu erstellen. Du klickst einfach auf den Teil, den du benötigst, und es gibt dir das CSS, das du brauchst.
Sprites mit Spritepad generieren

Spritepad ist eine weitere gehostete Lösung zum Erstellen von Sprites. Mit Spritepad lädst du einzelne Bilder hoch, positionierst sie nach Belieben, und das CSS wird in Echtzeit aktualisiert. Wenn du fertig bist, lade das Bild herunter und kopiere das CSS in dein Projekt.
Sprites mit SpriteMe generieren
SpriteMe ist ein Bookmarklet, das ein Sprite basierend auf dem generiert, was es auf der aktuellen Seite findet. Du würdest also im Grunde entwickeln, ohne Sprites zu verwenden, und dies dann am Ende verwenden, um Dinge zusammenzufügen. Hier ist ein Workflow, der erklärt, wie das funktionieren würde.
Sollen meine Sprites horizontal oder vertikal sein?
Eine Option ist keins von beiden. Komprimiere sie in einem Raster, um die kleinstmögliche dimensionale Größe zu erreichen. Die dimensionale Größe eines Bildes spielt eine Rolle dabei, wie viel Speicher das Bild bei der Verwendung belegt, also je weniger, desto besser. Wenn du dein eigenes Sprite erstellst, ist Sprite Cow ein gutes Tool, um beim Generieren des CSS zu helfen.
Wenn du dich aus Einfachheitsgründen für das eine oder andere entscheidest, kannst du dir die größte Breite und die größte Höhe deiner Bilddateien ansehen. Wenn die größte Breite größer als die größte Höhe ist, sollte das Spritesheet horizontal angeordnet werden. Wenn die größte Höhe größer als die größte Breite ist, vertikal. Wenn du ein Generierungstool verwendest, trifft dieses diese Wahl im Allgemeinen für dich.
In einigen Situationen kann es tatsächlich sinnvoll sein, ein Sprite diagonal anzuordnen. Dies kann es ermöglichen, ein Sprite in einem Bereich unbekannter Breite und Höhe zu verwenden, was ziemlich cool ist.

Obwohl eine andere mögliche Möglichkeit, dies zu umgehen, die Verwendung eines Pseudoelements ist.
Alternativen
Es gibt einige Alternativen zu CSS Sprites, aber, wie du vielleicht erwartest, haben sie alle ihre eigenen Vor- und Nachteile.
Data URIs
Data URIs ermöglichen es dir, die Bilddaten direkt in ein Stylesheet einzubetten. Dies vermeidet zusätzliche HTTP-Anfragen für Bilder, was im Grunde dasselbe ist wie ein Sprite, nur ohne die ausgefallene Positionierung.
Icon Fonts
Icon Fonts ähneln Sprites insofern, als dass sie dasselbe erreichen: das Kombinieren mehrerer Bilder zu einer einzigen Anfrage.
SVGs
SVG-Bilder können ebenfalls zu einem Sprite kombiniert und als Icon-System verwendet werden. Es ist jedoch ein etwas anderer Ansatz, der die Syntax und Stärken von SVG nutzt. Du musst jedoch möglicherweise über ein Fallback-System nachdenken, da SVG nicht über die gleiche tiefe Browserunterstützung verfügt wie CSS background-image (das im Grunde überhaupt keine Browserunterstützungsprobleme hat).
Grunticon und Iconizr sind Möglichkeiten für die Arbeit mit SVG-Sprites, die bei den Fallbacks helfen.
Verwenden von <img> und object-position
Robin Rendle hat einen großartigen Beitrag zu dieser cleveren Technik hier.
Beispiele
- Mozilla Developer Network verwendet Sprites, um zwischen verschiedenen Zuständen zu wechseln, wenn sie ihre Navigation auf oberster Ebene umschalten.

- Mailchimp verwendet Sprites (background-image SVG) für ihre Seitenleistennavigation in verschiedenen Zuständen.
- Mapbox verwendet einen Icon Font für ihre kleineren Icons, die auf der gesamten Website verwendet werden, aber verwendet Sprites mit ziemlich hoher Auflösung für soziale Medien und Presse-Logos

Guter Beitrag! Wird ein Lesezeichen sein und es sich ansehen!
Eine weitere gute Sache an CSS-Sprites ist, dass man auch Spalten einfach erstellen kann. Für eine frühere Website habe ich versucht, drei Spalten gleicher Länge zu haben, und es war fast unmöglich, bis ich Sprites für ein Hintergrundbild verwendet habe.
Ich habe diese Technik schon seit einigen Jahren gesehen, aber meistens in der Navigation.
Obwohl ich die Prinzipien dahinter verstehe, ist es (abgesehen vom Anfrageargument) nicht wirklich sinnvoll, dies zu tun.
Der Grund, warum ich dies hauptsächlich ablehne, liegt wahrscheinlich an meiner Voreingenommenheit, auf einer Website damit gearbeitet zu haben, die ich ursprünglich nicht entworfen hatte. Ich hatte die Original-Grafikdateien nicht, und es war mühsam, sie von Grund auf neu erstellen zu müssen (als ich nur ein kleines Symbol ändern wollte und mir keine Sorgen um die anderen 4 in derselben Grafik machen musste).
Bessere Website-Leistung, vielleicht ein bisschen. Ich würde sagen, der größte Zeitfresser auf den meisten Websites sind heutzutage serverseitige Probleme, insbesondere bei all den datenbankgesteuerten Plattformen, die es jetzt gibt.
Es lohnt sich, wenn du die Zeit hast, sage ich, aber ich sage, besonders wenn du unter Termindruck stehst, könnte es dich mehr kosten, als es wert ist.
@spiralstarez: Ich denke, du nennst einige gute Punkte. Das Aktualisieren von Grafiken ist mit Sprites viel mühsamer, besonders wenn du die nativen Dateien nicht hast.
Ich denke, es gibt wahrscheinlich einen Sweet Spot, an dem die Verwendung von CSS-Sprites am vorteilhaftesten ist. Wenn du eine Website mit relativ geringem Traffic auf einem anständigen Server hast... ja... dann spielt es wahrscheinlich keine große Rolle. Wenn du ein Nachrichtenportal mit extrem hohem Traffic wie yahoo.com betreibst, gibt es definitive Vorteile, und die Verwendung von Sprites zur Reduzierung von Serveranfragen ist ein Muss.
Interessanter Artikel.
Ich möchte jedoch darauf hinweisen, dass, wenn ein Benutzer die Schriftgröße erhöht, die Sauberkeit dieser Option zu versagen beginnt, da man die anderen Bilder aufgedeckt sieht. Vielleicht würde eine leichte Änderung des Ansatzes etwas besser funktionieren: das zusammengesetzte Bild horizontal statt vertikal verlaufen lassen.
Außerdem könnten min-heights im CSS verwendet werden, um zu verhindern, dass die Bilder kollabieren, wenn die Schriftgröße vom Benutzer verringert wird (was nicht so wahrscheinlich ist).
Chris,
Schön gemacht, dies so zu schreiben, dass die meisten Leute es verstehen können. Ich verwende Sprites schon seit geraumer Zeit für Rollover-Navigationen und finde, dass es der beste Weg in Bezug auf die Seitenladezeiten ist.
Lucy hat einen großartigen Punkt angesprochen, dass Sprites Probleme haben, wenn die Schriftgrößen skaliert werden. Ich möchte die Leute definitiv ermutigen, ihre Designs mit verschiedenen Schriftgrößen zu testen.
Außerdem – wenn du über Sprites sprichst, musst du eines der coolsten Sprite-Beispiele da draußen auf Ask.com erwähnen. Hier ist ein Link direkt zu ihrem Sprite-Bild: http://sp.ask.com/i/h/sprite/b1.png
Viele Grüße,
Scott
Toller Artikel
Wie du am Anfang erwähnt hast, hatte ich sie für einzelne Ein-Aus-Navigationszustände verwendet, aber ich hatte nie an diese Technik für mehrere Bilder gedacht!
Danke Chris!
Ich hatte gesehen, dass dies schon einmal gemacht wurde – aber deine Art, es zu erklären, ergibt viel mehr Sinn.
@lucy: Guter Punkt! Ja, du kannst deine Sprites absolut horizontal statt vertikal verlaufen lassen. Tatsächlich kannst du beides tun. Sieh dir einfach das fantastische Beispiel-Sprite an, auf das Scott unten verlinkt hat (von ask.com), das alle möglichen X- und Y-Positionierungen verwendet.
@Chris & Matt & Scott: Danke! Ich schätze eure Unterstützung.
Lucy Barker,
Das erklärt, warum ich es nicht richtig sehe. Ich habe dies in einem Feed-Reader gelesen und sah Unterstreichungen unter den Quadraten, als ich auf das Beispiel geklickt habe. Das waren die Oberseiten der nächsten Quadrate. Als ich das Beispiel in Firefox öffnete, waren die Unterseiten der Quadrate abgeschnitten, und das Erhöhen der Schriftgröße brachte sie zurück, aber enthüllte auch einen Teil des Quadrats darunter.
Vielen Dank für diesen Artikel, er hat mich wirklich in meinem strategischen Ansatz für Websites aufgeklärt. Nochmals vielen Dank.
Das Hinterlassen von mehr Leerraum zwischen Bildern kann eine Lösung für die Beeinträchtigung sein, die auftritt, wenn die Schriftgröße erhöht oder verringert wird.
http://www.shacknews.com verwendet CSS Sprites schon seit einigen Jahren.
Ugh. Letztendlich ist die vernünftige Lösung, *die Verwendung von Bitmap-Grafiken einzustellen*. Da Bildschirme immer höhere Auflösungen bekommen, wäre die Verwendung von SVG so viel schöner. Schade, dass man sich nicht darauf verlassen kann, dass es verfügbar ist (früher konnte man sich natürlich nicht darauf verlassen, dass PNG verfügbar war, also vielleicht eines Tages...).
Die Wartbarkeit dieses Ansatzes könnte ziemlich einfach erreicht werden, indem der Prozess des Kombinierens von Bildern in den Systembuild integriert wird. Das SCCS würde die ursprünglichen separaten Bilder verwalten, und zum Zeitpunkt des Builds würden sie in das einzelne Super-Image umgewandelt. Die Stylesheets müssten als Vorlagen erstellt werden, wobei Artefakte des Bildkombinationsschritts verwendet werden, um die tatsächlichen Super-Image-Koordinaten auszufüllen.
Ich bin zum ersten Mal auf paulstamatiou.com auf Sprites gestoßen
Übrigens, gibt es eine Möglichkeit, Sprites für andere Elemente als Links und für sich wiederholende Hintergründe zu verwenden? Ich bezweifle das Letztere.
Ausgezeichneter Beitrag. Faszinierende Lektüre. Ich habe es auf InformedNetworker.Com gepostet... und ich würde mich freuen, wenn du deine Artikellinks für zukünftige Beiträge wie diese einreichen würdest, die du für deine Leserschaft nützlich hältst.
@Sumesh: Ich glaube nicht, dass es eine praktische Möglichkeit gäbe, Sprites für ein sich wiederholendes Bild zu verwenden, einfach weil der beste Weg darin besteht, die Höhe und Breite des Elements zu kennen, auf dem du das Sprite verwenden wirst, und es ist unwahrscheinlich, dass du das für ein Element weißt, auf dem du ein sich wiederholendes Bild verwenden möchtest.
Aber du kannst Sprites absolut für andere Dinge als Links verwenden. Alles, was die background-image-Eigenschaft in CSS akzeptiert, ist erlaubt.
Yahoo! verwendet bg-Sprites für sich wiederholende Hintergründe (hier ist ein Beispiel — von ihrer Homepage) ziemlich intensiv, aber deine Vorsicht, sowie die Vorsichtshinweise oben, bezüglich des Wissens um Breite/Höhe sind wirklich wichtig. Es ist problematisch, besonders wenn du gerade erst anfängst. Es ist definitiv eine fortgeschrittene Technik und eine, bei der man leicht stolpern kann. (Ich habe es getan und bin gestolpert!)
Wenn du es tun *musst*, denke ich, dass der Schlüssel viel Leerraum zwischen den Hintergründen und umfangreiche Tests sind.
Halte Ausschau nach css3. Es wird in vielen Browsern nicht bald verfügbar sein, aber wir sollten irgendwann in der Lage sein, Sprites für vollständig sich wiederholende Hintergründe zu verwenden.
http://www.css3.info/image-sprites-syntax/
Ein Teil der Größenreduzierung liegt einfach daran, dass GIF auf 256 Farben beschränkt ist, daher ist dies kein völlig fairer Vergleich. Wenn du die Farben in dem Bild nach dem Spleißen genau untersuchst, wirst du feststellen, dass sie sich subtil von dem unterscheiden, was du vorher hattest. Bei den meisten Symbolen kann man den Unterschied nicht erkennen, aber bei einem Effekt mit starken Farbverläufen würde man es bemerken. Leider verstärkt sich dieser Effekt, wenn du mehr Bilder hinzufügst. Wenn du PNG verwendest, wirst du sehen, dass der größte Teil der Dateigrößenreduzierung verschwindet.
Der Hauptpunkt ist natürlich, dass die Reduzierung der Anzahl der Dateien, die du vom Server abrufen musst, eine gute Sache ist (selbst mit Pipelining und HTTP/1.1), und dieser Punkt bleibt bestehen. Aber ist angesichts der Verringerung der Klarheit (und wenn du GIFs verwendest, der Bildqualität) der Preis wert?
Hier ist ein CSS-Sprites-Tool, das ich gemacht habe
http://www.csssprites.com
(Die Benutzeroberfläche ist ziemlich hässlich, muss ich zugeben, aber wenn jemand ein Stylesheet beisteuern möchte, wäre das sehr willkommen, Link-Back-Anerkennung, etc.)
Eine kleine Anmerkung – wenn deine Image-Sprites .PNG-Dateien mit Alphakanal sind, brechen die Transparenz-Hacks für IE6 deine CSS-Stile. Der AlphaLoader-Filter unterstützt die background-position-Eigenschaft nicht, die Hintergründe werden automatisch in der oberen linken Ecke positioniert. Du musst also Gif-Sprites an IE6 ausliefern oder einzelne PNG-Bilder dafür verwenden.
@Some Jackass: Du hast Recht, ein Teil der Einsparungen bei der Dateigröße kommt daher, dass die gesamte Farbpalette für alle Bilder auf maximal 256 Farben begrenzt wird, anstatt 256 für jedes Bild zu haben. Aber selbst wenn du auf jedem Bild so wenige Farben verwendet hättest, dass es keine Kompromisse gäbe, gäbe es immer noch leichte Einsparungen, da der Dateiformatcode nicht jedes Mal wiederholt werden muss. Nicht viel, aber etwas.
@Matas Petrikas: Danke für den Hinweis. Kurz gesagt, wenn du PNG-Hacks verwendest, verwende keine Sprites.
Re: Matas' Kommentar – es ist in Ordnung, PNG-Sprites ohne Hacks in diesen Fällen zu verwenden
a/ dein PNG hat konstante Transparenz (wahr/falsch, wie ein GIF). In diesem Fall kann das sogenannte PNG8-Format verwendet werden, bei dem du 1 Bit für Transparenz hast
b/ das PNG hat variable Transparenz, wird aber mit 4 Bit für Transparenz gespeichert
PNGs für a/ können von vielen Tools erstellt werden, zum Beispiel imagemagick auf der Kommandozeile
> convert my.png PNG8:my8.png
PNGs vom Typ b/ werden nur (soweit ich weiß) von Fireworks erstellt (Fireworks nennt sie PNG8)
@Stoyan: Könntest du etwas mehr über die 4-Bit-PNG-Transparenz erklären? Ich bin von Photoshop nur mit PNG-8 und PNG-24 vertraut. Bei Verwendung von PNG-8 (1 Bit Transparenz) wäre kein Hack erforderlich. Bei Verwendung von PNG-24 würde die Verwendung des Hacks das Sprite aufgrund des Hacks brechen. Sagst du, dass es eine andere Möglichkeit gibt, ein PNG zu speichern, das Alphatransparenz ohne Hack unterstützen würde?
Hey Chris, ein anderes Format meinte ich – Fireworks nennt es PNG8, aber wenn ich mir das Ergebnisbild mit imagemagick's "identify" ansehe, sehe ich 4 Bit für Transparenz.
Die lange Geschichte hier
http://www.sitepoint.com/blogs/2007/09/18/png8-the-clear-winner/
Ich weiß nicht, wie umfangreich dieses Fireworks PNG8 getestet wurde. Ich habe einen Testlauf mit einem Bild durchgeführt, der gut zu funktionieren schien, und bin dann dazu übergegangen, es mit einem grauen Verlaufsbild zu verwenden, und es wurde nicht richtig gerendert. Es könnte einen Algorithmus geben, der versucht zu erkennen, was Alphatransparenz "sein sollte" oder so etwas, aber es war definitiv "kaputt" für diesen einen Fall.
Ich würde mich nicht darauf verlassen.
@Greg mit PNG 8: „Pixel sind entweder deckend oder vollständig transparent, aber niemals teilweise durchsichtig.“ – es hätte also nicht mit einem Farbverlauf funktioniert, da die Alphawerte hätten variieren müssen
Ich liebe den Kommentar über Chuck Norris :P Ich glaube nicht, dass ich es wirklich verwenden werde, der gesparte Platz ist bei den heutigen Breitbandgeschwindigkeiten minimal. Ich werde es vielleicht in zukünftigen Designs ausprobieren, nur zum Spaß :P
Ich denke, du hast den Hauptpunkt verpasst – die Einsparung liegt bei den 9 weniger Anfragen – du vermeidest 4-9 Latenztreffer für den Endbenutzer (was nicht von seiner Verbindungsgeschwindigkeit abhängt) und gibst deinem Server weniger Arbeit.
Toller Artikel, aber ich muss auf ein technisches Problem eingehen. Einer der Hauptgründe für das Slicing war *nicht*, die Augen zu täuschen, um ein schnelleres Ladeerlebnis zu erzielen, sondern um große Gifs zu optimieren.
Ein Gif kann signifikant komprimiert werden, wenn die entsprechende Farbpalette für dieses bestimmte Bild minimiert werden kann. Daher kann ein großer Bereich innerhalb eines Gifs mit denselben (oder ähnlichen) Farben durch Slicing herausgerechnet werden, um die Gesamtgröße des gesamten Bildes stark zu reduzieren. Mit anderen Worten, die Größe aller kombinierten Slices wäre geringer als die des gesamten, ungeslicten Bildes.
Natürlich hat sich die Landschaft stark verändert, und mit der zunehmenden Verwendung von Jpegs und PNGs und der erhöhten Bandbreite der Benutzer wird die Reaktionszeit (Roundtrip) viel mehr zu einem Faktor als einfach die Bandbreite. Trotzdem... toller Artikel!
@Shane: Weißt du, ich erinnere mich, als ich das schrieb, hielt ich inne und dachte darüber nach, warum zum Teufel wir Bilder früher so zerschnitten haben. Ich habe es die ganze Zeit gemacht, aber ich konnte mich beim besten Willen nicht erinnern, warum ich es getan habe. Ich glaube nicht, dass ich jemals darüber nachgedacht habe, es war einfach der Standard.
Aber ja, du hast absolut Recht, der wahre Grund war die Farbindizierungskraft von GIFs.
Aber was ist mit dem Anwenden von Alt-Tags auf die Bilder für 508-Konformität? Ist das möglich?
Das macht man nicht für Hintergrundbilder.
@Kakupacal – die Sprites-Technik eignet sich am besten für Hintergrundbilder (Dekoration). Deine Seite sollte gut funktionieren und zugänglich sein, auch ohne Hintergrundbilder.
Für "Inhalts"-Bilder ist es immer noch am besten, das img-Tag mit alt-Attribut zu verwenden. Zum Beispiel ist ein Foto in einem Nachrichtenartikel Teil des Inhalts und sollte ein img-Tag sein
Yahoo DevNet glaubt, dass „CSS Sprites die bevorzugte Methode zur Reduzierung der Anzahl von Bildanfragen sind“, aber sie haben auch viele andere Empfehlungen, um weniger HTTP-Anfragen zu stellen, zusätzlich zu ihrer allgemeinen Liste von Best Practices.
Ich schätze die Liebe zum Detail in diesem Beitrag sehr, Chris!
Danke, dass du das zusammengestellt hast. Endlich ein schönes statisches Bildbeispiel. Ich würde das gerne für unsere Website einrichten, aber ich denke, es wäre eine gute Idee, zuerst alle Bilder zu bekommen, die ich möchte, damit ich den Vorgang nicht in ein paar Wochen wiederholen muss.
Vielen Dank
Chris
Gibt es bekannte Probleme damit in IE5/6?
Ich habe Sprites für eine neue Website in 2 Bereichen in größerem Umfang eingesetzt als zuvor.
Zuvor hatte ich dies nur für den Down- und Hover-Zustand einzelner Nav-Elemente gemacht. dann an ihren definierten Platz gebracht.
Dieses Mal habe ich 1 Grafik für 5 einzelne Links, die beide Down- und Hover-Zustände haben.
In allen Browsern funktioniert die Website bisher richtig, außer in IE5 und 6.
Es dupliziert das gesamte Bild in seiner vollen Breite auf der Y-Achse 4 Mal. dann beim 5. Mal zeigt es den Button mit seinem Hover-Zustand, wie es sollte.
lol macht mich verrückt.
Ich erwarte nicht, dass jemand dieses Problem löst, da es schwer zu erklären ist, aber ich hoffe, dass jemand Probleme mit Sprites in IE6 hatte, der Informationen über die Hintergrundwiederholung anbieten kann oder zumindest diesen Effekt sieht, obwohl der no-repeat-Wert im Deklarationsblock aufgerufen wurde.
Ich habe noch nicht genau herausgefunden, was mein Problem verursacht hat, aber ich denke, es hatte etwas damit zu tun, dass ich dasselbe 1 Bild auf alle A-Elemente in meiner UL angewendet habe, anstatt einzelne Bilder für jedes A-Element zu verwenden.
Ich musste eine Höhe von 0px für IE auf die LI- und A-Elemente meiner Navigation anwenden.
seltsam.
Das ist großartig. Ich habe diese Technik schon einmal mit 3-Zustands-Navigation verwendet... 1 Bild mit der Position, die durch das CSS basierend auf Off/Hover/Active manipuliert wird. Das eröffnet wirklich Dinge. Wo du Bilder dynamisch in einer Rotation beim Laden einer Seite laden würdest, anstatt einer dynamischen Bildladung, mache es einfach zu einer dynamischen CSS-Positionierung. Vielen Dank, dass du auf die weiteren Möglichkeiten dieser Technik hingewiesen hast!
Vielen Dank,
Jim Summer
Jacksonville Web Design
http://tentonweb.com/
Wirklich nützlicher Hinweis, es gibt viele mögliche Implementierungen dieser Technik.
Ich habe festgestellt, dass ich das "Slicing" von Bildern bevorzuge, ich hoffe, es wäre nicht schwer, es zu ändern.
Eigentlich hat Chuck gesagt: "Alle großartigen Techniken erfordern große Hingabe".
Schön ausgedrückt, Chris,
Die Technik endet nicht bei der Ikonographie.
Ich habe mit der Neuentwicklung meiner eigenen Website begonnen und dieses Mal ist sie ziemlich grafikintensiv.
Ich habe die Sprite-Technik auf dem komplexen Hintergrund angewendet und war schockiert über den Unterschied.
http://websemantics.co.uk/new/
Klicke in Firefox mit der rechten Maustaste auf den Seitenhintergrund und zeige dann das Hintergrundbild an.
Klicke auf das Bild, um es in voller Größe zu zoomen, und du siehst alle Hintergrundverläufe vertikal gestapelt.
Es ist auch erwähnenswert, dass es eine komprimierte .png-Datei ist, sodass kein Bildqualitätsverlust entsteht.
Die Seitenladegeschwindigkeit, sowohl die tatsächliche als auch die wahrgenommene, ist im Vergleich zu den vorherigen Versuchen unglaublich.
Diese Technik ist, obwohl problematisch und zeitaufwendig, mit Sicherheit lohnenswert.
Grüße
mike
Gute Arbeit, Mike. Gutes Beispiel für die Verwendung der Sprite-Technik für verschiedene Zwecke. Ich würde denken, dass, wenn jemand extrem engagiert wäre, man ein gesamtes komplexes Layout mit einem einzigen Bild erstellen könnte.
Chris
Ich versuche tatsächlich genau das zu tun. Zum Glück ist es kein großes Bild, aber ich verwende nur ein Bild, um zwischen Zuständen zu wechseln, wenn der Benutzer auf Schaltflächen klickt, die über dem Bild liegen. Es ist komplizierter, als ich gehofft hatte.
seekingalpha.com hat seine GESAMTE WEBSITE mit CSS-Sprites erstellt.
davon kann man wirklich viel lernen!
Das klingt irgendwie so, als müsste HTTP überarbeitet werden – und dieser Vorschlag ist eine Problemumgehung.
Nicht wirklich eine Problemumgehung. HTTP wird nie "überholt". Was diese Technik tut, ist zu optimieren/zu rationalisieren.
Optimierung ist genauso wenig eine Problemumgehung wie Code-Refactoring!
Vielen Dank für diesen Vergleich, er veranschaulicht wirklich die Größen- und Geschwindigkeitsverbesserungen, die mit etwas zusätzlicher Planung und Arbeit erzielt werden können.
Ich verwende diese Technik ständig und liebe sie. Der einzige Nachteil, den ich gefunden habe, ist, dass beim Drucken einer Seite in Firefox mit Sprites das gesamte Bild (alle Zustände) in den "maskierten" Bereich des gedruckten Dokuments komprimiert wird. Die Druckvorschau sieht gut aus, aber die PDF-/gedruckte Ausgabe komprimiert das Bild. Scheint in IE in Ordnung zu sein.
Nun, ich denke, wenn du background-position in Prozentangaben angibst, bricht es in IE-6 definitiv oder zeigt sich anders als in anderen Browsern.. Andere zeigen die Position wie erwartet an.. In diesem Fall musst du die Position in Pixeln angeben.. Denkst du, das ist der richtige Weg oder mache ich woanders einen Fehler? Lass es mich wissen
Ich mag die Idee, Sprites zu verwenden (besonders für die Navigation), aber es ist eine Frage aus dem Vid-Tutorial aufgetaucht, das du gemacht hast, Chris. Um den Nav-Text zu versetzen, hast du einen negativen Rand verwendet... Wie umgehst du diesen negativen Rand, wenn ein Benutzer Bilder in seinen Browsern deaktiviert hat? Ja, ich weiß, dass dies bei den heutigen Bandbreiten kein so großes Problem ist, aber es lässt mich immer noch fragen, da der Text nicht angezeigt wird (wenn sich die Navigation beispielsweise auf einem Banner oben auf einer Website befindet). Vielen Dank für alle Antworten, die darauf gegeben werden.
@Nodster
Es gibt eine große Anzahl von Möglichkeiten, dies zu handhaben, abgesehen von der text-indent-Methode, die in der Tat fehlschlägt, wenn Bilder deaktiviert sind.
Ich möchte nur hinzufügen, dass ich CSS-Sprites im aktuellen Design meines Weblogs verwende. Da es sich um eine PNG-Datei handelt, habe ich beschlossen, einige der Grafiken für IE6 und ältere Browser zu entfernen, aber es funktioniert einwandfrei für alle anderen Browser.
Vorerst ist das Logo Teil des Sprites, aber ich werde es ausschneiden und ein
img-Tag in das obere Div einfügen, damit es auch beim Drucken sichtbar ist.Vielen Dank für deine Hilfe...sprite111
sj
Ich denke, CSS-Sprites sind ein interessantes Konzept und möglicherweise gut geeignet für ein paar Anwendungen wie Hintergründe und grundlegende Button-Rollover. In einer Produktionsumgebung, in der du ein Team hast, das Prototypen erstellt und diese dann an ein Entwicklungsteam (oder an einen Kunden) übergibt, ist es jedoch nicht wirklich praktisch.
Allein die Probleme mit der Farbintegrität, der einfachen Aktualisierung, Druckproblemen, fehlender Alt-Tag-Unterstützung usw. sind Grund genug, dies nicht in großem Umfang auf der Produktionswebsite eines Kunden anzuwenden.
Ich glaube zwar, dass ich den Dreh raus habe, aber das Zeigen des Bildes, das du verwendet hast, würde viel mehr helfen!
Sieh dir hier ein Video-Podcast-Beispiel für die Erstellung von CSS-Sprites an (wenn du so etwas magst)
Hallo, bitte, kannst du mir helfen, CSS-Sprites sind sehr interessant, aber funktionieren sie in Internet Explorer 6 ??? Ich habe damit ein Problem... bitte hilf mir, danke
Ich verwende diese Methode oft, aber weiß jemand, warum IE6 beschließt, das Bild bei jedem Hover "neu zu laden"?
Wenn du über den Link hoverst, verschwindet das bereits geladene Bild und wird dann jedes Mal neu geladen!!!!
Ich liebe IE...... nicht!
Hallo,
Ich habe einen CSS Sprite Generator in PHP erstellt (CLI-Modus)
Es hat die Fähigkeit, die Hintergrundbilder automatisch zu ersetzen.
Wenn du interessiert bist, schau hier vorbei
http://tanila.de/smartsprite/index.php
Mit freundlichen Grüßen
tanila
Hallo,
Danke für dein Thema, es hat mir geholfen, mit CSS Sprites zu arbeiten!
Hier ist meine verzwickte Situation
Ich verwende eine große Anzahl von CSS-Hintergrundbildern (eigentlich 66 Bilder!) für meine Website. Ein guter Prozentsatz dieser Bilder wird in Box-Demonstrationen verwendet, ich kann CSS-Sprites für die linke obere und linke untere Ecke von Boxen verwenden, aber es scheint, dass es keine Möglichkeit gibt, sie in der rechten oberen, rechten unteren und mittleren (die sich wiederholen müssen) zu verwenden. Irre ich mich und gibt es irgendwie eine Möglichkeit, dieses Ziel zu erreichen?
Wenn es keine Möglichkeit gibt, diesen Trick anzuwenden, was schlägst du vor, um die Anzahl der Bilder zu reduzieren?
Ich wäre sehr dankbar, wenn du mir eine Antwort/einen Vorschlag an meine E-Mail senden würdest: pashaie-at-gmail-dot-com ;)
Vielen Dank im Voraus
Perfekt! Das ist genau das, was ich brauche, um noch etwas mehr Leistung herauszuholen!
Vielen Dank.
Vielen Dank, Chris, für all deine Lehren!! Total unschätzbar!! Ich habe mir die 'Sprite-Navigation' durch deine Beiträge und Videos selbst beigebracht, und sie funktioniert super. Ich habe jedoch zwei Macken... 1.) Durch das Verschieben des Textes 'offscreen' erzeugt FireFox ein HÄSSLICHES gepunktetes Kästchen ganz außerhalb des Bildschirms (wird für die Tastaturnavigation verwendet). Ich habe gelernt, es 'auszuschalten' (outline: 0;), aber dann ist es... nun ja, aus und für Menschen mit Zugangsschwierigkeiten schwierig zu navigieren... Gibt es eine Möglichkeit, den Text einfach 'verschwinden zu lassen', aber ihn in Position zu lassen?? 2.) Zentrieren... holy cow... Ich habe gerade 4 Stunden damit verbracht, das Internet nach dem Zentrieren der Liste in meinem Web zu durchsuchen... kein Erfolg... Ich habe mich einfach für einen 'Hack' entschieden, um einen linken Rand darauf zu setzen... Gibt es eine Möglichkeit, diese Liste zu zentrieren?
Wo ist der Link zum CSS Sprite Generator?
http://spritegen.website-performance.org/
@Lucy Jetzt, da du in den meisten Browsern zoomen kannst. Designer sollten statische Schriftgrößen anstelle von "em"-Schriftgrößen erstellen, damit du das Problem mit dem Hintergrundbild nicht hast.
@Brent Personen, die Hyperlinks tabben, sollten ihr eigenes CSS verwenden oder das gesamte CSS deaktivieren.
Ich bevorzuge einen Mittelweg, der nur Sprites für dieselbe Schaltfläche erstellt. Ich hasse es wirklich, Sprites perfekt auszurichten, also habe ich ein Photoshop-Skript erstellt, das zwei Bilder derselben Größe kombiniert, um ein einfaches Normal-/Hover-Sprite zu erstellen. Es ist nicht so genial wie die 20 Image Sprites, die du online erstellen kannst, aber es ist viel einfacher und du kannst eine Tastenkombination in Photoshop zuweisen. Ich bevorzuge die Kontrolle darüber, und du stößt nicht auf das Problem "Ich habe die Quelldateien nicht".
http://www.smjdesign.com/designwell/archives/photoshop-script-combine-two-images-css-hover-css-sprite/
Weiß jemand auch, ob man Dateien bei diesen Online-Sprite-Generatoren neu erstellen/einreichen muss, müssen die Dateien in derselben Reihenfolge nach ihrem Dateinamen sein, damit sie sich an derselben Stelle befinden und du nicht alle deine CSS-Regeln ändern musst. Das scheint mühsam zu sein.
Vielen Dank für das Skript! Eine definitive Zeitersparnis!
Ich denke, ich werde mich bemühen, dies zu verwenden. Die einzigen Probleme, die ich habe, sind: Was ist, wenn du dein Sprite fertig hast, alles perfekt ist, du aber etwas vergisst, etwas, das dich dazu zwingen würde, das Ganze zu wiederholen... Dann musst du von vorne anfangen und unnötige Zeit verbringen, die für etwas Größeres und Besseres verwendet werden könnte.
Du wiederholst es nicht, du öffnest deine Sprite-Grafik, machst sie etwas höher oder breiter und lässt das neue Sprite dort hineinfallen und speicherst es erneut. Es ist definitiv mehr Arbeit als die Verwendung einzelner Bilder, aber es ist nicht das Ende der Welt.
Schöner Artikel.. Ich habe in letzter Zeit Sprites verwendet, und es beeinflusst wirklich die Seitenladegeschwindigkeit der Website. Wenn wir einzelne Bilder für Menüelemente und deren Hover-Zustand verwenden, wird beim Laden der Website, wenn wir über das Menüelement scrollen, kein Bild angezeigt, bis es richtig geladen ist.. Die Verwendung von CSS-Sprites vermeidet dieses Problem.
Yep, schnellere Übergänge sind ein großer Vorteil.
Ich habe diese ähnliche Technik schon vor langer Zeit auf der Website von play.com bemerkt, aber nie selbst versucht.
Dies ist ein schöner Artikel, ich werde es in einem Testfall ausprobieren und sehen, wie es läuft.
Schöner Artikel, Chris, ich bin ein riiiiiiesiger Fan von CSS-Sprites. Schau dir mein Sheet für alittlephotoshop.com an
http://bit.ly/4g4Ncr
Wie du jedoch sagtest, ist das Problem definitiv der Workflow. Ich musste kürzlich die Sidebar-Header-Bilder ersetzen, weil ich ein neues hinzugefügt habe. Da ich auf meinem Laptop kein PSD hatte, begann eine ernsthafte Photoshop-Hack-Arbeit. Es ist eine massive Qual.
Wenn du außerdem dein Stylesheet auf explizite Pixelpositionen aufgebaut hast und eine Grafik dann in deiner Website redundant wird, wie bei mir das Suchfeld nie verwendet wurde. Es gibt im Grunde keine Möglichkeit, es aus dem Sheet zu entfernen, außer das gesamte Ding neu zu codieren, um eine Dateiaufblähung zu verhindern.
Letztendlich, was für ein wunderbarer Dienst SpriteMe ist! Ich denke, dies wird das letzte Mal sein, dass ich Sprite Sheets von Hand erstelle. Baue die gesamte Website lieber regelmäßig, lade sie hoch, führe SpriteMe aus und speichere schließlich eine zweite Version des Stylesheets.
Änderungen am Original vorzunehmen und mit SpriteMe neu zu erstellen, scheint die eleganteste Lösung zu sein, anstatt mein Sheet immer wieder zu hacken, um kleinere Änderungen vorzunehmen.
Du hast wirklich eine großartige Art, diesen Prozess zu vereinfachen. Es hat wirklich geholfen, es zu verstehen. Wie andere gesagt haben, denke ich, dass die Planung, wo du sie verwenden wirst, das Wichtigste ist, was du beachten musst.
Hallo Chris,
Was ist der beste Weg, Sprites in eine WordPress CMS-Website zu integrieren, damit der PHP-generierte Inhalt gut mit den Sprites zusammenarbeitet? Irgendwelche Vorschläge...?
-Murph
P.S. – Danke für die großartige, informative Arbeit, die du leistest. Ich lerne jeden Tag etwas Neues von einer deiner Websites.
Die Technik wird genau dieselbe sein; WP macht keine Magie. Der einzige Trick besteht manchmal darin, zu identifizieren, wo der Stil deklariert wird, wenn nicht in stylesheet.css. Einige Plugins enthalten zum Beispiel ihre eigenen Stylesheets.
Firebug (Firefox) oder Dragonfly (Opera) können hier nützlich sein.
Sobald du identifiziert hast, wo das CSS ist, identifizierst du gleichzeitig die Quelle der Bilder. Wenn es separate Bilder sind, musst du sie nur in deinem Bildeditor öffnen und in deine neue Sprite-Datei kopieren/einfügen und die Offsets berechnen.
Greg
Danke, Greg. Ich glaube, ich werde dieses Sprites-Ding in meinem nächsten Design ausprobieren!
Dies ist eines meiner liebsten Dinge an CSS. Ich habe es geschafft, meine Vorlage auf nur 3 Bilder zu reduzieren, da es immer all diese Skripte und andere Dateien gibt, die meine Website verlangsamen.
Einige sagen, dass die Verwaltung von Sprites schwierig ist, aber ich denke, das genaue Gegenteil, besonders für Hovers. All diese Bilder in einer Datei zu haben, macht es einfacher, sie später zu organisieren und zu finden, um sie zu bearbeiten. Nehmen wir an, ich suche etwas im Header, nun, wenn du eine Art "header.png"-Datei hast, hast du deine Navigation und alles darin, genau wie du einen Ordner/ein Verzeichnis auf deinem Server haben könntest.
Ich bin gegen Dienste wie SpriteMe, weil es eher eine statische Lösung ist. Wenn du deine Bilder ständig bearbeitest oder feststellst, dass du deine Website designtechnisch oft änderst, musst du alle Dateien erneut spriten und möglicherweise sogar das CSS nur für eine kleine Änderung ändern.
Oh, und für diejenigen, die denken, dass es sich nicht einmal in Bezug auf die Geschwindigkeit lohnt, nimm zum Beispiel mein Header-Sprite. Wenn all dies einzelne Bilder wären, würde das Laden meiner Website ewig dauern. Ich habe auch keine Probleme beim Bearbeiten, das ist also ein persönliches Problem.
http://cdn.myunv.com/img/resource/sitewide/assets.sprite.png
Entschuldigung für den Doppelpost :(
http://www.jaredhirsch.com/coolrunnings/public_images/2593af8d3b/spriteme1.png
Schöne Zusammenfassung, Chris! Sprites sind mir nicht neu, aber mir gefiel, wie du erwähnt hast, was sie nicht können (sich wiederholende Bilder) und einige Beispiele von bekannten Websites gezeigt hast.
Ich habe festgestellt, dass Mint einige große Image-Sprites für seine Icon-Sets hat.
Du kannst sich wiederholende Grafiken erstellen, solange sie nur in eine Richtung gehen (repeat-x oder repeat-y).
Wenn du andere Bilder innerhalb dieses Sprites hast, die größer als dein Farbverlauf sind, würdest du ihn einfach dehnen, um die gesamte Breite oder Höhe auszufüllen.
Guter Beitrag, ich verwende Sprites schon seit einer Weile für Navigationen und Schaltflächen. Ich habe gezögert, viel größere Sprites mit vielen Grafiken in einer Datei zu verwenden, weil ich befürchtet habe, dass dies das Rendern der Seite verlangsamen würde. Obwohl du den Rest des Sprite-Bildes nicht "sehen" kannst, könntest du einen Haufen 1000px x 1000px großer Sprite-Dateien auf deiner Seite haben. Gibt es Studien, die zeigen, ob dies die Renderleistung beeinträchtigt? Bin ich nur paranoid?
Toller Artikel über CSS-Sprites, ich fand die Tipps sehr nützlich als Neuling in CSS!
Brillant geschriebener Artikel wie immer.
Ich kenne Sprites schon seit einiger Zeit, hatte aber nie den Drang oder die Rechtfertigung, sie zu verwenden. Ein Teil meiner Zweifel daran kommt von der Dateiverwaltung und den bereits erwähnten Bearbeitungsmöglichkeits-Implikationen (ist das ein Wort?!). Die Vorstellung, "[die] Sprite-Grafik [zu öffnen], sie etwas höher oder breiter zu machen und das neue Sprite dort hineinfallen zu lassen und erneut zu speichern", lässt meinen übermäßig analen Organisationstrieb aufkommen.
Auch als jemand, der viel mit vorprogrammierten Joomla-Plugins und dergleichen herumfummelt, erscheint die Vorstellung, ein Element nicht untersuchen, sein Hintergrundbild sehen, ein neues erstellen (möglicherweise von einer völlig anderen Größe), hochladen und ersetzen zu können, zugunsten des Durchforstens eines PNG-Bildes und des Aufblähens mit neuen Sprites etwas unpraktisch. Offensichtlich ist das ein kleiner Punkt in einer großen Diskussion, aber es ist definitiv ein No-Go für Open-Source-Entwickler...
Ausgezeichnete Idee, diesen Artikel zu aktualisieren und neu zu veröffentlichen.
OMG, ich werde süchtig nach CSS-TRICKS.com. Ich hatte befürchtet, dass CSS und andere Dinge wie Sprites sehr fortgeschritten und schwer zu verstehen sein würden, aber die Art und Weise, wie du es erklärt hast, hat die Angst verschwinden lassen und ich kann es vollständig verstehen.
Schau dir Mashable.com an, sie haben ein ziemlich schickes CSS-Sprite am Laufen
Mashable Sprite
Toller Artikel. Ich selbst benutze die Webentwickler-Symbolleiste, um die Bilder zu überprüfen, die andere Websites verwenden, und ich habe dies viele Male gesehen. Ich dachte, es ging darum, ein einzelnes Bild zu positionieren. Ich habe das Konzept nie klarer verstanden, bevor ich diesen Artikel gelesen habe. Ich werde dies auf jeden Fall in meinem Blog-Design implementieren.
Guter Artikel. Ich liebe das Bookmarklet, sehr cool.
Ich persönlich würde nicht alle meine Hintergrundbilder spriten wollen, da dies die Wartung einer Website nur problematisch machen würde. Insbesondere in Situationen, in denen Sie möglicherweise die Größe eines Elements und damit die Größe des Hintergrundbilds ändern möchten – dann müssten Sie Ihr Sprite-Bild neu erstellen UND die Positionierung vieler Elemente korrigieren. Was mich zu der Problemumgehung bringt, die ich auf der einen Website verwendet habe, für die ich dies verwendet habe: Geben Sie jedem Element einfach viel Platz, damit das Ändern der Größe eines bestimmten Elements nichts anderes beeinflussen muss. (ask.coms Sprite ist größtenteils so eingerichtet).
Eine Sache, die ich nicht erwähnt sah (vielleicht weil es jeder bereits weiß). Ist, dass dies für Rollover-Elemente eine Art Muss ist. Ohne eine Form von Sprite-Technik für Rollovers zu verwenden, funktionieren Rollovers allzu oft nicht richtig, wenn ein Benutzer zum ersten Mal mit der Maus darüber fährt. Wenn Sie die Grafiken nicht vorladen, gibt es eine Verzögerung, bevor das Rollover-Bild erscheint. Es ist Benutzern egal, auf Ihr halb geladenes Navigationssystem zu warten, bis es fertig geladen ist, wenn sie es verwenden möchten.
Oh ja, ich habe nicht alle Kommentare gelesen (nur etwa die Hälfte), aber jemand hat das PNG8-Format von Fireworks und seine 4-Bit-Transparenz erwähnt, und Sie haben um weitere Informationen dazu gebeten, aber die Antworten waren nicht sehr detailliert.
Ich verwende lieber Fireworks PNG8 für transparente Bilder, da sie in praktisch allen Browsern funktionieren und Sie in IE6 zwar keine Alpha-Transparenz erhalten, sie aber zumindest schön degradieren.
Ich erstelle mein Bild in Photoshop und stelle sicher, dass alle halbtransparenten Elemente wirklich halbtransparent sind. Das heißt, ich stelle sicher, dass Schatten keinen Anteil haben, der mehr als 100 % beträgt, und ich stelle sicher, dass Dinge, die Anti-Aliasing haben, zuerst eine sauber aussehende, nicht-anti-aliased Version haben und der Anti-Aliasing-Effekt getrennt ist und keinen Anteil hat, der zu 100 % opak ist. Ich mache das, indem ich die Dinge in Ebenen aufteile und dann die Deckkraft auf Ebenen mit Schatten/Anti-Aliasing/anderen halbtransparenten Effekten auf 98 % einstelle. Auf diese Weise weiß ich genau, was in IE6 verschwinden wird. Dann öffne ich die Photoshop-Datei in Fireworks und exportiere sie als PNG8 mit Alphatransparenz. Ich habe versucht, einige andere PNG-Tools zu verwenden, die PNG24s in dieses Format konvertieren können, aber die Ergebnisse waren oft sehr unvorhersehbar und unkontrollierbar. Fireworks ist das einzige Tool, das dies präzise tun kann.
Mit dieser Art von PNG8 zeigt IE6 jedes Pixel, das weniger als 100 % ist, als 0 % an, sodass es im Grunde wie ein reguläres PNG8 mit 1-Bit-Transparenz angezeigt wird. Alle Schatten/Anti-Aliasing/etc. verschwinden einfach in IE6. Sie erhalten also einige gezacktere Bilder ohne Schatten usw. Aber zumindest erhalten Sie keine großen grauen Kästen und Sie müssen auch keine PNG-Transparenz-Fixes verwenden. Ich habe viele PNG-Transparenz-Fixes ausprobiert (vielleicht sogar alle), aber im Allgemeinen habe ich festgestellt, dass sie alle problematisch und/oder unzuverlässig sind, was bedeutet, dass es in IE6 in Ordnung zu funktionieren scheint, aber dann sehe ich es auf dem Computer eines Freundes mit IE6 und es ist aus irgendeinem Grund halb kaputt. Ich ziehe es auch vor, JS für Stil/Aussehen zu vermeiden und es nur für die Funktionalität zu verwenden. Sie können die Website also ohne Java gut sehen, aber wenn Sie eine Funktion verwenden möchten, benötigen Sie möglicherweise JS.
Was Dinge angeht, die in IE6 etwas gezackt aussehen... Mir persönlich ist das egal, solange das Layout nicht kaputt ist und keine großen grauen Kästen überall sind.
Ein Wort der Warnung: Diese Technik wird am besten von Leuten verwendet, die sich gut mit Photoshop auskennen und ein gutes Verständnis für rasterbasierte Grafiken im Allgemeinen haben, denn ohne eine bewusste und präzise Kontrolle der Transparenzstufen in Ihren Grafiken können die Ergebnisse sehr unvorhersehbar und hässlich sein.
Ein Ratschlag: Ich habe in den 90er Jahren mit Rastergrafiken für Spiele-Mods für Doom/Doom2 und die Marathon-Spiele gearbeitet, und diese Spiele unterstützten nur 1-Bit-Transparenz. Auch Symbole für Win95/98 konnten nur 1-Bit-Transparenz haben. Wenn Sie ganz nah herangehen und die Kantenpixel vorsichtig von Hand optimieren, können Sie ziemlich sauber aussehende Kanten erstellen und das gezackte Aussehen von 1-Bit-Transparenz-Grafiken minimieren. Aber ich habe noch keine App gesehen, die dies automatisch gut macht. Wenn Sie eine Illustrator-Datei in Photoshop importieren und Anti-Aliasing in den Importoptionen deaktivieren, erhalten Sie ein sehr hässliches, gezacktes Bild, aber wenn Sie ein oder zwei Stunden damit verbringen, die Kantenpixel zu optimieren, können Sie es ziemlich sauber aussehen lassen. Natürlich sieht halbtransparentes oder spezifisches Hintergrundfarben-Anti-Aliasing immer noch sauberer aus, aber indem wir all dies sorgfältig kontrolliert kombinieren, können wir halbtransparente PNGs verwenden, die in IE6 (ich denke sogar 5.5) sehr schön degradieren, ohne uns mit Javascript-Fixes oder AlphaLoader (was sehr langsam ist) herumzuschlagen.
Das Problem bei den meisten PNG-Fixes ist, dass sie hauptsächlich von JS und AlphaLoader oder alten VRML-Funktionen abhängen, die alle das Client-System stärker belasten. Ja, sicher, kein Problem auf diesem System, an dem ich gerade arbeite, aber das beschissene alte Schrottsystem, das ich zum Testen von IE6 verwende, wird durch diese Fixes schrecklich verlangsamt, und der Grund, warum ich dieses beschissene System zum Testen von IE6 verwende, ist, dass ich denke, dass es repräsentativ für die Art von System ist, die die meisten Leute, die IE6 verwenden, möglicherweise haben.
Sie können andere Tutorials zur Verwendung von PNG8 mit 4-Bit-Alpha-Transparenz finden und Sie können ein paar andere Tools finden, die PNG24s in dieses Format konvertieren können, aber diese Tutorials gehen nicht auf die verschiedenen Macken ein, denen Sie begegnen werden. Um wirklich gute Ergebnisse zu erzielen, ist es nicht so einfach wie nur das Konvertieren einer Grafik, aber wenn Sie sich darüber Gedanken machen und einige Experimente durchführen und Fireworks anstelle eines der anderen Konverter-Tools verwenden, können Sie auf diese Weise hervorragende Ergebnisse erzielen. Auch viel kleinere Dateien als PNG24. Einige Grafiken sehen auf diese Weise jedoch aufgrund der begrenzten Farbpalette, die durch das 4-Bit-Alpha weiter reduziert wird, nicht schön aus, zum Beispiel große Verlaufsbereiche.
Ich liebe das Chuck-Norris-Zitat total – gute Form!
Ich bin neu bei CSS, also bitte haben Sie Geduld mit mir.
Ich kann das Hintergrundbild korrekt laden, indem ich es in eine Klassendefinition einfüge, wie folgt
.item-video {
background-image: url(‘images/video-nav.gif’);
}
... aber nur, wenn ich die Klasse dann auf das li-Element anwende. Das GIF wird nicht angezeigt, wenn ich die Klasse auf das Anker-Element anwende. Und wenn ich das GIF dazu bringe, angezeigt zu werden, wenn ich die Klasse auf das li-Element anwende, funktioniert der href-Link im Anker nicht.
Ich denke, das liegt daran, dass die HTML-Elemente li und a wirklich keinen Inhalt haben ... nur eine Hintergrundgrafik, daher bin ich etwas verwirrt. Es scheint, als ob Chris in seinem "danach"-Beispiel oben die Textelemente Element 1, Element 2, Element 3 usw. in den Anker-Elementen hat, aber was erzeugt den eigentlichen Kasten um das Text- und Hintergrundelement, damit der Browser ihn als Link "sieht"?
Jede Hilfe ist sehr willkommen.
Sprites sind cool, aber ich wollte mehr Kontrolle darüber haben, wie ich sie erstelle. Ich habe eine Air-App namens Tonttu ausprobiert, aber ich kann nichts daraus exportieren, wenn ich könnte, wäre es perfekt.
Hat es jemand erfolgreich verwendet oder soll ich mich einfach nicht damit beschäftigen?
Tonttu hat tatsächlich sehr gut funktioniert. Ich denke jedoch, dass Spriteme Ihr CSS viel stärker berücksichtigt, was es zur besseren Option von beiden macht.
Hallo Zander,
Probieren Sie spriteme.org sofort aus, es ist viel besser.
Toller Beitrag! Ich habe mich gefragt, ob es schneller wäre, so etwas zu tun, und habe herausgefunden, dass es viel besser und schneller ist! Danke für die Tipps!
Ja, ich habe mich immer gefragt, wie sie funktionieren. Sehr gute Erklärung des Autors. Es ist wirklich gut und schnell, wenn wir einfach ein einzelnes Bild für verschiedene Objekte aufteilen können.
Mit freundlichen Grüßen
Ich denke, es ist eine gute Idee, aber ich habe es manchmal nicht ausprobiert!
Ich hätte nie gedacht, dass ein Chuck-Zitat so tiefgründig sein könnte.
Toller Artikel,... und eine gute Möglichkeit, eine Website zu optimieren.
Guter Artikel! Was denken Sie, wenn alle Bilder in einem Sprite wären und das Sprite-Bild groß wäre (Breite x Höhe) und für etwa 50 Elemente verwendet würde, wäre das nicht langsam für einige Browser?
Danke.
Ich habe davon gehört und sogar versucht, Sprites auf meinen Websites zu verwenden, aber ich habe nie gedacht, dass es so global implementiert werden kann. Vielen Dank für den Artikel. Lesezeichen gesetzt :)
Ich weiß nicht, ob jemand diesen Vorschlag bereits gepostet hat, aber wäre es nicht schneller für die Website zu laden, wenn die Schaltflächen in 3 Ebenen aufgeteilt würden: normaler Hintergrund, Hover-Hintergrund und Schaltflächenbild. Sie laden den normalen bcg und den Hover-bcg nur einmal (2 HTTP-Anfragen) und dann die Schaltflächenbilder (5 HTTP-Anfragen). Das ergibt 7 HTTP-Anfragen und die Bilder sollten wirklich klein sein.
Was halten Sie von dieser Idee?
Gute Idee, vielen Dank für Ihren interessanten Artikel.
Ich habe gerade von den netten Leuten von welovecss.com von Sprites gehört. Ich wollte etwas anderes als Javascript verwenden, und obwohl dies meine Fähigkeiten etwas übersteigt, was gut ist, liebe ich es!
Vielen Dank für einen großartigen informativen Artikel.
Ich habe mir immer die Smilies von Facebook und Google angesehen (das erste Mal, dass ich sie dort gesehen habe). Ich habe mich gefragt, wie sie das machen. :o Es ist ziemlich einfach. :p
Es ist ein großartiger und hilfreicher Artikel. Vielen Dank für das Teilen mit uns.
Alles Gute.
Ich habe eine Anwendung für Mac namens Sprite Master Web erstellt, um Entwicklern zu helfen, Spritesheets und CSS-Code automatisch zu erstellen.
Sie finden es unter mobinodo.com/spritemasterweb
Hallo Chris, endlich habe ich verstanden, was CSS-Sprite genau bedeutet. Danke!
Toller überarbeiteter Artikel!
Ich habe gerade ein Projekt übernommen, das Sprites ausgiebig verwendet. Das folgende Tool hat geholfen, den Aufwand beim Aktualisieren einiger Symbole, selbst in der Größe, zu verringern
http://www.spritecow.com
Eine andere Möglichkeit, dies zu tun, besteht darin, einfach Textknoten oder ein leeres Element zu erstellen, anstatt ein transparentes Bild zu erstellen. Auf diese Weise verwenden Sie nur ein Bild, das Spritesheet.
Ich würde diese Methode Textknoten vorziehen, ist einfach einfacher
Gibt es eine Möglichkeit, dies mit SVGs zu tun?
http://www.smashingmagazine.com/2014/03/05/rethinking-responsive-svg/
Wirklich hilfreicher Artikel.
Ich suche nach so etwas, möchte das Hintergrundbild aber auch rechts in der Mitte des UL LI positionieren. Das Bild hat nicht die gleiche Breite und Höhe wie das UL LI, in dem ich es als Hintergrund (Symbol) verwende.
Ich müsste also verwenden: background-position: right center; aber dann kann ich es nicht verwenden, um das Sprite zu positionieren, und es zeigt das gesamte Sprite-Bild an.
Toller Beitrag! Wir verwenden Sprites für große Verzeichnisse und sie funktionieren sehr gut. Das Wichtigste ist, dass es die Anrufe an den Server stark reduziert – für Desktops oder Mobilgeräte – es zeigt sofort eine Erhöhung der Ladezeit. Aber das ist natürlich, wenn Sie das gesamte Sprite-Bild optimieren. Ansonsten ist Sprites die größte Erfindung von CSS – meiner Meinung nach, ;)
Ich kann es kaum erwarten, dass SVG weit verbreitet unterstützt und für die Webleistung optimiert wird. CSS-Sprites tragen viel zur Eliminierung von HTTP-Anfragen bei, aber heutzutage benötigen wir unsere Symbole in vielen Dimensionen für responsive Websites und für Geräte mit höherer Pixeldichte (Retina). Vektor ist also der nächste logische Evolutionsschritt.
Die Website, an der ich arbeite, leidet in letzter Zeit unter langsamer Ladung, hauptsächlich weil mein Code und meine Bilder nicht so optimiert sind, wie sie sein könnten :)
Ich habe eine Seite hinzugefügt, die ziemlich viele Bilder benötigte, wollte aber sicherstellen, dass die Ladegeschwindigkeit nicht übermäßig beeinträchtigt wurde. Ich habe vor einiger Zeit über Sprites gelesen und durch Zufall hat mich eine schnelle Suche hierher geführt. Wow! Hat mir etwas die Augen geöffnet. Ich habe die Technik hier PIL Leaflets implementiert und es funktioniert wunderbar.
Eine leichte Anpassung ist, dass ich einen gemeinsamen Hintergrund haben wollte, den ich über CSS zu dem enthaltenden Div hinzugefügt habe. Die Sprites werden auf das Bild selbst angewendet, das dies überlagert. Dadurch wird das Hauptsprite auf eine minimale Größe beschränkt. Im Vergleich zu meinen alten Arbeitsmethoden schätze ich, dass es 4-6 Sekunden bei der Ladezeit gespart hat. Ich bin mir sicher, dass es mit etwas Optimierung noch weiter reduziert werden kann.
Und es hat Spaß gemacht, es zusammenzustellen! Vielen Dank für den Artikel, es war eine große Hilfe :)