Nehmen wir an, Sie haben ein Bild, das Sie in einem <img> verwenden, das 800 × 600 Pixel groß ist. Wird es auf Ihrer Website tatsächlich 800 Pixel breit angezeigt? Es ist *sehr wahrscheinlich*, dass dies nicht der Fall sein wird. Wir neigen dazu, Bilder in flexible Containerelemente zu packen, und das Bild darin wird auf width: 100%; gesetzt. Möglicherweise ist das Bild dann 721 Pixel breit oder 381 Pixel breit oder was auch immer. Was sich *nicht* ändert, ist das Seitenverhältnis dieses Bildes, es sei denn, Sie quetschen es unbeholfen zusammen (unter Berücksichtigung des Spezialfalls von object-fit).
Der Hauptpunkt ist, dass wir nicht wissen, wie viel vertikalen Platz ein Bild einnehmen wird, bis dieses Bild geladen ist. Das ist die Ursache für Ruckler! Schreckliche Ruckler! Sie sind überall und furchtbar.
Update! Das ist tatsächlich passiert. Sie müssen also nur die richtigen Attribute für Breite und Höhe des Originalbilds angeben, und sie werden ohne Ruckler geladen, selbst wenn CSS das Bild flexibel macht. Tun Sie es also so: <img src="image.jpg" width="800" height="600">
Es gibt heute Möglichkeiten, Elemente mit festem Seitenverhältnis in HTML/CSS zu erstellen. Keine der Optionen ist besonders elegant, da sie auf dem "Hack" basieren, eine Höhe von Null einzustellen und die Höhe der Elemente durch Polsterung zu erzwingen. Wäre es nicht schöner, eine Plattformfunktion zu haben, die uns hier hilft? Der erste Ansatz zur Lösung dieses Problems, den ich kenne, ist das Attribut intrinsicsize. Eric Portis hat in Jank-Free Image Loads beschrieben, wie das wunderbar funktioniert.
Wir würden das bekommen
<img src="image.jpg" intrinsicsize="800x600" />
Dies ist derzeit hinter einem Flag in Chrome 71+ versteckt und löst dieses Problem wirklich.
Aber...
Die Eigenschaft intrinsicsize ist brandneu. Sie hilft nur auf Websites, auf denen die Entwickler davon wissen und sich die Mühe machen, sie zu implementieren. Und sie ist knifflig! Bilder werden tendenziell beliebig dimensioniert, und das Attribut intrinsicsize muss für jedes Bild individuell angepasst werden, um korrekt zu sein und seine Aufgabe zu erfüllen. Das heißt, wenn es überhaupt in die Standards aufgenommen wird.
Es gibt eine weitere Möglichkeit! Eric sprach auch über die CSS-Eigenschaft aspect-ratio als potenzielle Lösung. Es ist auch noch nur eine Entwurfsspezifikation. Man könnte sagen, aber wie ist das hilfreich? Es muss genauso maßgeschneidert sein wie intrinsicsize, was bedeutet, dass man es als Inline-Styles verwenden müsste, um hilfreich zu sein. Vielleicht ist das nicht so schlimm, wenn es ein großes Problem löst, aber Inline-Styles sind ein solcher Aufwand beim Überschreiben, und es scheint, dass der HTML-Attributansatz mehr dem Geist von Bildern entspricht. Denken Sie daran, wie srcset ein Hinweis für Browser ist, welche Bilder zum Download verfügbar sind, und dem Browser erlaubt, das beste für die Situation auszuwählen. Dem Browser die aspect-ratio im Voraus mitzuteilen, ist ähnlich nützlich.
Ich habe von Jen Simmons über eine absolut fantastische Methode gehört, dies zu handhaben: Fügen Sie dem UA-Stylesheet ein Standard-Seitenverhältnis hinzu, basierend auf den vorhandenen width- und height-Attributen der Elemente. So:
img, video {
aspect-ratio: attr(width) / attr(height);
}
Lassen Sie das auf sich wirken.
Wenn Sie bereits haben:
<img src="image.jpg" width="800" height="600" />
Es hat automatisch das richtige Seitenverhältnis, wenn die Seite geladen wird. Das ist großartig.
- Es ist leicht zu verstehen.
- Ein Großteil des Internets hat diese Attribute bereits auf seinen Bildern.
- Neue Entwickler werden keine Probleme haben, dies zu verstehen, und alte Entwickler werden dankbar sein, dass hier wenig (wenn überhaupt) Arbeit zu tun ist.
Ich mag die Idee des CSS-Features. Aber ich mag die Idee, es in das UAUA-Stylesheet einzufügen, 100 Mal mehr. Das ist keine Kleinigkeit, die man in Betracht ziehen muss - und ich bin nicht qualifiziert, alle Auswirkungen zu verstehen -, aber es erscheint auf den ersten Blick als etwas sehr Großartiges.
Jen hat ein Ticket für Leute geöffnet, die ihre Gedanken äußern können und verlinkt auf das Bug-Ticket, wo Firefox dies testen wird, um zu sehen, wie es läuft.
Wie kombiniert man das
height-Attribut mit responsiven Bildern?Wenn es eine Inline-Höhe hat, haben Sie meiner Meinung nach nur eine Option. "height: auto !important;"
Ich nehme an, all dies dient dazu, Neuberechnungen zu verhindern, wenn die Bilder geladen werden.
Ich bin für neue Funktionen, also geben Sie uns bitte sowohl das neue "intrinsicsize"-Attribut für das "img"-Element als auch die "aspect-ratio"-Eigenschaft in CSS. Vielen Dank.
Ich bin mir jedoch nicht sicher, warum die CSS-Eigenschaft "aspect-ratio" nur als Inline-Stil im HTML funktionieren sollte.
Malt der Browser die Seite nicht, nachdem er das CSS gelesen und diese Stile auf die Elemente angewendet hat? Ich denke, könnte man nicht einfach jedes Bild in einen "div" oder "figure" einpacken und darauf eine aspect-ratio-Eigenschaft in einem externen Stylesheet setzen und dann die Bilder seinen Container mit
object-fit: cover;füllen lassen?Nehmen wir also an, alle unsere Bilder sind in einem Div verpackt, das eine Klasse von "gallery-image" hat. Könnte ich nicht einfach das Folgende in einem externen Stylesheet schreiben?
... dann würde der Browser einfach eine Reihe von 16/9-Seitenverhältnis-Boxen malen und sie mit dem darin enthaltenen Bild füllen?
Offensichtlich wären zusätzliche Layout-Codes für ein Gitter oder eine Reihe von Bildern erforderlich... aber all das, denke ich, würde in einer externen CSS-Datei funktionieren.
Ich habe auch seit Jahren keine "width"- und "height"-Attribute mehr in meine "img"-Elemente aufgenommen, seit responsives Webdesign aufkam und unsere Bilder größtenteils eine flexible Größe hatten.
Ich hoffe wirklich, dass die CSS-Eigenschaft aspect-ratio kommt. Ich benutze derzeit %padding-bottom als Workaround für responsive Seitenverhältnisse.
Übrigens: Für Nicht-Muttersprachler ist das Wort "intrinsicsize" absolut schrecklich. Warum nicht "ratio" oder ein anderes Wort...
Sie könnten auch benutzerdefinierte Eigenschaften verwenden, um Ihren Bildern ein Seitenverhältnis hinzuzufügen, ohne ein festes Höhenattribut zu definieren.
Beispiel
HTML
img src=”https://via.placeholder.com/3/4″
style=” –image-width: 800px;” alt=””
CSS
img{
width: var(–image-width);
height: calc(var(–image-width)*3/4);
}
Formel: Höhe = Breite * Seitenverhältnis (z.B. 16/9, 3/4, 8/5 usw.)
Codepen
img {
max-width: 100%;
height: auto;
}
Es muss nicht kompliziert sein.
Wie viel vertikalen Platz sollte der Browser also reservieren, bevor dieses Bild geladen ist, für ein beliebiges Bild?
Es hat keine Ahnung, daher Ruckler.
Aber Sie haben Recht, es muss nicht kompliziert sein, schauen Sie sich den Artikel oben an.
Sie benötigen sowohl das CSS *als auch* die Attribute width und height im img-Element. Letzteres scheint nervig, aber Sie tun das bereits auch mit intrinsicsize... Aber ja, ich kann bestätigen, dass es tatsächlich funktioniert (max-width: 100% überschreibt die Breite und height: auto verlässt sich auf die Attribute des img, um die tatsächliche Höhe zu ermitteln, die verwendet werden soll).
Warum implementieren wir nicht einfach
<amp-img>und nutzen deren integrierte Werkzeuge dafür?sagte niemand jemals.
Ich habe jedes Bild auch in einen Div mit Seitenverhältnis als Inline-Stil verpackt.
:root {
--main-width: 60vw;
}
.gallery-image {
width: var(--main-width);
height: calc(var(--main-width) * var(--aspect-ratio));
}
.gallery-image img {
width: 100%;
height: auto;
}
Gabelung des Pens von https://css-tricks.de/the-complete-guide-to-lazy-loading-images/
Es ist eigentlich keine Kodierung der SVG-Zeichenkette erforderlich. Das ist gültig
src=”data:image/svg+xml,”
Toller Artikel und ein SUPER schneller Gewinn am Ende zur Implementierung. Wir sollten sowieso width- und height-Attribute für Bilder setzen, also ist das cool. Ich bin aber etwas verwirrt. Können Sie ein Beispiel für einen Anwendungsfall geben, in dem Sie wissen möchten, welchen vertikalen Platz ein Bild einnehmen würde?
Hallo Kevin,
Sagen wir, Sie klicken auf einen Link zu einer Dokumentation, und dieser Link führt Sie direkt zu einer Anker-Markierung auf halber Höhe einer Seite.
Während Bilder oberhalb Ihrer aktuellen Position geladen werden, verschieben sie den Inhalt weiter nach unten auf der Seite.
Unter Verwendung der im Artikel beschriebenen Techniken wäre der Browser in der Lage, den richtigen vertikalen Platz zu lassen und diese Verschiebung zu verhindern.