object-fit und object-position sind derzeit meine beiden Lieblings-CSS-Eigenschaften. Sie geben Entwicklern die Kontrolle über den Inhalt innerhalb eines img- oder video-Elements, ähnlich wie wir den Inhalt eines background mit background-position und background-size manipulieren können.
Zuerst tauchen wir in object-fit ein.
Diese Eigenschaft definiert, wie ein Element, wie z. B. ein img, auf die Breite und Höhe seiner Inhaltsbox reagiert. Mit object-fit können wir dem Inhalt mitteilen, diese Box auf verschiedene Arten auszufüllen, wie z. B. "behalte dieses Seitenverhältnis bei!" oder "strecke dich und nimm so viel Platz wie möglich ein!"
Hier ist ein Beispiel:

Dieses Bild ist 400px x 260px groß. Wenn wir dieses Bild so gestalten...
img {
width: 200px;
height: 300px;
}
...dann erhalten wir eine unschöne Verzerrung, weil das Bild gequetscht wird, um in den Container zu passen.
Siehe den Stift 1b15cf30a6226d9f419b4f765458a059 von Robin Rendle (@robinrendle) auf CodePen.
Der Inhalt unseres img wird den gesamten verfügbaren Platz in seiner neuen Box einnehmen, die wir durch Ändern von Höhe und Breite erstellt haben, und zerstört dadurch sein ursprüngliches Seitenverhältnis.
Um das Seitenverhältnis des Bildes zu erhalten und gleichzeitig den Platz auszufüllen, können wir object-fit verwenden.
.cover {
object-fit: cover;
}
Siehe den Stift 7080df9cb7158c0860b8a66db9667a7d von Robin Rendle (@robinrendle) auf CodePen.
Das Bild links ist unser Original und das Bild rechts hat die Seiten des Bildes abgeschnitten, wobei unser Seitenverhältnis nun erhalten bleibt! Das mag in diesem Maßstab keine besonders interessante Entwicklung sein, aber sobald wir uns mit realistischeren Interfaces beschäftigen, wird die Leistungsfähigkeit von object-fit offensichtlich.
Nehmen wir ein weiteres Beispiel.
Siehe den Stift WrBzey von CSS-Tricks (@css-tricks) auf CodePen.
Hier haben wir zwei Bilder und möchten, dass sie 50 % der Browserbreite (damit sie nebeneinander liegen) und 100 % der Höhe einnehmen. Das können wir mit Hilfe von Viewport-Einheiten tun.
img {
height: 100vh;
width: 50vw;
}
Das Problem ist, dass wir beim Ändern der Browsergröße das Seitenverhältnis der Bilder ändern, was zu allen möglichen Merkwürdigkeiten führen kann. Stattdessen möchten wir ihr Seitenverhältnis beibehalten, genau wie in der vorherigen Demo, und wir können genau die gleiche Methode verwenden, um dies zu tun. object-fit: cover zur Rettung!
Siehe den Stift YwbeoG von CSS-Tricks (@css-tricks) auf CodePen.
Versuchen Sie, den Browser erneut zu vergrößern. Keine Merkwürdigkeiten beim Seitenverhältnis, oder? Das ist auch außerordentlich hilfreich, wenn wir Bilder mit unterschiedlichen Abmessungen haben, da diese effektiv von ihrer Begrenzungsbox beschnitten werden.
cover ist nur einer von vielen Werten für object-fit, über die Sie im Almanac-Eintrag mehr erfahren können, aber bisher ist es der einzige Wert, der sich in der täglichen Interface-Entwicklung für mich als am nützlichsten erwiesen hat.
Kommen wir zu meiner nächsten Lieblingssache: object-position.
Wir richten die Dinge ein, indem wir dasselbe Bild wie zuvor verwenden und diese Stile anwenden.
img {
background: yellow;
height: 180px;
object-fit: none;
}
Zwei Dinge sind hier zu beachten: Wir müssen die Abmessungen für unser Bild deklarieren, damit object-position ordnungsgemäß funktioniert, und wir müssen object-fit auf none setzen, damit das Bild verschoben werden kann, anstatt die gesamte Box auszufüllen, wie es standardmäßig der Fall wäre. Dies ist etwas sinnvoller, wenn man bedenkt, dass der Standard für object-fit bei einem Bild fill ist, auch wenn man ihn nicht deklariert.
Apropos Standards: object-position zentriert alle Objekte horizontal und vertikal ohne Wert.
img {
background: yellow;
height: 180px;
object-fit: none;
object-position: 50% 50%; /* even if we dont declare this the image will still be centered */
}
Der erste Wert verschiebt das Bild nach links oder rechts und der zweite verschiebt es nach oben oder unten. Wir können mit diesen Werten hier experimentieren.
Siehe den Stift Object position von Robin Rendle (@robinrendle) auf CodePen.
Wir können das Bild sogar innerhalb seiner Inhaltsbox verschieben, damit wir die zuvor festgelegte background-color sichtbar machen können.
Aber wie ist das nützlich? Gute Frage! Nun, in einem kürzlichen Projekt stellte ich fest, dass ein bestimmter Abschnitt eines Bildes zur Mitte verschoben werden musste, damit er die Aufmerksamkeit des Lesers erregte. Wir mussten kein neues Bild laden und hatten daher in diesem Fall kein <picture>-Element benötigt. Wir wollten das Bild nur ein wenig verschieben.
Abgesehen von der Verschiebung des Fokus eines Bildes bin ich mir nicht sicher, wofür diese Eigenschaft ansonsten praktisch nützlich sein könnte. Aber ich habe mit object-position herumgespielt, um zu zeigen, wie man Teile eines Bildes ausblenden und dann beim Klicken Teile davon wieder anzeigen kann, wie in dieser Demo
Siehe den Stift SVG sprite with object-position von Robin Rendle (@robinrendle) auf CodePen.
Ich habe nicht experimentiert, wie oder warum man dies für <video>-Elemente verwenden könnte. Vollbildvideos, die alle Ränder treffen, vielleicht? Es gibt noch viel mehr zu lernen und zu erforschen, wenn es um diese Eigenschaften geht.
Wie ist die Unterstützung?
Im Allgemeinen ziemlich gut!
object-fit wird von allem außer IE/Edge unterstützt. object-position wird hingegen von allem außer Safari und IE/Edge unterstützt.
Ich wusste nicht einmal, dass diese Eigenschaft existiert! Sie sieht super nützlich aus, also werde ich sie ausprobieren müssen.
Ich bin auch neu in diesen Eigenschaften und sehr begeistert, sie in meinem aktuellen Projekt auszuprobieren!
Gut gemacht. Ich habe neulich einen Artikel über object-fit veröffentlicht, der einen einfachen Fallback für IE enthält (IE unterstützt ihn überhaupt nicht).
https://pawelgrzybek.com/image-tag-vs-background-property/
Ich habe festgestellt, dass die Handhabung von object-fit durch Firefox etwas durcheinander ist, wenn sie in Kombination mit 2D/3D-Translation verwendet wird. Sehen Sie hier ein Beispiel, bei dem object-fit in Firefox ein abruptes Quetschen verursacht, gefolgt von einer Übergang und dann einem Entquetschen: http://codepen.io/davecranwell/pen/XXwbPQ
Kennt jemand eine Lösung dafür?
Das Problem mit dem Firefox-Wrapper 1 img ist die Deklaration von
height: 100%;. Wenn Sie sie durchheight: auto;ersetzen, ist das Problem behoben. Allerdings ändert sich die Position des Bildes von zentriert zu den unten befindlichen Hacks.object-position Anwendungsfall
Zoomen! Stellen Sie ein übermäßig großes Bild bereit, das standardmäßig auf die von Ihnen festgelegte Größe geschrumpft wird. Beim Hovern setzen Sie "object-fit: none" und verwenden JS, um object-position auf einen Prozentsatz einzustellen, der der Mausposition innerhalb des Bildes entspricht – sofortige Zoom-Funktionen!
Was für eine super coole Idee! Das habe ich noch nirgends gesehen, also habe ich eine schnelle Demo erstellt, wie es in der Praxis aussehen könnte
http://s.codepen.io/robinrendle/debug/d65ccca115fdd4def0171019939635c3
Es wäre cool, von "object-fit: fill" zu "object-fit: none" zu animieren, damit man einen schönen Zoom-Effekt sieht, obwohl mir keine einfache Möglichkeit einfällt, das zu umgehen, da die Eigenschaft nicht animierbar ist.
Wie üblich... Verdammt IE
Einverstanden. Ich würde nicht sagen, dass die Browserunterstützung "ziemlich gut" ist, wenn IE sie nicht unterstützt – schließlich nutzt ein großer Teil der realen Welt IE. Wenn nur IE8 sie nicht unterstützt, dann würde ich ja sagen, die Browserunterstützung ist sehr gut.
Ich persönlich würde sterben, um all meine Websites mit dem modernsten CSS und JS zu erstellen, unabhängig davon, ob IE oder Safari es sich leisten, diese Funktionen zu unterstützen, aber das funktioniert für meine Kunden nicht. Also bleibe ich für kritische Layouts vorerst bei Variationen von Uncle Daves altem gepolstertem Kasten, um
object-fitzu simulieren.(Nebenbei bemerkt, ist
object-fit: containäußerst nützlich, um Bilder unbekannter Abmessungen in eine Box bekannter Abmessungen einzupassen und zu zentrieren, wie bei gekachelten Symbolen. Dies kann mit Uncle Daves gepolstertem Kasten irgendwie gemacht werden, aber nur, wenn man das Seitenverhältnis des Bildes kennt.)Großartig, ich werde mich definitiv damit beschäftigen.
Es ist ein cooles Feature, aber nicht gut genug unterstützt für meine Standards. Und das einzige Polyfill, das ich finden kann, ist veraltet... :(
Ja, das ist ärgerlich. Ich verwende inzwischen ein bisschen JS, um
img.object-fitin Hintergrundbilder auf dem übergeordneten Container zu konvertieren, wo man stattdessen nurbackground-sizeverwendet. Es erfordert etwas mehr Konfiguration als das einfache Einfügen eines Polyfills, aber es wird für den Moment reichen!Das Folgende funktioniert auch mit
srcset.(etwas ungetestet)
Ich habe gerade ein 1kb Polyfill für
object-fitfür Bilder entwickelt bfred-it/object-fit-images, das gut in IE9+ funktioniert (möglicherweise auch in niedrigeren Versionen, aber derzeit ungetestet).Der einzige wirkliche "Fehler" in
object-fitist, dass es keine Unterstützung für IE und Edge gibt, und das ist leider kein geringer Fehler. Es ist eine großartige Eigenschaft zu verwenden, aber wenn Ihr Kunde einen dieser beiden Browser verwendet, selbst nur um seine Website zu überprüfen, sieht er verfälschte Bilder.Man kann immer noch einfach
backgroundmit url darin verwenden und dannbackground-sizeaufcoversetzen, um das Bild zu "passen", aber leider kann manobject-fitnicht perfekt reproduzieren (die Bestimmung der Größe Ihres Bildes, um das div darauf einzustellen, ist eine ziemliche Belästigung).Wir müssen nur hoffen, dass die MS-Leute diese Eigenschaft in den nächsten Versionen ihres Edge-Browsers zum Laufen bringen werden (da IE sowieso eingestellt wird).
Gut, sobald wir Unterstützung haben, wird dies die fummelige Technik vereinfachen, die das derzeit löst.
.container {
position: relative;
overflow: hidden;
width: 400px;
height: 300px;
}
video {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%); // ie9
min-width: 100%;
min-height: 100%;
}
Verwendung von top: 0; und translateX(-50%), etc., um die Positionierung zu verschieben.
Für diejenigen, die den Verlust des object-fit Polyfills betrauern...
Eine Umgehung für object-fit:cover wurde entwickelt.
https://medium.com/@primozcigler/neat-trick-for-css-object-fit-fallback-on-edge-and-other-browsers-afbc53bbb2c3#.igtqmicog
Chrome ist sehr gewöhnlich, wenn es darum geht, Bilder auf dieser Seite korrekt anzuzeigen. Ich habe die Seite auf Chrome 47.0.2526.80, Firefox 44.0.2 und Internet Explorer 11 geöffnet, und nur Firefox zeigt den Inhalt korrekt an. Sowohl Chrome als auch IE haben das Bild zu einem Format verzerrt, das überhaupt nicht natürlich aussah.
Robin, object-position wäre nützlich, wenn man die Breite, Höhe oder beides des Containers skalieren möchte, aber nicht das Bild. Stattdessen wird das Bild getrimmt.
Manchmal macht das Skalieren eines Bildes Details zu klein, daher ist das Trimmen eine bessere Option.
Toller Artikel und eine großartige CSS-Eigenschaft. Kein ständiges Benutzen von background-size/background-position mehr. Ich bin vor ein paar Wochen auf diese Eigenschaften gestoßen, als ich die Muzli Chrome-Erweiterung inspiziert habe. Ein toller Fund.
Ich werde es mir auf jeden Fall ansehen, aber für den letzten CodePen scheint es ein Problem zu geben, die Position sollte nicht
0 0,50% 0und100% 0sein, da es keine horizontale Verschiebung gibt?