Tự động thay đổi kích thước hình ảnh trong bố cục CSS FlexBox và giữ tỷ lệ khung hình?


98

Tôi đã sử dụng bố cục hộp flex CSS xuất hiện như hình dưới đây:

nhập mô tả hình ảnh ở đây

Nếu màn hình nhỏ hơn, nó sẽ biến thành như sau:

nhập mô tả hình ảnh ở đây

Vấn đề là hình ảnh không được thay đổi kích thước để giữ tỷ lệ khung hình từ hình ảnh gốc.

Có thể sử dụng CSS thuần túy và bố cục hộp flex để cho phép thay đổi kích thước hình ảnh nếu màn hình nhỏ hơn không?

Đây là html của tôi:

<div class="content">
  <div class="row"> 
    <div class="cell">
      <img src="http://i.imgur.com/OUla6mK.jpg"/>
    </div>
    <div class="cell">
      <img src="http://i.imgur.com/M16WzMd.jpg"/>
    </div>
  </div>
</div>

CSS của tôi:

.content {
    background-color: yellow;    
}

.row {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;

    -webkit-box-orient: horizontal; 
    -moz-box-orient: horizontal;
    box-orient: horizontal;
    flex-direction: row;

    -webkit-box-pack: center;
    -moz-box-pack: center;
    box-pack: center;
    justify-content: center;

    -webkit-box-align: center;
    -moz-box-align: center;
    box-align: center;  
    align-items: center;

    background-color: red;

}

.cell {
    -webkit-box-flex: 1;
    -moz-box-flex: 1;
    box-flex: 1;
    -webkit-flex: 1 1 auto;
    flex: 1 1 auto; 

    padding: 10px;
    margin: 10px;

    background-color: green;
    border: 1px solid red;
    text-align: center;

}

Câu trả lời:


83

img {max-width:100%;}là một cách để làm điều này. Chỉ cần thêm nó vào mã CSS của bạn.

http://jsfiddle.net/89dtxt6s/


3
Có thể thực hiện điều này đối với kích thước chiều cao nếu màn hình nhỏ hơn không?
confile

@confile nó sẽ phụ thuộc nhiều vào bố cục mã của bạn, nhưng bạn có thể thử thêm height:100%;vào imgcss.
Omega

height: 100vhsẽ làm điều đó, không height: 100%. Tạo kiểu cho chiều cao luôn khó.
gdbj

1
Tại sao điều này được đánh dấu là câu trả lời đúng? Omega đã không biến nó thành hành vi mặc định của trình duyệt sao? jsfiddle.net/89dtxt6s/221
VeeK

69

Tôi đến đây để tìm kiếm câu trả lời cho những hình ảnh méo mó của mình. Không hoàn toàn chắc chắn về những gì op đang tìm kiếm ở trên, nhưng tôi thấy rằng việc thêm vào align-items: centersẽ giải quyết được điều đó cho tôi. Đọc tài liệu, bạn nên ghi đè điều này nếu bạn đang uốn hình ảnh trực tiếp, vì đây align-items: stretchlà chế độ mặc định. Một giải pháp khác là bọc hình ảnh của bạn bằng một div trước.

.myFlexedImage {
  display: flex;
  flex-flow: row nowrap;
  align-items: center;
}

11
"Tôi đến đây tìm kiếm một câu trả lời cho hình ảnh méo mó của tôi" tôi đã nhận ở đây với cùng lý do và giải pháp của bạn đã giúp tôi (những gì đã được đánh dấu là giải pháp thực tế không giúp tôi cả)
Wagner da Silva

điều này đã giúp tôi quá, ai đó có thể giải thích tại sao điều này hoạt động?
Jerry B. thực tập sinh số 1

Đây là câu trả lời chính xác cho tôi. chiều rộng tối đa: 100%; đã không sửa chiều cao (chiều cao vẫn còn hơi kéo dài). Trong trường hợp của tôi, tôi đã sử dụng align-items: flex-start; bởi vì tôi không muốn hình ảnh được căn giữa theo chiều dọc trong vùng chứa, nhưng nó vẫn hoạt động vì nó ghi đè các mục căn chỉnh mặc định: căng; Dưới đây là một danh sách của tất cả các tài sản giá trị cho class-mục mà bạn có thể sử dụng để ghi đè lên: w3schools.com/cssref/css3_pr_align-items.asp
Kyle Vassella

