CSS thay đổi kích thước hình ảnh và giữ tỷ lệ khung hình


577

Tôi đang làm việc với hình ảnh, và tôi đã gặp một vấn đề với tỷ lệ khung hình.

<img src="big_image.jpg" width="900" height="600" alt="" />

Như bạn có thể thấy, heightwidthđã được chỉ định. Tôi đã thêm quy tắc CSS cho hình ảnh:

img {
  max-width:500px;
}

Nhưng cho big_image.jpg, tôi nhận được width=500height=600. Làm cách nào tôi có thể đặt hình ảnh ở kích thước lại, trong khi vẫn giữ tỷ lệ khung hình của chúng.

Câu trả lời:


774

img {
  display: block;
  max-width:230px;
  max-height:95px;
  width: auto;
  height: auto;
}
<p>This image is originally 400x400 pixels, but should get resized by the CSS:</p>
<img width="400" height="400" src="http://i.stack.imgur.com/aEEkn.png">

Điều này sẽ làm thu nhỏ hình ảnh nếu nó quá lớn đối với khu vực được chỉ định (vì nhược điểm, nó sẽ không phóng to hình ảnh).


11
Có một phiên bản này sẽ phóng to hình ảnh để phù hợp với container của họ không? Tôi đã thử độ rộng tối đa / chiều cao tối đa là số có chiều rộng / chiều cao là tự động, nhưng như setec đã nói ở trên, nó sẽ không phóng to hình ảnh. Tôi cũng đã thử sử dụng min-width / min-height. Tôi không thể có được sự kết hợp đúng. Tôi chỉ đơn giản muốn rằng bất kỳ hình ảnh nào tôi phải đặt vào thùng chứa này, nó sẽ hiển thị ở kích thước tối đa có thể mà không thay đổi tỷ lệ khung hình bất kể điều đó có liên quan đến việc thu nhỏ hoặc phát triển hình ảnh để đạt được điều đó.
Dee2000

7
Có vẻ như hiển thị: khối là không cần thiết nữa.
Actimel

3
Lưu ý rằng câu hỏi là về <img>bản thân nó bao gồm chiều rộng và chiều cao và tôi nghĩ điều đó có nghĩa là bạn cần sử dụng !importantđể phá vỡ thông tin chiều rộng / chiều cao của thẻ.
Alexis Wilke

18
@AlexisWilke Quy tắc CSS ghi đè các thuộc tính html. !importantkhông cần thiết
Jargs

5
Sử dụng nó trên Chrome, không hiệu quả với tôi, ngay cả với! Quan trọng
Ray

266

Tôi đã đấu tranh với vấn đề này khá khó khăn, và cuối cùng đã đi đến giải pháp đơn giản này:

object-fit: cover;
width: 100%;
height: 250px;

Bạn có thể điều chỉnh chiều rộng và chiều cao để phù hợp với nhu cầu của mình và thuộc tính phù hợp với đối tượng sẽ thực hiện việc cắt xén cho bạn.

Chúc mừng.


44
object-fitlà tuyệt vời, mẹo tuyệt vời! Có một số thư viện polyfill tốt nếu bất cứ ai thắc mắc về khả năng tương thích IE.
nhẹ nhàng

7
Đáng yêu, hãy nhớ rằng điều này không hoạt động cho IE mặc dù
guival

1
Không khả thi trên SAMSUNG Signage Display WebApps.
Mär

3
Giải pháp tốt nhất hiện có
Cynthia Sanchez

10
Bạn cũng có thể sử dụng object-fit: containvà chỉ định chiều rộng hoặc chiều cao!
Broper

236

Các giải pháp dưới đây sẽ cho phép thu nhỏ và thu nhỏ hình ảnh , tùy thuộc vào chiều rộng của hộp cha.

Tất cả các hình ảnh có một thùng chứa cha mẹ với chiều rộng cố định chỉ cho mục đích trình diễn . Trong sản xuất, đây sẽ là chiều rộng của hộp cha.

Thực hành tốt nhất (2018):

Giải pháp này yêu cầu trình duyệt hiển thị hình ảnh với chiều rộng tối đa có sẵn và điều chỉnh chiều cao theo tỷ lệ phần trăm của chiều rộng đó.

.parent {
  width: 100px;
}

img {
  display: block;
  width: 100%;
  height: auto;
}
<p>This image is originally 400x400 pixels, but should get resized by the CSS:</p>
<div class="parent">
  <img width="400" height="400" src="https://placehold.it/400x400">
</div>

Giải pháp Fancier:

