Làm cách nào để điều chỉnh hình ảnh (img) bên trong div và giữ tỷ lệ khung hình?


136

Tôi có div 48x48 và bên trong nó có phần tử img, tôi muốn lắp nó vào div mà không mất bất kỳ phần nào, trong thời gian đó tỷ lệ được giữ, có thể đạt được bằng cách sử dụng html và css không?

Câu trả lời:


70

Bạn sẽ cần một số JavaScript để ngăn chặn việc cắt xén nếu bạn không biết kích thước của hình ảnh tại thời điểm bạn đang viết css.

HTML & 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%;
}

Nếu bạn sử dụng Thư viện JavaScript, bạn có thể muốn tận dụng lợi thế của nó.


2
Câu trả lời của Michael đơn giản hơn nhiều và nó không sử dụng Javascript. Tôi không biết về khả năng tương thích trình duyệt mặc dù.
weberc2

3
Không, câu trả lời của Michael hoạt động miễn là hình ảnh lớn hơn div. Nếu bạn muốn hình ảnh điền vào div liên quan đến kích thước hình ảnh (và, nếu bạn không biết trước kích thước hình ảnh, bạn sẽ làm thế), đây là cách nên làm.
Rémy DAVID

2
Bạn có thể không sử dụng chiều cao tối đa: 100%; chiều rộng tối đa: 100%; chiều rộng tối thiểu: 100%; min-height: 100% và nhận được kết quả tương tự sau đó? Câu hỏi trung thực.
Daniel Cassily

Không, bằng cách đó, bạn buộc chiều rộng và chiều cao phải là 100%, do đó bạn thay đổi tỷ lệ khung hình của hình ảnh.
gztomas

onload sẽ không được gọi khi hình ảnh được lưu trong trình duyệt, vì vậy điều này sẽ chỉ hoạt động khi hình ảnh được tải lần đầu tiên.
Redtopia

314

Sử dụng max-height:100%; max-width:100%;cho hình ảnh bên trong div.


4
@ZoveGames Trình duyệt không hỗ trợ JS? Số liệu thống kê của Yahoo từ năm 2010 cho thấy mức trung bình 1,3%. Tôi nghĩ rằng nó an toàn để giả định rằng a. hôm nay có lẽ thấp hơn và b. lập trình
viên.stackexchange.com/questions / 26179 / Mạnh

5
Nó không hoạt động đối với tôi ... Nó làm cho hình ảnh 100% kích thước của chính nó (ví dụ: rộng 300px cho một hình ảnh thực sự rộng 300px).
Tomáš Zato - Phục hồi Monica

1
Có một số lỗi cụ thể của Chrome trên Windows mà điều này gây ra. Có khả năng một số tương tác xấu với các plugin smoothscroll nhất định mà tôi có. Cuối cùng, nó cố gắng cuộn cơ thể mặc dù con chuột nằm trên một overflow:scrolldiv có hình ảnh lớn trong đó. Tò mò. Thậm chí kỳ lạ hơn: giải pháp của Max thực sự sửa nó. Tôi thực sự chán ngấy với CSS. Được sử dụng để mạnh mẽ và mát mẻ. Bây giờ việc triển khai chỉ tạo ra sự không nhất quán của lỗi sau sự không nhất quán của lỗi.
Steven Lu

21
chỉ hoạt động khi thu nhỏ hình ảnh. nếu bạn muốn đặt một hình ảnh nhỏ trong một thùng chứa lớn hơn, điều này sẽ không hoạt động
Yossi Shasho

2
Nó không bảo tồn tỷ lệ khung hình gốc của hình ảnh.
Ĭsααc t ի ε öss

78

Thật không may, chiều rộng tối đa + chiều cao tối đa không hoàn toàn bao gồm nhiệm vụ của tôi ... Vì vậy, tôi đã tìm thấy một giải pháp khác:

Để lưu tỷ lệ Hình ảnh trong khi chia tỷ lệ, bạn cũng có thể sử dụng object-fitCSS3 propperty.

Bài viết hữu ích: Kiểm soát tỷ lệ khung hình ảnh bằng CSS3

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

Tin xấu: IE không được hỗ trợ ( Tôi có thể sử dụng )


6
Điều này phải được đánh dấu là câu trả lời .. "đối tượng phù hợp" hoạt động hoàn hảo.
Ĭsααc t ի ε βöss

Điều kỳ lạ là có vẻ như hỗ trợ cho điều này đã được giới thiệu trong iOS 8.1 chứ không phải 8.0.
ray

2
object-fit: cover; đã làm cho tôi. Tại đây: stackoverflow.com/questions/9071830/ khăn
Deke

1
Nếu bạn muốn hình ảnh nằm ở trên cùng bên trái thay vì ở giữa, bạn cũng cần sử dụng vị trí đối tượng 0 0.
Chris Rae

Đây là câu trả lời duy nhất giúp tôi tạo ra một hình ảnh phản hồi lấp đầy màn hình trong khi duy trì tỷ lệ khung hình của hình ảnh.
Ray Li

39

Chỉ sử dụng CSS:

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

không tăng quy mô
JFFIGK

