Jak dopasować obraz (img) do elementu div i zachować proporcje?


136

Mam div 48x48 i wewnątrz jest element img, chcę dopasować go do div bez utraty żadnej części, w międzyczasie zachowany jest stosunek, czy można to osiągnąć używając html i css?

Odpowiedzi:


70

Będziesz potrzebował trochę JavaScript, aby zapobiec przycinaniu, jeśli nie znasz rozmiaru obrazu w momencie pisania CSS.

HTML i JavaScript

<div id="container">
    <img src="something.jpg" alt="" />
</div>

<script type="text/javascript">
(function() {

var img = document.getElementById('container').firstChild;
img.onload = function() {
    if(img.height > img.width) {
        img.height = '100%';
        img.width = 'auto';
    }
};

}());
</script>

CSS

#container {
   width: 48px;
   height: 48px;
}

#container img {
   width: 100%;
}

Jeśli korzystasz z biblioteki JavaScript, możesz chcieć z niej skorzystać.


2
Odpowiedź Michaela jest znacznie prostsza i nie używa Javascript. Nie wiem jednak o kompatybilności przeglądarek.
weberc2

3
Nie, odpowiedź Michaela działa, o ile obraz jest większy niż element div. Jeśli chcesz, aby obraz wypełniał element div dotyczący rozmiaru obrazu (a jeśli nie znasz rozmiaru obrazu z góry, tak), to jest droga.
Rémy DAVID

2
Czy nie możesz użyć max-height: 100%; max-width: 100%; min-width: 100%; min-height: 100% i otrzymujesz ten sam wynik? Szczere pytanie.
Daniel Casserly

Nie, robiąc to, wymuszasz 100% szerokości i wysokości, więc zmieniasz współczynnik proporcji obrazu.
gztomas

onload nie zostanie wywołany, gdy obraz jest przechowywany w pamięci podręcznej przeglądarki, więc będzie działać tylko wtedy, gdy obraz zostanie załadowany po raz pierwszy.
Redtopia

314

Użyj max-height:100%; max-width:100%;dla obrazu wewnątrz div.


4
@ZoveGames Przeglądarki bez obsługi JS? Statystyki Yahoo z 2010 roku pokazują średnio 1,3%. Myślę, że można bezpiecznie założyć, że plik. prawdopodobnie jest dziś niższa i b. programmers.stackexchange.com/questions/26179/ ...
EasyCo

5
Dla mnie to nie działa ... To sprawia, że ​​obraz jest w 100% swojego własnego rozmiaru (np .: 300px szerokości dla obrazu, który faktycznie ma 300px szerokości).
Tomáš Zato - Przywróć Monikę

1
Jest to przyczyną okropnego błędu związanego z Chrome w systemie Windows. Potencjalnie zła interakcja z niektórymi posiadanymi wtyczkami smoothscroll. Kończy się próbą przewinięcia treści, mimo że mysz znajduje się nad overflow:scrolldiv z dużym obrazem. Ciekawy. Jeszcze bardziej dziwne: rozwiązanie Maxa faktycznie to naprawia. Naprawdę mam dość CSS. Kiedyś był potężny i fajny. Teraz implementacje po prostu generują błędną niespójność po błędnej niespójności.
Steven Lu

21
działa tylko podczas zmniejszania obrazu. jeśli chcesz zmieścić mały obraz w większym pojemniku, to nie zadziała
Yossi Shasho

2
Nie zachowuje oryginalnych proporcji obrazu.
Ĭsααc t ի ε βöss

78

Niestety max-width + max-height nie w pełni pokrywają moje zadanie ... Więc znalazłem inne rozwiązanie:

Aby zapisać proporcje obrazu podczas skalowania, możesz również użyć object-fitwłaściwości CSS3.

Przydatny artykuł: Kontroluj proporcje obrazu za pomocą CSS3

img {
    width: 100%; /* or any custom size */
    height: 100%; 
    object-fit: contain;
}

Złe wieści: IE nie jest obsługiwany ( mogę używać )


6
Należy to zaznaczyć jako odpowiedź. „Dopasowanie obiektu” zadziałało idealnie.
Ĭsααc t ի ε βöss

Co dziwne, wygląda na to, że obsługa tego została wprowadzona w iOS 8.1, a nie 8.0.
ray

2
object-fit: cover; pracował dla mnie. Tutaj: stackoverflow.com/questions/9071830/…
Deke

1
Jeśli chcesz, aby obraz był w lewym górnym rogu, a nie wyśrodkowany, musisz również użyć pozycji obiektu 0 0.
Chris Rae

To jedyna odpowiedź, która zadziałała w moim przypadku, aby stworzyć responsywne tło obrazu, które wypełniało ekran przy zachowaniu proporcji obrazu.
Ray Li

39

Korzystanie tylko z CSS:

div > img {
  width: auto;
  height : auto;
  max-height: 100%;
  max-width: 100%;
}

nie skaluje w górę
JFFIGK

17

HTML

<div>
    <img src="something.jpg" alt="" />
</div>

CSS

div {
   width: 48px;
   height: 48px;
}

div img {
   display: block;
   width: 100%;
}

Spowoduje to, że obraz rozszerzy się i wypełni jego rodzica, którego rozmiar jest ustawiony w divCSS.


2
Nie dodawaj height: 100%, to wypaczy współczynnik obrazu - OP chce zachować współczynnik.
casablanca,

Nie jestem pewien, co oznaczał OP, ale czy nie utrzymałbyś odpowiedniego współczynnika?
Trufa,