Với giải pháp fancier, bạn sẽ có thể cắt hình ảnh bất kể kích thước của nó và thêm màu nền để bù cho việc cắt xén.

.parent {
  width: 100px;
}

.container {
  display: block;
  width: 100%;
  height: auto;
  position: relative;
  overflow: hidden;
  padding: 34.37% 0 0 0; /* 34.37% = 100 / (w / h) = 100 / (640 / 220) */
}

.container img {
  display: block;
  max-width: 100%;
  max-height: 100%;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
}
<p>This image is originally 640x220, but should get resized by the CSS:</p>
<div class="parent">
  <div class="container">
    <img width="640" height="220" src="https://placehold.it/640x220">
  </div>
</div>

Đối với phần đệm chỉ định dòng, bạn cần tính tỷ lệ khung hình của hình ảnh, ví dụ:

640px (w) = 100%
220px (h) = ?

640/220 = 2.909
100/2.909 = 34.37%

Vì vậy, đệm hàng đầu = 34,37%.


1
Nó hoạt động, nhưng nên có chiều rộng tối đa: 100% thay vì chiều rộng trong hầu hết các mục đích sử dụng.
Dudeist

Tôi không nghĩ !importantlà cần thiết ở đây.
Flimm

1
Với cha mẹ được đặt thành 100px. Làm thế nào điều này sẽ làm việc một cách đáp ứng?
Remi

@Remi đó là cho mục đích trình diễn. Tôi đã thêm một sự làm rõ vào đầu câu trả lời.
Aternus 4/12/2016

@Flimm nó đã được sử dụng trước đây cho các vấn đề tương thích, năm 2016 điều này không còn cần thiết nữa.
Aternus

64

Thuộc tính kích thước nền chỉ có nghĩa là> = 9, nhưng nếu điều đó tốt với bạn, bạn có thể sử dụng div với background-imagevà đặt background-size: contain:

div.image{
    background-image: url("your/url/here");
    background-size: contain;
    background-repeat: no-repeat;
    background-position: center;
}

Bây giờ bạn chỉ có thể đặt kích thước div của mình thành bất cứ điều gì bạn muốn và không chỉ hình ảnh sẽ giữ tỷ lệ khung hình của nó, nó cũng sẽ được tập trung cả theo chiều dọc và chiều ngang trong div. Chỉ cần đừng quên đặt kích thước trên css vì div không có thuộc tính width / height trên thẻ.

Cách tiếp cận này khác với câu trả lời của setecs, sử dụng vùng này hình ảnh sẽ không đổi và được xác định bởi bạn (để lại các khoảng trống theo chiều ngang hoặc chiều dọc tùy thuộc vào kích thước div và tỷ lệ khung hình của hình ảnh), trong khi câu trả lời setecs sẽ giúp bạn có một hộp chính xác kích thước của hình ảnh tỷ lệ (không có khoảng trống).

Chỉnh sửa: Theo tài liệu kích thước nền MDN, bạn có thể mô phỏng thuộc tính kích thước nền trong IE8 bằng cách sử dụng khai báo bộ lọc độc quyền:

Mặc dù Internet Explorer 8 không hỗ trợ thuộc tính kích thước nền, nhưng có thể mô phỏng một số chức năng của nó bằng chức năng bộ lọc -ms không chuẩn:

-ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='path_relative_to_the_HTML_file', sizingMethod='scale')";

2
cuối cùng là một giải pháp CSS duy nhất để tối đa hóa hình ảnh trong khi vẫn giữ tỷ lệ khung hình của nó, cảm ơn bạn. May mắn là IE trước 9 ngày càng không quan trọng.
nhân

2
Giải pháp tuyệt vời, cảm ơn! Cũng lưu ý rằng bạn có thể thay thế 'chứa' bằng 'che' nếu bạn muốn điền đầy đủ div và cắt các pixel phụ không phù hợp với tỷ lệ
mbritto

Đây phải là câu trả lời chính xác. Tôi thích giải pháp này. Nó giữ tỷ lệ của bạn và dễ hiểu.
skolind

1
Mặc dù đây là một câu trả lời đúng theo lập trình, nhưng nếu một hình ảnh "quan trọng" theo cách này thì bạn không có thuộc tính img nên bạn đang giết SEO.
fat_mike

Tuyệt quá! Đây là giải pháp duy nhất trong số các giải pháp này hoạt động cho cả ảnh dọc và ảnh ngang cũng như cho các khung chứa ảnh dọc và ngang (ví dụ khác nhau tùy thuộc vào kích thước cửa sổ) trong cả 4 kết hợp và ngoài ra, trong IE11, dường như khá một yêu cầu. Cảm ơn bạn!
cupiqi09

