CSS: Làm cách nào tôi có thể đặt kích thước hình ảnh so với chiều cao gốc?


84

Tôi đang cố gắng tìm ra cách định lại kích thước hình ảnh để nó giữ nguyên tỷ lệ giữa chiều rộng và chiều cao, nhưng được kích thước lại cho đến khi chiều cao của hình ảnh khớp với chiều cao của div chứa. Tôi có những hình ảnh này khá lớn và dài (ảnh chụp màn hình) và tôi muốn đặt chúng vào div chiều rộng 200px, chiều cao 180px để hiển thị và không định cỡ lại hình ảnh theo cách thủ công. Để làm cho điều này trông đẹp, các cạnh của hình ảnh cần phải tràn và được ẩn bằng div chứa. Đây là những gì tôi có cho đến nay:

http://jsfiddle.net/f9krj/2/

HTML

<a class="image_container" href="http://www.skintype.ca/assets/background-x_large.jpg">
    <img src="http://www.skintype.ca/assets/background-x_large.jpg" alt="" />
</a>

CSS

a.image_container {
    background-color: #999;
    width: 200px;
    height: 180px;
    display: inline-block;
    overflow: hidden;
}
a.image_container img {
    width: 100%;
}

Như bạn có thể thấy, có màu xám hiển thị trên vùng chứa chính của hình ảnh mà hoàn toàn không được hiển thị. Để thùng chứa đó được lấp đầy hoàn toàn, chiều rộng cần phải được tràn đều hai bên. Điều này có khả thi không? Cũng có thể tài khoản cho một hình ảnh quá cao?


2
Bạn đã thử sử dụng cài đặt và hình ảnh nền CSS background-size: cover;chưa?
CP510

sử dụng max-height:100%;thay vì width, fiddle
Patrick Evans

@ CP510 ya bạn nói đúng. Tôi nên đã tìm ra điều này! jsfiddle.net/f9krj/4
Jon McPherson

Câu trả lời:


81

Câu trả lời gốc:

Nếu bạn đã sẵn sàng chọn CSS3, bạn có thể sử dụng thuộc tính dịch css3. Thay đổi kích thước dựa trên bất kỳ thứ gì lớn hơn. Nếu chiều cao của bạn lớn hơn và chiều rộng nhỏ hơn vùng chứa, chiều rộng sẽ được kéo dài đến 100% và chiều cao sẽ bị cắt bớt từ cả hai bên. Tương tự với chiều rộng lớn hơn cũng vậy.

Nhu cầu của bạn, HTML:

<div class="img-wrap">
  <img src="http://lorempixel.com/300/160/nature/" />
</div>
<div class="img-wrap">
  <img src="http://lorempixel.com/300/200/nature/" />
</div>
<div class="img-wrap">
  <img src="http://lorempixel.com/200/300/nature/" />
</div>

CSS:

.img-wrap {
  width: 200px;
  height: 150px;
  position: relative;
  display: inline-block;
  overflow: hidden;
  margin: 0;
}

div > img {
  display: block;
  position: absolute;
  top: 50%;
  left: 50%;
  min-height: 100%;
  min-width: 100%;
  transform: translate(-50%, -50%);
}

Thì đấy! Làm việc: http://jsfiddle.net/shekhardesigner/aYrhG/

Giải trình

DIV được đặt thành relativevị trí. Điều này có nghĩa là tất cả các phần tử con sẽ nhận được tọa độ bắt đầu (điểm gốc) từ nơi DIV này bắt đầu.

Hình ảnh được đặt làm phần tử BLOCK, min-width/heightcả hai đều được đặt thành 100% có nghĩa là thay đổi kích thước hình ảnh bất kể kích thước của nó là nhỏ nhất bằng 100% kích thước của nó. minlà chìa khóa. Nếu theo chiều cao tối thiểu, chiều cao hình ảnh vượt quá chiều cao của phụ huynh thì không vấn đề gì. Nó sẽ tìm nếu chiều rộng tối thiểu và cố gắng đặt chiều cao tối thiểu là 100% của bố mẹ. Cả hai đều ngược lại. Điều này đảm bảo không có khoảng trống xung quanh div nhưng hình ảnh luôn lớn hơn một chút và được cắt bớtoverflow:hidden;

Bây giờ image, điều này được đặt thành một absolutevị trí với left:50%top:50%. Có nghĩa là đẩy hình ảnh 50% từ trên xuống và sang trái để đảm bảo nguồn gốc được lấy từ DIV. Các đơn vị Left / Top được đo từ đơn vị chính.

Khoảnh khắc kỳ diệu:

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

Bây giờ, translatechức năng này của thuộc tính CSS3 transformdi chuyển / định vị lại một phần tử được đề cập. Thuộc tính này xử lý phần tử được áp dụng, do đó các giá trị (x, y) OR (-50%, -50%) có nghĩa là di chuyển hình ảnh âm sang trái 50% kích thước hình ảnh và di chuyển lên đầu âm bản bằng 50% kích thước hình ảnh .

Ví dụ. nếu Kích thước hình ảnh là 200px × 150px, transform:translate(-50%, -50%)sẽ được tính để dịch (-100px, -75px). % đơn vị giúp ích khi chúng ta có nhiều kích thước hình ảnh.

Đây chỉ là một cách khó để tìm ra tâm của hình ảnh và DIV chính và khớp chúng.

Xin lỗi vì đã mất quá nhiều thời gian để giải thích!

Tài nguyên để đọc thêm:


11
Nó hoạt động nhưng tôi không thực sự hiểu nó. Ai đó tâm trí để giải thích?
geckob

10
Đây là phép thuật CSS tốt nhất của nó.
Liz

Vì nó vẫn chưa được giải thích ở tất cả: Ai đó có thể vui lòng giải thích điều này không? Vui lòng chỉnh sửa câu trả lời.
Vụ kiện của Fund Monica,

6
Điều này làm giảm hình ảnh, thay vì thực hiện thay đổi kích thước.
PiyaModi

39

Thay đổi mã của bạn:

a.image_container img {
    width: 100%;
}

Về điều này:

a.image_container img {
    width: auto; // to maintain aspect ratio. You can use 100% if you don't care about that
    height: 100%;
}

http://jsfiddle.net/f9krj/5/


Đây là giải pháp hoàn hảo. Cảm ơn! Nó đặt chiều cao và chiều rộng của hình ảnh theo thành phần chính, thay vì cắt giảm hình ảnh. Cảm ơn một lần nữa!
PiyaModi

18

Sử dụng max-widththuộc tính của CSS, như thế này:

img{
  max-width:100%;
}


0

bạn có thể sử dụng hộp flex cho nó .. điều này sẽ giải quyết vấn đề của bạn

.image-parent 
{
     height:33px; 
     display:flex; 
}
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.