Skalieren Sie das Bild so, dass es in einen Begrenzungsrahmen passt
Lesezeit: 1 Minute
Thomas Guillory
Gibt es eine reine CSS-Lösung, um ein Bild in einen Begrenzungsrahmen zu skalieren (unter Beibehaltung des Seitenverhältnisses)? Dies funktioniert, wenn das Bild größer als der Container ist:
Meinst du Höhe: 100 % und Breite: 100 %? Haben Sie eine gewünschte Dimension, die Sie erreichen möchten? Andernfalls könnten Sie das Bild auch dehnen und zwingen, diese Dimensionen zu erreichen.
– Mikevoermans
3. April 12 um 13:42 Uhr
@mikevoermans Schauen Sie sich meine beiden ersten Beispiele an: Ich möchte das Bild strecken, bis eine der Dimensionen 100% und die andere <=100% beträgt
@gryzzly Die Beispiele sprechen für sich! Wenn sie sich die Beispiele angesehen hätten, war das offensichtlich.
–Thomas Guillory
3. April 12 um 14:12 Uhr
@Artimuz Ich bin völlig anderer Meinung. Drei der Antworten auf Ihre Fragen (einschließlich meiner) deuten darauf hin, dass dies NICHT offensichtlich war.
– Khan
3. April 12 um 14:23 Uhr
Thomas Guillory
Dank CSS3 gibt es eine Lösung!
Die Lösung besteht darin, das Bild als zu setzen background-image und dann die einstellen background-size zu contain.
Schön, obwohl meine Antwort nicht falsch ist (Sie haben speziell nach dem Bild gefragt), ist dies eine großartige Lösung, und ich hätte daran denken sollen. Das einzige Problem ist, dass der IE 8 immer noch so weit verbreitet ist, dass ich mich darauf noch nicht verlassen möchte, aber trotzdem ein netter Fang.
– Stephan Müller
5. April 12 um 10:49 Uhr
Setzen Sie es auf “cover”, wenn Sie kein Letterboxing wünschen: background-size: contains;
– Americanyak
6. Dezember 12 um 16:55 Uhr
Es sollte beachtet werden, dass Sie Bild-URLs mit HTML einfügen können: <div class=image style="background-image: url('/images/foo.jpg');"></div>. Alle anderen Stile sollten mit CSS angewendet werden.
– Andrej Michailow – Lolmaus
28. August 13 um 19:09 Uhr
Ich würde sagen, das ist ein schrecklicher Ansatz. Indem Sie es in ein Hintergrundbild ändern, entfernen Sie die semantische Bedeutung des Bildes im HTML.
– Animation ♦
06.09.13 um 00:16 Uhr
@animuson: Es hat mir immer noch geholfen, da ich HTML/CSS für gedruckte Berichte verwende und mich nicht um Semantik kümmern konnte 🙂
– Christian Wattengård
7. Januar 14 um 11:46 Uhr
Stefan Müller
Hinweis: Obwohl dies die akzeptierte Antwort ist, ist die folgende Antwort genauer und wird derzeit in allen Browsern unterstützt, wenn Sie die Option haben, ein Hintergrundbild zu verwenden.
Nein, es gibt keine CSS-einzige Möglichkeit, dies in beide Richtungen zu tun. Sie könnten hinzufügen
.fillwidth {
min-width: 100%;
height: auto;
}
Um ein Element immer auf 100% Breite zu haben und die Höhe automatisch auf das Seitenverhältnis zu skalieren, oder das Gegenteil:
.fillheight {
min-height: 100%;
width: auto;
}
um immer auf maximale Höhe und relative Breite zu skalieren. Um beides zu tun, müssen Sie feststellen, ob das Seitenverhältnis höher oder niedriger als der Container ist, und CSS kann dies nicht tun.
Der Grund ist, dass CSS nicht weiß, wie die Seite aussieht. Es legt vorher Regeln fest, aber erst danach werden die Elemente gerendert und Sie wissen genau, mit welchen Größen und Verhältnissen Sie es zu tun haben. Die einzige Möglichkeit, dies zu erkennen, ist mit JavaScript.
Obwohl Sie nicht nach einer JS-Lösung suchen, werde ich trotzdem eine hinzufügen, falls jemand sie benötigen könnte. Der einfachste Weg, dies mit JavaScript zu handhaben, besteht darin, eine Klasse basierend auf dem Unterschied im Verhältnis hinzuzufügen. Wenn das Verhältnis von Breite zu Höhe der Box größer ist als das des Bildes, fügen Sie die Klasse „fillwidth“ hinzu, andernfalls fügen Sie die Klasse „fillheight“ hinzu.
Eigentlich gibt es eine Lösung: CSS3-Hintergrundgröße auf enthalten setzen. Siehe meine Antwort.
–Thomas Guillory
4. April 12 um 17:57 Uhr
Du hast vollkommen Recht. Auch wenn es jetzt anderthalb Jahre später ist, habe ich meinen Beitrag editiert.
– Stephan Müller
17. September 13 um 14:01 Uhr
Ich würde davon ausgehen, dass dies die richtige Antwort auf die gestellte Frage ist, nämlich das CSS für das img-Tag. Dies ist relevant, da das img-Tag semantisch Inhalt ist, das Bild als Hintergrund eines div nicht. Während einige Umstände dies unpraktisch machen (wenn Sie das Bild-zu-Container-Verhältnis nicht kennen), ist es für andere genau richtig. Danke.
Ich liebe diese Lösung. Es beantwortet nicht nur die Frage tatsächlich (ich weiß, was für ein Gedanke), es funktioniert auch wunderbar in allen modernen Browsern, ohne auf Javascript zurückgreifen zu müssen!
– ndm13
02. Dezember 14 um 0:25 Uhr
Ich würde gerne eine Geige davon sehen. In meinem Test zum Platzieren eines Bildes in einem 400×400-Container wird das Bild nur in der Ecke abgeschnitten
– Cyberwombat
11. April 15 um 18:45 Uhr
Gute Antwort! @Yashua Sie müssen hinzufügen transform-origin: top left um das Zuschneiden zu stoppen. /Zombie
– XwipeoutX
15. Juni 15 um 1:36 Uhr
Interessant, funktioniert aber nicht auf Chrome. Ergibt eine beschnittene Zeile des Bildes.
– MattK
3. Juli 16 um 14:21 Uhr
@Konstantin Skalierung wird nur benötigt, wenn Sie dies auch möchten vergrößern das Bild (wenn es kleiner als die Breite oder Höhe des Containers ist).
Sie können dies mit reinem CSS und vollständiger Browserunterstützung erreichen, sowohl für vertikal als auch für horizontal lange Bilder gleichzeitig.
Hier ist ein Ausschnitt, der in Chrome, Firefox und Safari funktioniert (beide verwenden object-fit: scale-down, und ohne es zu verwenden):
Eine andere Lösung ohne Hintergrundbild und ohne die Notwendigkeit eines Containers (obwohl die maximalen Größen des Begrenzungsrahmens bekannt sein müssen):
img{
max-height: 100px;
max-width: 100px;
width: auto; /* These two are added only for clarity, */
height: auto; /* as the default is auto anyway */
}
Wenn die Verwendung eines Containers erforderlich ist, können die maximale Breite und die maximale Höhe auf 100 % gesetzt werden:
img {
max-height: 100%;
max-width: 100%;
width: auto; /* These two are added only for clarity, */
height: auto; /* as the default is auto anyway */
}
div.container {
width: 100px;
height: 100px;
}
Meinst du Höhe: 100 % und Breite: 100 %? Haben Sie eine gewünschte Dimension, die Sie erreichen möchten? Andernfalls könnten Sie das Bild auch dehnen und zwingen, diese Dimensionen zu erreichen.
– Mikevoermans
3. April 12 um 13:42 Uhr
@mikevoermans Schauen Sie sich meine beiden ersten Beispiele an: Ich möchte das Bild strecken, bis eine der Dimensionen 100% und die andere <=100% beträgt
–Thomas Guillory
3. April 12 um 13:55 Uhr
@jacktheripper Seitenverhältnis natürlich beibehalten …
–Thomas Guillory
3. April 12 um 13:59 Uhr
@gryzzly Die Beispiele sprechen für sich! Wenn sie sich die Beispiele angesehen hätten, war das offensichtlich.
–Thomas Guillory
3. April 12 um 14:12 Uhr
@Artimuz Ich bin völlig anderer Meinung. Drei der Antworten auf Ihre Fragen (einschließlich meiner) deuten darauf hin, dass dies NICHT offensichtlich war.
– Khan
3. April 12 um 14:23 Uhr