53

Rất giống với một số câu trả lời ở đây, nhưng trong trường hợp của tôi, tôi đã có những hình ảnh đôi khi cao hơn, đôi khi lớn hơn.

Phong cách này hoạt động như một nét duyên dáng để đảm bảo rằng tất cả các hình ảnh đều sử dụng tất cả không gian có sẵn, giữ nguyên tỷ lệ và không cắt giảm:

.img {
   object-fit: contain;
   max-width: 100%;
   max-height: 100%;
   width: auto;
   height: auto;
}

object-fitnó hoạt động với tôi nó hoạt động trong tất cả các trình duyệt?
Murtuza Zabuawala

.imgmột lớp học trên cha mẹ hoặc hình ảnh? Bạn có thể tạo một jsfiddle với ví dụ cho cả ảnh dọc và ảnh ngang không?
Thiết kế bởi Adrian

19

Xóa thuộc tính "chiều cao".

<img src="big_image.jpg" width="900" alt=""/>

Bằng cách chỉ định cả hai bạn đang thay đổi tỷ lệ khung hình của hình ảnh. Chỉ cần đặt một cái sẽ thay đổi kích thước nhưng giữ nguyên tỷ lệ khung hình.

Tùy chọn, để hạn chế quá khổ:

<img src="big_image.jpg" width="900" alt="" style="max-width:500px; height:auto; max-height:600px;"/>

Tôi không thể làm điều đó với tất cả các hình ảnh - có nhiều hình ảnh đã được đặt trong nhiều tệp html
moonvader

2
Đồng ý. thử img {max-width: 500px; chiều cao: tự động; chiều cao tối đa: 600px;}
el Dude

1
Thông tin hữu ích như bình luận đó nên được thêm vào bài viết của bạn. Bằng cách đó, chúng tôi có thể thấy ngay những gì bạn nghĩ ra.
Bram Vanroy

2
Nhược điểm của việc bỏ qua heightthuộc tính trong imgthẻ là trình duyệt không thể tính được dung lượng hình ảnh sẽ chiếm trước khi tải xuống hình ảnh. Điều này làm cho trang chậm hơn để hiển thị và nó có thể dẫn đến nhiều "nhảy" hơn.
Flimm

11

Chỉ cần thêm nó vào css của bạn, Nó sẽ tự động thu nhỏ và mở rộng với việc giữ tỷ lệ ban đầu.

img {
    display: block;
    max-width: 100%;
    max-height: 100%;
    width: auto;
    height: auto;
}

2
Đây là câu trả lời giống như câu trả lời của setec , ngoại trừ sử dụng 100%thay vì một giá trị pixel cụ thể.
Flimm

5
display: block;là không cần thiết
Flimm

Điều đó thật hoàn hảo và hoạt động với hình ảnh ở bất kỳ kích thước và tỷ lệ nào
Le Droid

8

Không có cách nào tiêu chuẩn để duy trì tỉ lệ cho hình ảnh với width, heightmax-widthquy định với nhau.

Vì vậy, chúng tôi buộc phải chỉ định widthheightđể ngăn chặn trang Jumps nhảy trong khi tải hình ảnh, hoặc sử dụng max-widthvà không chỉ định kích thước cho hình ảnh.

Việc chỉ định width(không có height) thường không có nhiều ý nghĩa, nhưng bạn có thể cố gắng ghi đè heightthuộc tính HTML bằng cách thêm quy tắc như IMG {height: auto; }vào biểu định kiểu của bạn.

Xem thêm lỗi Firefox liên quan 392261 .


cảm ơn bạn nó hoạt động trong các phiên bản hiện đại của IE, Opera, FF và Chrome. Tôi cần một chút thời gian để kiểm tra nó với các trình duyệt khác.
moonvader

7
Đừng sử dụng !importantCSS. Đó là một bản hack cuối cùng sẽ quay trở lại ám ảnh bạn.
Automatico

1
Bạn thậm chí không cần !importantở đây.
Flimm

8

Đây là một giải pháp:

img {
   width: 100%;
   height: auto;
   object-fit: cover;
}

Điều này sẽ đảm bảo hình ảnh luôn bao phủ toàn bộ cha mẹ (thu nhỏ xuống và lên) và giữ nguyên tỷ lệ khung hình.


5

Đặt lớp CSS của thẻ chứa hình ảnh của bạn thành image-class:

<div class="image-full"></div>