17

HTML

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

CSS

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

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

Điều này sẽ làm cho hình ảnh mở rộng để lấp đầy cha mẹ của nó, trong đó kích thước của nó được đặt trong divCSS.


2
Đừng thêm height: 100%, điều đó sẽ làm lệch tỷ lệ hình ảnh - OP muốn duy trì tỷ lệ này.
casref

Tôi không chắc OP có ý gì nhưng ở đó bạn sẽ không giữ tỷ lệ đúng không?
Trufa

Tôi có thể làm gì để giữ tỷ lệ? Nếu tôi xóa chiều cao: 100% hình ảnh sẽ bị cắt.
Bin Chen

7

Tôi đã có rất nhiều vấn đề để làm việc này, mọi giải pháp tôi thấy dường như không hiệu quả.

Tôi nhận ra rằng tôi phải đặt màn hình div thành flex, vì vậy về cơ bản đây là CSS của tôi:

div{
display: flex;
}

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

Hình ảnh của tôi bị bóp méo với giải pháp này trong Chrome Phiên bản 61
Yevgeniy Afanasyev

Có thể div của bạn có bộ chiều cao / chiều cao hoặc chiều rộng tối đa và điều đó gây ra sự biến dạng hình ảnh của bạn.
Bartho Bernsmann

Chính xác là quan điểm của tôi .. Hình ảnh bị biến dạng vì bạn đang đặt chiều rộng và chiều cao trên <div class = "w">
Bartho Bernsmann

Ví dụ của bạn .. Tôi tin rằng bạn đang tìm kiếm một cái gì đó giống như trên CSS hình ảnh của bạn: height: auto; chiều rộng: 100%;
Bartho Bernsmann

Nhiệm vụ là ghép hình ảnh vào div, nó ngụ ý rằng div có kích thước và hình ảnh chỉ có tỷ lệ khung hình. Tôi cần đặt chiều cao thành một số giá trị, nếu không các điều kiện câu hỏi sẽ bị biến dạng cũng như hình ảnh của tôi. Xin hãy xem JS fiddle và thay đổi những gì bạn nghĩ là cần thiết để làm cho nó hoạt động. Cảm ơn.
Yevgeniy Afanasyev

6

Hãy thử CSS:

img {
  object-fit: cover;
  height: 48px;
}

3

Đối với tôi, CSS sau đã hoạt động (được thử nghiệm trong Chrome, Firefox và Safari).

Có nhiều thứ làm việc cùng nhau:

  • max-height: 100%;, max-width: 100%;height: auto;, width: auto;làm cho quy mô img đến bất cứ kích thước đạt đầu tiên 100% trong khi vẫn giữ tỉ lệ
  • position: relative;trong thùng chứa và position: absolute;ở trẻ cùng với top: 50%;và căn left: 50%;giữa góc trên cùng bên trái của img trong thùng chứa
  • transform: translate(-50%, -50%); di chuyển img trở lại bên trái và trên cùng một nửa kích thước của nó, do đó căn giữa img trong container

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

Đặt ảnh làm ảnh nền sẽ giúp chúng tôi kiểm soát nhiều hơn về kích thước và vị trí, để lại thẻ img để phục vụ mục đích khác ...

Dưới đây, nếu chúng ta muốn div có cùng tỷ lệ khung hình với ảnh, thì placeholder.png là một hình ảnh trong suốt nhỏ với tỷ lệ khung hình tương tự như photo.jpg. Nếu ảnh là hình vuông, thì đó là một giữ chỗ 1px x 1px, nếu ảnh là hình thu nhỏ của video, thì đó là một giữ chỗ 16x9, v.v.

Cụ thể cho câu hỏi, sử dụng trình giữ chỗ 1x1 để duy trì tỷ lệ vuông của div, với hình ảnh nền sử dụng background-sizeđể duy trì tỷ lệ khung hình của ảnh.

Tôi đã sử dụng background-position: center center;để bức ảnh sẽ được tập trung vào div. (Căn chỉnh ảnh ở trung tâm dọc hoặc dưới cùng sẽ trở nên xấu xí với ảnh trong thẻ 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>

Để tránh yêu cầu http thêm, hãy chuyển đổi hình ảnh giữ chỗ thành dữ liệu: URL .

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

0

bạn có thể sử dụng lớp "img-liquid" cho phiên bản mới hơn, ví dụ Bootstrap v4 .

và có thể sử dụng lớp "img-responsive" cho phiên bản cũ hơn như Bootstrap v3 .

Cách sử dụng : -

thẻ img với: -

class = "img-liquid"

src = "..."


0

Đây là một cách tiếp cận tất cả JavaScript. Nó thu nhỏ hình ảnh xuống dần dần cho đến khi nó khớp chính xác. Bạn chọn bao nhiêu để thu nhỏ nó mỗi lần nó thất bại. Ví dụ này thu nhỏ 10% mỗi lần thất bại:

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

Hãy sao chép và dán trực tiếp.


0

Những gì làm việc cho tôi là:

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

inline-flex được yêu cầu để giữ cho hình ảnh không đi ra ngoài div.

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.