Skalieren Sie das Bild so, dass es in einen Begrenzungsrahmen passt

Lesezeit: 1 Minute

Skalieren Sie das Bild so dass es in einen Begrenzungsrahmen
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:

img {
  max-width: 100%;
  max-height: 100%;
}

Beispiel:

Aber ich möchte das Bild vergrößern, bis eine Dimension 100 % des Containers 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

    –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

Skalieren Sie das Bild so dass es in einen Begrenzungsrahmen
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.

HTML

<div class="bounding-box">
</div>

CSS

.bounding-box {
  background-image: url(...);
  background-repeat: no-repeat;
  background-size: contain;
}

Testen Sie es hier: http://www.w3schools.com/cssref/playit.asp?filename=playcss_background-size&preval=contain

Volle Kompatibilität mit den neuesten Browsern: http://caniuse.com/background-img-opts

Um das div in der Mitte auszurichten, können Sie diese Variante verwenden:

.bounding-box {
  background-image: url(...);
  background-size: contain;
  position: absolute;
  background-position: center;
  background-repeat: no-repeat;
  height: 100%;
  width: 100%;
}

  • 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

Skalieren Sie das Bild so dass es in einen Begrenzungsrahmen
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.

Edit 2: In der Moderne mit object-fit könnte eine noch bessere Lösung sein: https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit

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.

$('div').each(function() {
  var fillClass = ($(this).height() > $(this).width()) 
    ? 'fillheight'
    : 'fillwidth';
  $(this).find('img').addClass(fillClass);
});
.fillwidth { 
  width: 100%; 
  height: auto; 
}
.fillheight { 
  height: 100%; 
  width: auto; 
}

div {
  border: 1px solid black;
  overflow: hidden;
}

.tower {
  width: 100px;
  height: 200px;
}

.trailer {
  width: 200px;
  height: 100px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="tower">
  <img src="http://placekitten.com/150/150" />
</div>
<div class="trailer">
  <img src="http://placekitten.com/150/150" />
</div>

  • 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.

    – duncanwilcox

    2. Januar 14 um 11:43 Uhr

  • An alle, die das wie ich bei Google gefunden haben: Sie können Object-Fit verwenden, um das mit reinem CSS zu tun. developer.mozilla.org/en-US/docs/Web/CSS/object-fit

    – lxhom

    8. August 21 um 16:49 Uhr

  • Danke @lxhom, habe diese Info auch hinzugefügt 🙂

    – Stephan Müller

    12. August 21 um 15:03 Uhr

Skalieren Sie das Bild so dass es in einen Begrenzungsrahmen
Wladimir Pantelejew

Hier ist eine Hack-Lösung, die ich entdeckt habe:

#image {
    max-width: 10%;
    max-height: 10%;
    transform: scale(10);
}

Dadurch wird das Bild um das Zehnfache vergrößert, aber auf 10 % seiner endgültigen Größe beschränkt – und somit an den Container gebunden.

nicht so wie background-image Lösung, dies wird auch mit funktionieren <video> Elemente.

Interaktives Beispiel:

 function step(timestamp) {
     var container = document.getElementById('container');
     timestamp /= 1000;
     container.style.left   = (200 + 100 * Math.sin(timestamp * 1.0)) + 'px';
     container.style.top    = (200 + 100 * Math.sin(timestamp * 1.1)) + 'px';
     container.style.width  = (500 + 500 * Math.sin(timestamp * 1.2)) + 'px';
     container.style.height = (500 + 500 * Math.sin(timestamp * 1.3)) + 'px';
     window.requestAnimationFrame(step);
 }

 window.requestAnimationFrame(step);
 #container {
     outline: 1px solid black;
     position: relative;
     background-color: red;
 }
 #image {
     display: block;
     max-width: 10%;
     max-height: 10%;
     transform-origin: 0 0;
     transform: scale(10);
 }
<div id="container">
    <img id="image" src="https://upload.wikimedia.org/wikipedia/en/7/7d/Lenna_%28test_image%29.png">
</div>

  • 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).

    – Wladimir Pantelejew

    23. Juli 2020 um 1:09 Uhr


1643940128 228 Skalieren Sie das Bild so dass es in einen Begrenzungsrahmen
Glen Maynard

Sagen Sie heute einfach objekttauglich: enthalten. Support ist alles außer IE: http://caniuse.com/#feat=object-fit

1643940128 489 Skalieren Sie das Bild so dass es in einen Begrenzungsrahmen
Deke

html:

    <div class="container">
      <img class="flowerImg" src="https://stackoverflow.com/questions/9994493/flower.jpg">
    </div>

CSS:

.container{
  width: 100px;
  height: 100px;
}


.flowerImg{
  width: 100px;
  height: 100px;
  object-fit: cover;
  /*object-fit: contain;
  object-fit: scale-down;
  object-position: -10% 0;
  object-fit: none;
  object-fit: fill;*/
}

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):

figure {
  margin: 0;
}

.container {
  display: table-cell;
  vertical-align: middle;
  width: 80px;
  height: 80px;
  border: 1px solid #aaa;
}

.container_image {
  display: block;
  max-width: 100%;
  max-height: 100%;
  margin-left: auto;
  margin-right: auto;
}

.container2_image2 {
  width: 80px;
  height: 80px;
  object-fit: scale-down;
  border: 1px solid #aaa;
}
Without `object-fit: scale-down`:

<br>
<br>

<figure class="container">
  <img class="container_image" src="https://i.imgur.com/EQgexUd.jpg">
</figure>

<br>

<figure class="container">
  <img class="container_image" src="https://i.imgur.com/ptO8pGi.jpg">
</figure>

<br> Using `object-fit: scale-down`:

<br>
<br>

<figure>
  <img class="container2_image2" src="https://i.imgur.com/EQgexUd.jpg">
</figure>

<br>

<figure>
  <img class="container2_image2" src="https://i.imgur.com/ptO8pGi.jpg">
</figure>

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;
}

Dafür hättest du sowas wie:

<table>
    <tr>
        <td>Lorem</td>
        <td>Ipsum<br />dolor</td>
        <td>
            <div class="container"><img src="https://stackoverflow.com/questions/9994493/image5.png" /></div>
        </td>
    </tr>
</table>

.

763050cookie-checkSkalieren Sie das Bild so, dass es in einen Begrenzungsrahmen passt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy