Jak ustawić szerokość i wysokość obrazu bez rozciągania go?

88

Jeśli mam:

#logo {
    width: 400px;
    height: 200px;
}

następnie

<img id="logo" src="logo.jpg"/>

rozciągnie się, aby wypełnić tę przestrzeń. Chcę, aby obraz zachował ten sam rozmiar, ale aby zajmował tyle miejsca w DOM. Czy muszę dodać kapsułkowanie <div>lub <span>? Nienawidzę dodawać znaczników do stylizacji.

Paul Tarjan
źródło
Jeśli nadal korzystasz z przepełnienia stosu, czy chcesz rozważyć aktualizację odpowiedzi?
mikemaccana

Odpowiedzi:

117

Tak, potrzebujesz hermetyzującego div:

<div id="logo"><img src="logo.jpg"></div>

z czymś takim jak:

#logo { height: 100px; width: 200px; overflow: hidden; }

Inne rozwiązania (dopełnienie, margines) są bardziej uciążliwe (trzeba obliczyć odpowiednią wartość na podstawie wymiarów obrazka), ale też nie pozwalają efektywnie na to, aby pojemnik był mniejszy niż obraz.

Powyższe można również znacznie łatwiej dostosować do różnych układów. Na przykład, jeśli chcesz, aby obraz w prawym dolnym rogu:

#logo { position: relative; height: 100px; width: 200px; }
#logo img { position: absolute; right: 0; bottom: 0; }
cletus
źródło
5
Możesz zamienić tag <div> na <figure>: dodaje semantyczny i możesz nadać mu podpis (<figcaption>), jeśli to konieczne. developer.mozilla.org/en-US/docs/Web/HTML/Element/figure
Mateus Leon
Ponadto, jeśli służy do brandingu, w prezentacji witryny użyj <h1> (jeśli indeks) lub <p> (jeśli inny), stosując tytuł i atrybuty alt do <img>, dzięki czemu możesz dodać przyjazne dla SEO znaczniki . Są to również elementy blokowe, takie jak div, i mogą być opakowaniami dla funkcji przycinania.
Mateus Leon
3
Nie miałem pojęcia, że ​​Cletus jest programistą WWW. Niesamowite
Piyin
61

Odpowiedź 2017

Dopasowanie obiektów CSS działa we wszystkich obecnych przeglądarkach. Pozwala to imgna powiększenie elementu bez rozciągania obrazu.

Możesz dodać object-fit: cover;do swojego CSS.

Dante
źródło
2
Powinieneś prawdopodobnie wspomnieć, na jakich przeglądarkach to działa.
Nathan Tuggy
2
sprawdź ten link pod kątem zgodności z przeglądarką: caniuse.com/#search=object-fit
Alexee
28

Załaduj obraz jako tło dla div.

Zamiast:

<img id='logo' src='picture.jpg'>

zrobić

<div id='logo' style='background:url(picture.jpg)'></div>

Wszystkie przeglądarki przycinają część obrazu, która nie pasuje.
Ma to kilka zalet w porównaniu z zawijaniem elementu, którego przepełnienie jest ukryte:

  1. Bez dodatkowych znaczników. Element div po prostu zastępuje plik img.
  2. Łatwo wyśrodkuj lub ustaw obraz na inne przesunięcie. na przykład.url(pic) center top;
  3. Powtórz obraz, gdy będzie wystarczająco mały. (OK, nie wiem, dlaczego chcesz tego)
  4. Ustaw kolor bg w tej samej instrukcji, łatwo zastosuj ten sam obraz do wielu elementów i wszystkiego, co dotyczy obrazów bg.

Aktualizacja: ta odpowiedź pochodzi sprzed dopasowania do obiektu; powinieneś teraz prawdopodobnie użyć dopasowania obiektu / pozycji obiektu.

Nadal jest przydatny w starszych przeglądarkach, dla dodatkowych właściwości (takich jak powtarzanie tła) i dla przypadków brzegowych (na przykład obejście błędów Chrome z flexboxem i pozycją obiektu oraz problemy FF (dawniej?) Z grid + autoheight + object- Dopasowanie. Wrapper div w grid / flexbox często daje ... nieintuicyjne wyniki).

SamGoody
źródło
4
Osoby, które dały -1, powinny wyjaśnić innym użytkownikom. Osobiście zrobiłem to z doskonałymi wynikami, nawet w IE6 i Safari na iOS.
SamGoody
Chciałem tylko dodać - to ogólnie dobre podejście. Ludzie określają nawet współrzędne pozycji tła dla arkuszy sprite obrazów jako optymalizację. Jedyną różnicą jest jednak to, że nie ma modułu obsługi zdarzeń błędów, który ma <img>
badunk
Dodałem również klasę do div z następującą zawartością:background-repeat:no-repeat !important; float:left; width:100px; height:100px;
Nils
2
Niektóre przeglądarki domyślnie nie drukują obrazów tła, więc może to nie być dobre podejście, jeśli chcesz pozwolić użytkownikom na wydrukowanie tej strony.
Bennett McElwee
5
Nie jest to poprawne semantycznie. Jeśli jest to przydatne, dlaczego HTML5 umieszcza więcej tagów związanych z obrazami, aby zoptymalizować semantykę, z podpisem figury, obrazem? Użyj tagu img, tak jak został zaprojektowany, i przestań zastępować wszystko przez <div> s.
Mateus Leon
23

