Einer der Nachteile der ausschließlichen Verwendung von CSS-Media-Abfragen als alleiniges Mittel für eine mobile Lösung besteht darin, dass dieselben Inhalte sowohl an Desktop-Browser als auch an mobile Geräte ausgeliefert werden (die theoretisch langsamer sind und über weniger Netzwerkgeschwindigkeit verfügen).
Das Ausliefern desselben HTMLs an beide… nicht so schlimm. Das Ausliefern von Bildern, die um ein Vielfaches größer sind, als sie auf Mobilgeräten benötigt werden, das ist eher ein Problem. Eine Reihe kluger Leute hat versucht, dieses Problem zu lösen, daher wollte ich ihre Arbeit hier hervorheben:
Der CSS3-Weg
Obwohl diese Methode von Nicolas Gallagher aktuell in keinem Browser funktioniert, halte ich sie für meine Lieblingsmethode. Sie setzen das kleinste Ihrer Bilder als Standardquelle und listen dann die URL-Pfade zu größeren Versionen in HTML5-Datenattributen auf.
<img src="image-mobile.jpg"
data-src-desktop="image-desktop.jpg"
alt="">
Dann verwenden Sie CSS-generierten Inhalt, um die Grafik durch eine größere zu ersetzen, über Media-Abfragen, wenn die Bildschirmbreite dies als Desktop anzeigt.
@media (min-width: 1024px) {
img[data-src-desktop] {
content: attr(data-src-desktop, url);
}
}
Selbst die aktuelle Entwicklungsversion des CSS-Standards, die stark von der Originalversion gekürzt wurde, behält diese Fähigkeit bei.
Nicolas beschreibt die potenziellen Nachteile in seinem Artikel klar und deutlich. Ich bin der Meinung, dass jedes dieser Probleme mit zukünftiger Technologie gelöst werden kann.
Der JavaScript-Weg
Während der oben genannte CSS3-Weg derzeit theoretisch ist, ist diese JavaScript-Technik von Scott Jehl von Filament Group einsatzbereit (wenn auch noch experimentell).
Diese Technik ist tatsächlich eine Kombination aus JavaScript, HTML und .htaccess (also nur für Apache-Server). Die Readme-Datei erklärt es am besten.
Sobald rwd-images.js geladen ist, testet es die Bildschirmbreite. Wenn sie groß ist, fügt es ein BASE-Element in den Kopf Ihrer Seite ein und leitet alle nachfolgenden Bild-, Skript- und Stylesheet-Anfragen über ein fiktives Verzeichnis namens „/rwd-router/“ weiter. Wenn diese Anfragen den Server erreichen, ermittelt die .htaccess-Datei, ob es sich um ein responsives Bild handelt oder nicht (hat es einen ?full-Abfrageparameter?). Sie leitet responsive Bildanfragen sofort zu ihrer vollen Größe weiter, während alle nicht-responsiven Bildanfragen über eine URL-Umschreibung, die das Segment „/rwd-router/“ ignoriert, an ihr richtiges Ziel gehen.
Der Cookie-Weg
Keith Clark hat eine Methode, um einen Cookie zu speichern, der die Bildschirmgröße des aktuellen Geräts enthält. Dieser Cookie kann vor dem Ausliefern von Bildern getestet und verwendet werden, um zu entscheiden, welche Größe ausgeliefert werden soll.
Es funktioniert, indem ein Cookie mit den Bildschirmabmessungen gesetzt wird.
document.cookie = "device_dimensions=" + screen.width + "x" + screen.height;
Dann werden Bilder tatsächlich durch ein einfaches Skript geleitet. Der Dateiname ist ein Parameter.
<img src="images/?test.png">
Das Skript liest den Cookie und liefert das passende Bild. Das vollständige Beispiel finden Sie im vollständigen Artikel.
Andere?
Haben Sie andere Projekte gesehen, die versucht haben, dieses Problem anzugehen? Ich würde diesen Artikel gerne mit den besten Methoden aktuell halten.
Ich habe mit diesem Mobile Boilerplate herumgespielt, das zuerst die kleineren Dinge lädt und dann die größeren Versionen hinzufügt, wenn die Bildschirmgröße zunimmt. Ich denke, das ist etwas anders als das, worüber Sie sprechen, aber ich wollte es trotzdem erwähnen.
http://stuffandnonsense.co.uk/projects/320andup/
Übrigens, ich liebe Ihre Seite. Sie hat mir unzählige Male geholfen!
Wenn hypothetisch alle Ihre Bildressourcen über CSS mit background-image geladen werden (ich weiß, das ist nicht realistisch, ich denke laut nach), könnten Sie dann einfach sicherstellen, dass Sie Media-Abfragen um alles legen, was Bilder betrifft? Das heißt, wenn Sie sich auf einem Desktop befinden, prüfen Sie zuerst, ob Ihre Auflösung groß genug ist, und liefern Sie dann das große Bild aus? Ich gehe davon aus, dass mobile Versionen die größeren Desktop-Versionen nicht laden würden, wenn Sie das tun, richtig?
Und in Bezug auf Elemente, wenn Sie standardmäßig eine Regel haben, die besagt:
img { display none; }
… Und dann Media-Abfragen verwenden, um display selektiv auf inline/block/whatever zu setzen, wenn Sie eine bestimmte Auflösungsanforderung erfüllen, würden kleinere Bildschirmgeräte dann überhaupt Bildressourcen laden, obwohl display auf none gesetzt ist?
Es gibt Media-Abfragen, die es ermöglichen, die Bildschirmbreite und Ähnliches zu prüfen. Irgendwo auf der unendlichen Ressource, die CSS-Tricks ist, hat Chris dies tatsächlich behandelt.
Leider ist Ihre Annahme falsch. Viele (die meisten?) mobilen Browser laden alle Bilder, die sie in einem Stylesheet finden, trotzdem herunter, auch wenn eine Media-Abfrage bedeutet, dass sie niemals verwendet werden.
@Martin Ansty: Würde ein mobiler Browser das Bild laden, wenn es sich um eine Klasse handelt, die nie verwendet wird? Ich dachte, wenn Sie den Browser erkennen und dann eine Klasse zum Body hinzufügen, könnten Sie spezifische Bilder für spezifische Browser angeben… daher würden nicht verwendete Klassen nicht geladen werden.
Ich habe ein paar Tests in Firefox mit dem FireBug-Add-on durchgeführt. Ich habe festgestellt, dass Bilder auf nicht verwendeten Klassen nicht geladen wurden. Wenn Sie dies selbst überprüfen möchten, finden Sie es im Abschnitt Net > Images… dort werden alle Bilder angezeigt, die geladen werden.
Ich mache es genau so, wie Sie es vorschlagen, mit allen Bildern als Hintergrundbilder und Media-Abfragen, um Bilder zu ändern. Ich verwende die gleiche Technik, mit background-size, um @2x-Bilder auf dem iPhone4 anzuzeigen. Meine Server-Logs spiegeln nicht wider, dass die meisten mobilen Browser alle Bilder herunterladen. Es scheint gut zu funktionieren.
Ich liebe den PHP-Weg :-D
Erzählen Sie mehr?
Ich möchte mehr erfahren.
Da ich immer im WordPress-Umfeld arbeite, könnte PHP eine gute Option sein.
http://www.dannyherran.com/2011/02/detect-mobile-browseruser-agent-with-php-ipad-iphone-blackberry-and-others/
Dieses Skript funktioniert ziemlich gut und könnte verwendet werden, um verschiedene PHP-Dateien auszuwählen.
Was ist mit Sencha.io Src (früher Tinysrc)?
http://www.sencha.com/products/io/
Ich benutze das auf einigen Websites und es funktioniert für mich ziemlich gut.
Selbst wenn Sie Media-Abfragen verwenden, werden ALLE in Ihrem CSS angegebenen Assets geladen. Ich habe heute darüber geschrieben: http://wolfslittlestore.be/2011/06/28/load-times-responsive-images/
Jedes Bild als Hintergrundbild einzustellen, ist in einem Kontext, in dem Inhalte von einem Client über einen WYSIWYG-Editor wie FCK oder TinyMCE eingegeben werden, nicht realistisch.
Und selbst wenn es möglich wäre, wäre es eine wirklich schlechte Idee, da es die Semantik des Webs bricht. Google Bilder wird Ihre Hintergrundbilder nicht indizieren.
Ich glaube, Sie könnten auch alle Ihre background-image-Deklarationen in zwei separate Stylesheets legen und Media-Abfragen auf diese Weise verwenden, um zu bestimmen, welches Bild initial geladen werden soll.
Oder übersehe ich etwas mit dieser Route (abgesehen vom Laden zweier Bildersätze, wenn Sie Ihr Browserfenster in der Größe ändern)?
Verdammt! Ich wünschte wirklich, Sie könnten Kommentare bearbeiten.
<link rel=”stylesheet” media=”screen and (max-width: 800px)” href=”small_graphics.css”>
<link rel=”stylesheet” media=”screen and (min-width: 801px)” href=”normal_graphics.css”>
Natürlich würde dies nur für Hintergrundbilder funktionieren, nicht für tatsächliche img-Tags!
Dies ist ein kritisches Thema. Dies betrifft nicht nur mobile Grafiken, sondern auch Websites, die große detaillierte Grafiken verwenden. Ich ziehe es vor, zuerst Bilder mit geringer Qualität zu laden, damit die Website ihren vollständigen Inhalt schneller lädt, und dann hochwertige Bilder anzuwenden, nachdem die Seite geladen wurde. Früher konnten wir lowsrc dafür verwenden, aber die Verwendung einer neuen Technik, die nicht nur die Bildschirmgröße, sondern auch die Netzwerkgeschwindigkeit erkennt, wäre sehr nützlich.
Welche Art von Methode verwenden Sie, um von niedriger Auflösung zu hoher Auflösung zu gelangen?
Dieses Beispiel ändert den HTML-Hintergrund, nachdem die Seite geladen wurde, aber es könnte für Inline-Bilder und ohne die Verwendung von Hintergründen angepasst werden, z. B. durch die Verwendung eines alternativen img-Attributs.
$(window).load(function(){
$(“html”).addClass(“bgHighRes”)
})
Ich brauche etwas Hilfe bei der Verwendung von PS CS5.
Ich glaube, Sie sind im falschen Gebäude. Googeln Sie stattdessen danach, Sie werden viel bessere Ergebnisse erzielen.
Oder versuchen Sie die Seite von Envato: http://psd.tutsplus.com/
Ich habe ein wenig jQuery in Kombination mit timthumb.php für die Homepage eines Freundes verwendet. Das Skript sieht so aus
Dies diente dazu, dass er das Homepage-Bild ändern konnte, indem er das WordPress-Beitragsbild für die Seite festlegte.
Ich habe vergessen zu erwähnen, dass es ursprünglich eine Diashow sein sollte (daher der Selektor „#homepage-slideshow“), aber er zog es vor, ein einzelnes Bild zu verwenden. Es ist unter: http://www.charlesmellersh.com/
Ich bin neu in CSS und in dieser Website insgesamt, aber nach dem Lesen der Techniken und der Kommentare glaube ich, dass ich einen Algorithmus entwickelt habe, um dieses Problem zu lösen…
mobile CSS einstellen
Bildschirmgröße prüfen
if (screen size == desktop) then change css to desktop css
das in den Teil der Website einfügen
einfacher Code, ich denke, das sollte gut funktionieren, indem es das richtige CSS für mobile/Desktop festlegt… Ich habe es noch nicht getestet, da ich bei der Arbeit bin, werde es tun und später zurückchecken, wenn ich nach Hause komme
Das erscheint ziemlich interessant.
Hat jemand negatives oder positives Feedback dazu?
Kevin Sweenys Code scheint dasselbe zu tun, nur als Standardpraxis.
Bin ich verwirrt?
Wenn nicht, löst es immer noch nicht das Problem mit den Bild-Tags im Markup, worum es in diesem Beitrag geht.
Ich bin vor einiger Zeit auf dasselbe Problem gestoßen und habe eine meiner Meinung nach gute Lösung gefunden. Obwohl ich PHP kenne und liebe, kostet mich das Hosten dynamischer Websites mehr. Daher musste ich das kleinere Bild nur mit JavaScript laden. Wenn die Seite fertig ist (aber die Bilder noch nicht geladen sind), bearbeite ich einfach den src aller Bilder auf der Seite. Ich habe alle meine kleineren Auflösungsbilder in einem Ordner /m und behalte die gleiche Ordnerstruktur wie /media, wo alle meine Desktop-Bilder liegen. Auf diese Weise kann ich einfach „media/“ durch „m/“ im src ersetzen. Hier ist mein Code.
$(document).ready(function() {
// Bilder hier ersetzen
if(480 >= window.innerWidth) {
$(“img”).attr(‘src’,function(i, val) {
return val.replace(‘media’,’m’);
});
}
});
Ich möchte auf einen häufigen Fehler von JavaScript-Lösungen hinweisen. Es ist nicht die Bildschirmgröße (screen.width und screen.height), die uns interessiert, sondern die Viewport-Größe (document.documentElement.clientHeight und document.documentElement.clientWidth). Während dies bei mobilen Browsern gleich sein mag, ist es bei Desktop-Browsern definitiv nicht so. Warum sollte ein Desktop-Browser, der mit 600×400 Pixeln auf einem 1920×1080-Bildschirm läuft, dieselben Bilder erhalten wie einer, der im Vollbildmodus bei 1920×1080 läuft?
Gab es nicht vor ein paar Tagen einen Artikel darüber? https://css-tricks.de/9778-screen-resolution-notequalto-browser-window/
Was ist mit der Angabe aller Elemente mit einem data-largeimage src und der Verwendung dieses mit JavaScript, um das src=”” Attribut zu ersetzen, wenn der Viewport größer als z. B. 1024px ist.
Das ursprüngliche src=”” im img-Tag ist eine mobile Version des Bildes, aber auf dem Desktop wird es sofort durch die größere Bild-src ersetzt, die in data-largeimage=”urltobiggerimage” angegeben ist, aufgrund des JavaScripts, das eine Desktop-Auflösung erkannt hat.
Irgendwelche Gedanken? (Ich werde später ein Beispiel posten)
Wie wäre es hiermit…
Kontextspezifische Bilder
* { margin: 0; padding: 0; }
img{ width:100% }
body { background: #CCC; }
#page-wrap { width: 256px; margin: 0 auto; }
@media (max-width:769px) {
#page-wrap { width: 150px; margin: 0 auto; }
}
var winW;
var img;
var imgState;
function specificImage() {
img = document.getElementsByTagName(“img”);
winW = window.innerWidth;
if (winW >= 770 && imgState != “desktop”) {
imgState = “desktop”;
for ( var t = 0; t < img.length; ++t ) {
var imageChanger=img[t].src;
img[t].src = imageChanger.replace("mobile","desktop");
};
}
else if (winW <= 770 && imgState == "desktop") {
imgState = "mobile";
for ( var t = 0; t < img.length; ++t ) {
var imageChanger=img[t].src;
img[t].src = imageChanger.replace("desktop","mobile");
};
};
};
window.onresize = function () {
specificImage();
};
Alles, was Sie brauchen, sind zwei Unterordner in Ihrem Bilderordner, einer mit den großen Bildern und der andere mit den kleinen Bildern. Die Seite lädt standardmäßig die kleinen Bilder, erkennt dann die Fenstergröße. Wenn das Fenster größer als 769px ist (in diesem Fall), lädt es die größeren Bilder. Es tauscht die Bilder auch beim Ändern der Größe aus.
Hoppla! Hab den Code vergessen zu ändern…
Sie könnten wahrscheinlich die Techniken des Retina Display jQuery Plugins adaptieren: http://troymcilvena.com/post/998277515/jquery-retina
Es hängt ein „-2x“ an einen Dateinamen an, um die höher auflösende Version zu verwenden, wenn es ein High-DPI-Display erkennt. Sie müssen natürlich die Höhe und Breite einstellen, damit es nicht doppelt so groß ist.
Sie könnten dasselbe tun, indem Sie nur die Bildschirm-/Fensterbreite erkennen. Ersetzen Sie die Bilder durch die größeren Versionen, wenn eine größere Breite erkannt wird. Ohne H & W eingestellt, wird es die Größe haben, für die Sie es eingestellt haben. Es sollte nicht viel dauern, bis es das beim Ändern der Fenstergröße on the fly erledigt.
Ich denke, es ist weniger schädlich – wenn möglich, natürlich – einfach Bilder auf kleinere Bildschirme zuzuschneiden. Die Bild-Downloads werden größer, aber wir haben immer noch die Möglichkeit, Media-Abfragen zu verwenden, um das Website-Layout on-the-fly (beim Ändern der Browserfenstergröße) zu ändern und uns nicht auf die Erkennung von Mobile User-Agents zu verlassen.
Meiner Meinung nach ist das leichter gesagt als getan. Obwohl viele mobile Nutzer heutzutage 3G oder besser haben, bin ich mir nicht sicher, ob das wirklich allgegenwärtig ist. Unabhängig davon scheint es falsch zu sein, dem Benutzer zwangsweise größere Bilder aufzuzwingen. Nicht nur, dass Sie deren von Natur aus langsamere Verbindung ignorieren würden, sondern Sie respektieren auch nicht, dass viele Nutzer keine unbegrenzten Datentarife haben und ihre Downloads unter einem bestimmten Limit halten müssen, um Übergebührgebühren zu vermeiden.
Es klingt, als ob viele Leute zwischen Hintergrundbildern, die über CSS geladen werden, und Bildern im HTML unterscheiden.
Dieser Artikel handelt von Bildern im HTML.
Josh. Ich habe deinen Code nicht ausprobiert, aber er ist ungefähr das, was ich mir vorgestellt hatte. Kombiniert mit einem Skript, das beide Versionen des IMG automatisch erstellt, wenn sie über ein CMS hochgeladen werden, ist es ein Gewinner.
Hallo, schöner Artikel. Windows kann auch URL-Rewriting unterstützen: IIS7 hat es eingebaut und IIS6 kann ein Plugin eines Drittanbieters verwenden, z. B. von HeliconTech. Es ist unwahrscheinlich, dass es in Shared-Hosting-Paketen auf Basis von IIS6 vorhanden ist, aber da die Hosts aufgerüstet werden, können mehr von uns .htaccess-ähnliche Vorteile genießen!
Wie kann ich den CSS3-Weg in einer CDN-Umgebung wie auf meiner Seite verwenden?
http://www.benchee.com/
Könnte ich jede mögliche Größe eines Bildes auswählen und viele verschiedene Subdomains für jedes Bild haben?