Đã thử rất nhiều thứ, nhưng mục căn chỉnh của bạn: căn giữa trên trang chính là thứ duy nhất làm được điều đó.
Micros

Đây phải là câu trả lời được chấp nhận. Căn chỉnh nội dung không phù hợp với tôi về mặt kéo dài nhưng căn chỉnh các mục thì có, cả hai đều có các chức năng khác nhau. SE này làm rõ sự khác biệt giữa hai: stackoverflow.com/questions/27539262/…
John Ernest

41

Bạn có thể muốn thử tính năng CSS3 rất mới và đơn giản:

img { 
  object-fit: contain;
}

Nó bảo toàn tỷ lệ hình ảnh (như khi bạn sử dụng thủ thuật ảnh nền) và trong trường hợp của tôi hoạt động tốt cho cùng một vấn đề.

Tuy nhiên, hãy cẩn thận, nó không được hỗ trợ bởi IE (xem chi tiết hỗ trợ tại đây ).


4
Hãy nhớ rằng đối tượng phụ huynh có phải là một flex
Lokinou

Tôi đã thử điều này và nó hoạt động hoàn hảo trong một div flex.
Rémy Kaloustian

5

Tôi khuyên bạn nên xem xét background-sizecác tùy chọn để điều chỉnh kích thước hình ảnh.

Thay vì có hình ảnh trong trang nếu bạn đặt nó làm hình nền, bạn có thể đặt:

background-size: contain

hoặc là

background-size: cover

Các tùy chọn này tính đến cả chiều cao và chiều rộng khi chia tỷ lệ hình ảnh. Điều này sẽ hoạt động trong IE9 và tất cả các trình duyệt gần đây khác.


3

Trong hình ảnh thứ hai, có vẻ như bạn muốn hình ảnh lấp đầy hộp, nhưng ví dụ bạn đã tạo KHÔNG giữ nguyên tỷ lệ khung hình (vật nuôi trông bình thường, không mảnh mai hay béo).

Tôi không có manh mối nào nếu bạn chụp ảnh những hình ảnh đó làm ví dụ hay ví dụ thứ hai là "nó nên như thế nào" (bạn nói IS, trong khi ví dụ đầu tiên bạn nói "nên")

Dù sao, tôi phải giả định:

Nếu "hình ảnh không được thay đổi kích thước vẫn giữ nguyên tỷ lệ khung hình" và bạn cho tôi xem một hình ảnh KHÔNG giữ nguyên tỷ lệ khung hình của pixel, tôi phải cho rằng bạn đang cố gắng hoàn thành tỷ lệ khung hình của vùng "cắt xén" (bên trong của màu xanh lá cây) WILE giữ tỷ lệ co của pixel. Tức là bạn muốn lấp đầy ô bằng hình ảnh, bằng cách phóng to và cắt hình ảnh.

Nếu đó là vấn đề của bạn, mã bạn cung cấp KHÔNG phản ánh "vấn đề của bạn" mà là ví dụ bắt đầu của bạn.

Với hai giả định trước, những gì bạn cần không thể hoàn thành với hình ảnh thực tế nếu chiều cao của hộp là động, nhưng với hình nền. Bằng cách sử dụng "background-size: chứa" hoặc các kỹ thuật này (đệm thông minh theo phần trăm giới hạn việc cắt xén hoặc kích thước tối đa ở bất kỳ đâu bạn muốn): http://fofwebdesign.co.uk/template/_testing/scale-img/scale- img.htm

Cách duy nhất có thể thực hiện được điều này với hình ảnh là nếu chúng tôi QUÊN về hình ảnh thứ hai của bạn và các ô có chiều cao cố định, và FORTUNATELY, đánh giá theo hình ảnh mẫu của bạn, chiều cao vẫn giữ nguyên!

Vì vậy, nếu chiều cao của vùng chứa của bạn không thay đổi và bạn muốn giữ cho hình ảnh của mình hình vuông, bạn chỉ cần đặt chiều cao tối đa của hình ảnh thành giá trị đã biết đó (trừ phần đệm hoặc đường viền, tùy thuộc vào thuộc tính kích thước hộp của ô)

Như thế này:

<div class="content">
  <div class="row">    
      <div class="cell">    
          <img src="http://lorempixel.com/output/people-q-c-320-320-2.jpg"/>
      </div>
      <div class="cell">    
          <img src="http://lorempixel.com/output/people-q-c-320-320-7.jpg"/>
      </div>
    </div>
</div>

Và CSS:

.content {
    background-color: green;
}

.row {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;

    -webkit-box-orient: horizontal; 
    -moz-box-orient: horizontal;
    box-orient: horizontal;
    flex-direction: row;

    -webkit-box-pack: center;
    -moz-box-pack: center;
    box-pack: center;
    justify-content: center;

    -webkit-box-align: center;
    -moz-box-align: center;
    box-align: center;  
    align-items: center;

}

.cell {
    -webkit-box-flex: 1;
    -moz-box-flex: 1;
    box-flex: 1;
    -webkit-flex: 1 1 auto;
    flex: 1 1 auto;
    padding: 10px;
    border: solid 10px red;
    text-align: center;
    height: 300px;
    display: flex;
    align-items: center;
    box-sizing: content-box;
}
img {
    margin: auto;
    width: 100%;
    max-width: 300px;
    max-height:100%
}

http://jsfiddle.net/z25heocL/

Mã của bạn không hợp lệ (các thẻ mở thay vì thẻ đóng, vì vậy chúng xuất ra các ô NESTED, không phải các thẻ anh chị em, anh ấy đã sử dụng NHIỀU HÌNH ẢNH của bạn bên trong mã bị lỗi và hộp flex không giữ các ô mà cả hai ví dụ trong một cột ( bạn thiết lập "hàng" nhưng mã bị hỏng lồng một ô bên trong ô kia dẫn đến một ô bên trong một ô uốn, cuối cùng hoạt động dưới dạng COLUMNS. Tôi không biết bạn muốn hoàn thành điều gì và bạn đã nghĩ ra mã đó như thế nào, nhưng tôi ' m đoán những gì bạn muốn là này.

Tôi cũng đã thêm display: flex vào các ô, vì vậy hình ảnh được căn giữa (tôi nghĩ display: tablecũng có thể được sử dụng ở đây với tất cả các đánh dấu này)


Có vẻ như bạn không có chút manh mối nào về cách tôi trả lời câu hỏi. Tất cả html và css trong jsfiddle đó là những gì người hỏi (@confile) đã cung cấp. Chỉ cần đọc câu hỏi và bạn sẽ thấy điều đó. Giải pháp của tôi là một dòng css img {max-width: 100%;} đơn giản và người hỏi đã chấp nhận câu trả lời của tôi hơn một năm trước vì nó cung cấp giải pháp được yêu cầu. Chúc các bạn thành công ở đây, hãy cố gắng đọc câu hỏi thật chính xác và sau đó trả lời cho phù hợp nhé, cảm ơn.
Omega

0

HTML:

<div class="container">
    <div class="box">
        <img src="http://lorempixel.com/1600/1200/" alt="">
    </div>
</div>

CSS:

.container {
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: stretch;

  width: 100%;
  height: 100%;

  border-radius: 4px;
  background-color: hsl(0, 0%, 96%);
}

.box {
  border-radius: 4px;
  display: flex;
}

.box img {
  width: 100%;
  object-fit: contain;
  border-radius: 4px;
}

0

Đó là cách tôi xử lý các hình ảnh khác nhau (kích thước và tỷ lệ) trong một lưới linh hoạt.

.images {
  display: flex;
  flex-wrap: wrap;
  margin: -20px;
}

.imagewrapper {
  display: flex;
  justify-content: center;
  align-items: center;
  width: calc(50% - 20px);
  height: 300px;
  margin: 10px;
}

.image {
  display: block;
  object-fit: cover;
  width: 100%;
  height: 100%; /* set to 'auto' in IE11 to avoid distortions */
}
<div class="images">
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/800x600" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/1024x768" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/1000x800" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/500x800" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/800x600" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/1024x768" />
  </div>
</div>


-5

Tôi đang sử dụng jquery hoặc vw để giữ tỷ lệ

jquery

function setSize() {
    var $h = $('.cell').width();
    $('.your-img-class').height($h);
}
$(setSize);
$( window ).resize(setSize); 

vw

 .cell{
    width:30vw;
    height:30vw;
}
.cell img{
    width:100%;
    height:100%;
}
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.