và thêm cái này cho bạn bản định kiểu CSS của bạn.

.image-full {
    background: url(...some image...) no-repeat;
    background-size: cover;
    background-position: center center;
}

5

Để duy trì hình ảnh phản hồi trong khi vẫn thực thi hình ảnh phải có tỷ lệ khung hình nhất định, bạn có thể làm như sau:

HTML:

<div class="ratio2-1">
   <img src="../image.png" alt="image">
</div>

Và SCSS:

.ratio2-1 {
  overflow: hidden;
  position: relative;

  &:before {
    content: '';
    display: block;
    padding-top: 50%; // ratio 2:1
  }

  img {
    position: absolute;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
  }
}

Điều này có thể được sử dụng để thực thi một tỷ lệ khung hình nhất định, bất kể kích thước của hình ảnh mà tác giả tải lên.

Cảm ơn @Koseso tại http://codepen.io/Koseso/pen/bfdhg . Kiểm tra URL này để biết thêm tỷ lệ và một ví dụ hoạt động.


Tôi thích điều này vì nó hoạt động với vòng tròn / border-radius. Nhưng thật không may, nó cắt hình ảnh và không làm tốt lắm với việc tạo đường viền cho hình ảnh trong div như tôi đã thử.
Jake

4

Để buộc hình ảnh phù hợp với kích thước chính xác, bạn không cần phải viết quá nhiều mã. Nó rất đơn giản

img{
    width: 200px;
    height: auto;
    object-fit: contain; /* Fit logo in the image size */
        -o-object-fit: contain; /* Fit logo fro opera browser */
    object-position: top; /* Set logo position */
        -o-object-position: top; /* Logo position for opera browser */
    }
<img src="http://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-logo.png" alt="Logo">


4

https://jsfiddle.net/sot2qgj6/3/

Dưới đây là câu trả lời nếu bạn muốn đặt hình ảnh với tỷ lệ phần trăm chiều rộng cố định , nhưng không phải là pixel chiều rộng cố định .

Và điều này sẽ hữu ích khi xử lý kích thước màn hình khác nhau .

Thủ đoạn là

  1. Sử dụng padding-topđể đặt chiều cao từ chiều rộng.
  2. Sử dụng position: absoluteđể đặt hình ảnh trong không gian đệm.
  3. Sử dụng max-height and max-widthđể đảm bảo hình ảnh sẽ không qua phần tử cha.
  4. sử dụng display:block and margin: autođể căn giữa hình ảnh.

Tôi cũng đã nhận xét hầu hết các thủ thuật bên trong fiddle.


Tôi cũng tìm thấy một số cách khác để thực hiện điều này. Sẽ không có hình ảnh thực trong html, vì vậy tôi cá nhân trả lời câu trả lời hàng đầu khi tôi cần phần tử "img" trong html.

css đơn giản bằng cách sử dụng nền http://jsfiddle.net/4660s79h/2/

hình nền với từ trên đầu http://jsfiddle.net/4660s79h/1/

Khái niệm sử dụng vị trí tuyệt đối là từ đây http://www.w3schools.com/howto/howto_css_aspect_ratio.asp


Điều này không hoạt động nếu "chiều cao và chiều rộng đã được chỉ định" như câu hỏi ban đầu đề cập. Có những lúc bạn muốn buộc chiều rộng và chiều cao rồi phóng to / thu nhỏ hình ảnh theo tỷ lệ khung hình.
Thiết kế bởi Adrian

3

Bạn có thể sử dụng điều này:

img { 
    width: 500px; 
    height: 600px; 
    object-fit: contain; 
    position: relative; 
    top: 50%; 
    transform: translateY(-50%); 
}

2

Bạn có thể tạo một div như thế này:

<div class="image" style="background-image:url('/to/your/image')"></div>

Và sử dụng css này để tạo kiểu cho nó:

height: 100%;
width: 100%;
background-position: center center;
background-repeat: no-repeat;
background-size: contain; // this can also be cover

Điều này sẽ kéo dài div đến 100% chiều rộng của nó, nhưng không duy trì tỷ lệ khung hình của hình ảnh.
David Ball

Bạn đã thử à? Tôi đã nhận nó làm việc jsfiddle.net/zuysj22w . Bạn có thể cho thấy trường hợp của bạn? @DavidBall
Chun Yang

Đây là một giải pháp tương tự như câu trả lời của Hoffmann .
Flimm

2

Tôi sẽ đề xuất một cách tiếp cận đáp ứng, cách tốt nhất là sử dụng các đơn vị Viewport và các thuộc tính tối thiểu / tối đa như sau:

img{
  display: block;
  width: 12vw;
  height:12vw;
  max-width:100%;
  min-width:100px;
  min-height:100px;
  object-fit:contain;
}

1

Điều này sẽ làm thu nhỏ hình ảnh nếu nó quá lớn đối với khu vực được chỉ định (vì nhược điểm, nó sẽ không phóng to hình ảnh).

Giải pháp của setec là tốt cho "Shrink to Fit" ở chế độ tự động. Nhưng, để tối ưu MỞ RỘNG để phù hợp với chế độ 'tự động', trước tiên bạn cần đặt hình ảnh nhận được vào id tạm thời, Kiểm tra xem nó có thể được mở rộng về chiều cao hoặc chiều rộng hay không (tùy theo tỷ lệ khung hình của nó v / s tỷ lệ khung hình của khối hiển thị của bạn),

$(".temp_image").attr("src","str.jpg" ).load(function() { 
    // callback to get actual size of received image 

    // define to expand image in Height 
    if(($(".temp_image").height() / $(".temp_image").width()) > display_aspect_ratio ) {
        $(".image").css('height', max_height_of_box);
        $(".image").css('width',' auto');
    } else { 
        // define to expand image in Width
        $(".image").css('width' ,max_width_of_box);
        $(".image").css('height','auto');
    }
    //Finally put the image to Completely Fill the display area while maintaining aspect ratio.
    $(".image").attr("src","str.jpg");
});

Cách tiếp cận này hữu ích khi hình ảnh nhận được nhỏ hơn hộp hiển thị. Bạn phải lưu chúng trên máy chủ của mình ở kích thước Nhỏ ban đầu thay vì phiên bản mở rộng của chúng để lấp đầy Hộp hiển thị lớn hơn của bạn để tiết kiệm kích thước và băng thông.


Mặc dù bài đăng câu hỏi không đánh vần nó, tôi nghĩ OP mạnh mẽ ngụ ý rằng anh ấy / cô ấy đang tìm kiếm một giải pháp chỉ dành cho CSS.
Flimm

0

img {
  max-width: 80px; /* Also works with percentage value like 100% */
  height: auto;
}
<p>This image is originally 400x400 pixels, but should get resized by the CSS:</p>
<img width="400" height="400" src="https://i.stack.imgur.com/aEEkn.png">

<p>Let's say the author of the HTML deliberately wants
  the height to be half the value of the width,
  this CSS will ignore the HTML author's wishes, which may or may not be what you want:
</p>
<img width="400" height="200" src="https://i.stack.imgur.com/aEEkn.png">


0

Làm thế nào về việc sử dụng một yếu tố giả cho căn chỉnh dọc? Mã ít hơn này là cho một băng chuyền nhưng tôi đoán nó hoạt động trên mọi thùng chứa kích thước cố định. Nó sẽ giữ tỷ lệ khung hình và chèn các thanh @ xám-tối trên đầu / dưới hoặc trái / ghi cho kích thước ngắn nhất. Trong khi đó, hình ảnh được căn giữa theo chiều ngang bởi văn bản - căn chỉnh và theo chiều dọc bởi yếu tố giả.

    > li {
      float: left;
      overflow: hidden;
      background-color: @gray-dark;
      text-align: center;

      > a img,
      > img {
        display: inline-block;
        max-height: 100%;
        max-width: 100%;
        width: auto;
        height: auto;
        margin: auto;
        text-align: center;
      }

      // Add pseudo element for vertical alignment of inline (img)
      &:before {
        content: "";
        height: 100%;
        display: inline-block;
        vertical-align: middle;
      }
    }

0

Trình bày toàn màn hình:

img[data-attribute] {height: 100vh;}

Hãy nhớ rằng nếu chiều cao cổng xem lớn hơn hình ảnh, hình ảnh sẽ tự nhiên xuống cấp so với sự khác biệt.


-1

Tôi nghĩ rằng, cuối cùng thì đây là giải pháp tốt nhất, dễ dàng và đơn giản :

img {
    display: block;
    max-width: 100%;
    max-height: 100%;
    width: auto;
    height: auto;
}

1
Bạn có thể vui lòng giải thích ngắn gọn tại sao giải pháp này giúp? (Chỉ một câu là đủ.)
Aenadon

Đơn giản là vì hình ảnh sẽ giữ tỷ lệ khung hình, trong khi chiều rộng tối đa và chiều cao tối đa sẽ ngăn không cho nó trở nên lớn hơn mà thùng chứa
Uknow
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.