co mogę zrobić, aby utrzymać ten stosunek? Jeśli usunę wysokość: 100% obraz zostanie przycięty.
Bin Chen

7

Miałem wiele problemów, aby to działało, każde znalezione rozwiązanie wydawało się nie działać.

Zdałem sobie sprawę, że muszę ustawić wyświetlanie div na flex, więc w zasadzie to jest mój CSS:

div{
display: flex;
}

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

Moje obrazy są zniekształcone dzięki temu rozwiązaniu w Chrome w wersji 61
Yevgeniy Afanasjew

Może twój div ma ustawioną maksymalną wysokość / wysokość lub szerokość, co powoduje zniekształcenie obrazu.
Bartho Bernsmann

Dokładnie mój punkt widzenia ... Obraz jest zniekształcony, ponieważ ustawiasz szerokość i wysokość w swoim <div class = "w">
Bartho Bernsmann

Na przykład… Myślę, że szukasz czegoś takiego jak na swoim obrazie CSS: height: auto; szerokość: 100%;
Bartho Bernsmann

zadanie polegało na dopasowaniu obrazu do elementu div, oznacza to, że div ma wymiary, a obraz ma tylko proporcje. Muszę ustawić wysokość na jakąś wartość, w przeciwnym razie warunki pytania zostaną zniekształcone, podobnie jak mój obraz. Spójrz na skrzypce JS i zmień to, co Twoim zdaniem jest potrzebne, aby działało. Dzięki.
Yevgeniy Afanasjew


3

U mnie działał następujący CSS (przetestowany w Chrome, Firefox i Safari).

Istnieje wiele rzeczy działających razem:

  • max-height: 100%;, max-width: 100%;I height: auto;, width: auto;aby skalę IMG dowolny wymiarowania najpierw osiąga 100% przy zachowaniu proporcji
  • position: relative;w pojemniku iu position: absolute;dziecka razem z lewym górnym rogiem obrazu w pojemniku top: 50%;i left: 50%;wyśrodkuj go
  • transform: translate(-50%, -50%); przesuwa obraz z powrotem w lewo i do góry o połowę, tym samym wyśrodkowując obraz w pojemniku

CSS:

.container {
    height: 48px;
    width: 48px;

    position: relative;
}

.container > img {
    max-height: 100%;
    max-width: 100%;
    height: auto;
    width: auto;

    position: absolute;
    top: 50%;
    left: 50%;

    transform: translate(-50%, -50%);
}

1

Ustawienie zdjęcia jako obrazu tła da nam większą kontrolę nad rozmiarem i położeniem, pozostawiając tag img, aby służył innemu celowi ...

Poniżej, jeśli chcemy, aby element div miał taki sam współczynnik proporcji jak zdjęcie, to placeholder.png jest małym przezroczystym obrazkiem o takich samych proporcjach jak zdjęcie.jpg. Jeśli zdjęcie jest kwadratem, jest to element zastępczy 1px x 1px, jeśli zdjęcie jest miniaturą wideo, jest to element zastępczy 16x9 itd.

Jeśli chodzi o to pytanie, użyj symbolu zastępczego 1x1, aby zachować kwadratowy współczynnik div, a obraz tła za pomocą, background-sizeaby zachować proporcje zdjęcia.

Użyłem background-position: center center;więc zdjęcie będzie wyśrodkowane w div. (Wyrównanie zdjęcia w pionie na środku lub na dole byłoby brzydkie w stosunku do zdjęcia w tagu img.)

div {
    background: url(photo.jpg) center center no-repeat;
    background-size: contain;
    width: 48px; // or a % in responsive layout
}
img {
    width: 100%;
}

<div><img src="placeholder.png"/></div>

Aby uniknąć dodatkowego żądania http, przekonwertuj obraz zastępczy na adres URL danych .

<img src="data:image/png;base64,..."/>

0

możesz użyć klasy "img-fluid" dla nowszej wersji, np. Bootstrap v4 .

i może używać klasy „img-responsive” dla starszych wersji, takich jak Bootstrap v3 .

Użycie : -

img tag z: -

class = "img-fluid"

src = „...”


0

Oto podejście oparte na języku JavaScript. Skaluje obraz stopniowo w dół, aż będzie pasował prawidłowo. Ty wybierasz, jak bardzo chcesz ją zmniejszyć za każdym razem, gdy się nie powiedzie. Ten przykład zmniejsza go o 10% za każdym razem, gdy się nie powiedzie:

let fit = function (el, w, h, percentage, step)
{
    let newH = h;
    let newW = w;

    // fail safe
    if (percentage < 0 || step < 0) return { h: h, w: w };
    if (h > w)
    {
        newH = el.height() * percentage;
        newW = (w / h) * newH;
        if (newW > el.width())
        {
            return fit(el, w, h, percentage - step, step);
        }
    }
    else
    {
        newW = el.width() * percentage;
        newH = (h / w) * newW;
        if (newH > el.height())
        {
            return fit(el, w, h, percentage - step, step);
        }
    }

    return { h: newH, w: newW };
};

img.bind('load', function ()
{
    let h = img.height();
    let w = img.width();
    let newFit = fit($('<img-wrapper-selector>'), w, h, 1, 0.1);

    img.width(newFit.w);
    img.height(newFit.h);
});

Zapraszam do bezpośredniego kopiowania i wklejania.


0

U mnie zadziałało:

<div style='display: inline-flex; width: 80px; height: 80px;'>
<img style='max-width: 100%; max-height: 100%' src='image file'>
</div>

inline-flex był wymagany, aby obrazy nie wychodziły poza obszar div.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.