Dopasowanie obiektów CSS3

Nie jestem pewien, jak daleko zostało zaimplementowane przez webkit, IE i firefox. Ale Opera działa jak magia

object-fitdziała z zawartością SVG, ale ten sam efekt można również osiągnąć, ustawiając preserveAspectRatio=""atrybut w samym SVG.

img {
  height: 100px;
  width: 100px;
  -o-object-fit: contain;
}

Demo Chrisa Millsa jest tutaj http://dev.opera.com/articles/view/css3-object-fit-object-position/

theCrab
źródło
2
1+ To jest naprawdę fajne. Szkoda, że ​​obsługa jest ograniczona. Wygląda na to, że Chrome 32 jako pierwszy ją obsługuje bez prefiksów dostawców.
Josh Crozier,
To jest fantastyczne, działa jak urok. Samo dodanie jednej właściwości rozwiązało problem. Potrzebowałem tylko Chrome i działa. I tak, bez przedrostka sprzedawcy. Dzięki.
whyDo8
9
#logo {
    width: 400px;
    height: 200px;

    /*Scale down will take the necessary specified space that is 400px x 200px without stretching the image*/
    object-fit:scale-down;
}
Manoj Selvin
źródło
7

Utwórz element DIV i nadaj mu klasę. Następnie wrzuć do niego zdjęcie.

<div class="mydiv">

<img src="location/of/your/image" ></img>

</div>

Ustaw rozmiar swojego div i uczyń go względnym.

    .mydiv {
        position: relative;
        height:300px;
        width: 100%;
        overflow: hidden;
    }

następnie nadaj styl swojemu wizerunkowi

img {
    width: 100%;
    height: auto;
    overflow: hidden;
}

Mam nadzieję, że to pomoże

Sabba Keynejad
źródło
3

Możesz użyć jak poniżej:

.width100 {
  max-width: 100px;
  height: 100px;
  width: auto;
  border: solid red;
}
<img src="https://www.gravatar.com/avatar/dc48e9b92e4210d7a3131b3ef46eb8b1?s=512&d=identicon&r=PG" class="width100" />

PurTahan
źródło
1

Czy muszę dodać enkapsulujący element <div> lub <span>?

Myśle że robisz. Jedyne, co przychodzi na myśl, to wypełnienie, ale w tym celu musiałbyś wcześniej znać wymiary obrazu.

Pekka
źródło
0

możesz spróbować ustawić dopełnienie zamiast wysokości / szerokości.

Błogosław Yahu
źródło
0

Przychodzi mi do głowy rozciągnięcie szerokości lub wysokości i zmiana rozmiaru w proporcjach. Po bokach będzie trochę białej przestrzeni. Coś w rodzaju tego, jak szeroki ekran wyświetla rozdzielczość 1024x768.

Mauris
źródło
0

Jeśli używanie flexboksa jest dla Ciebie właściwą opcją (nie musisz wspierać starych przeglądarek), sprawdź moją drugą odpowiedź tutaj (która prawdopodobnie jest duplikatem tej):

Zasadniczo musisz owinąć swój tag img w element div, a Twój css wyglądałby tak:

.img__container {
    display: flex;
    padding: 15px 12px;
    box-sizing: border-box;
    width: 400px; height: 200px;

    img {
        margin: auto;
        max-width: 100%;
        max-height: 100%;
    }
}
rafaelbiten
źródło
-1

To dość stare pytanie, ale miałem dokładnie ten sam irytujący problem, w którym wszystko działało dobrze dla Chrome / Edge (z właściwością dopasowania do obiektu), ale ta sama właściwość css nie działała w IE11 (ponieważ jest nieobsługiwana w IE11), skończyło się używając elementu "figure" HTML5, który rozwiązał wszystkie moje problemy.

Osobiście nie użyłem zewnętrznego znacznika DIV, ponieważ w moim przypadku nie pomogło, więc uniknąłem zewnętrznego znacznika DIV i po prostu zastąpiłem elementem „figure”.

Poniższy kod wymusza ładną redukcję / skalowanie obrazu (bez zmiany oryginalnego współczynnika proporcji).

<figure class="figure-class">
  <img class="image-class" src="{{photoURL}}" />
</figure>

i klasy css:

.image-class {
    border: 6px solid #E8E8E8;
    max-width: 189px;
    max-height: 189px;
}

.figure-class {
    width: 189px;
    height: 189px;
}
nakul2013
źródło