Tại sao flexbox kéo dài hình ảnh của tôi thay vì giữ lại tỷ lệ khung hình?


156

Flexbox có hành vi này trong đó nó kéo dài hình ảnh đến chiều cao tự nhiên của chúng. Nói cách khác, nếu tôi có một hộp chứa flexbox với hình ảnh con và tôi thay đổi kích thước chiều rộng của hình ảnh đó, chiều cao hoàn toàn không thay đổi kích thước và hình ảnh bị kéo dài.

div {
  display: flex; 
  flex-wrap: wrap;
}
img{ 
  width: 50%
}
<div>
    <img src="https://loremflickr.com/400/300" >
    <h4>Appify</h4>
    <p> some text </p>
</div>

Điều gì gây ra điều này?

Tôi đã thêm CodePen này để chứng minh điều tôi muốn nói.


5
Trong Firefox và IE hoạt động tốt. Trong Chrome, bạn có thể khắc phục bằng align-self:flex-start hình ảnh. Tôi không biết tại sao, có thể giá trị mặc định trong chrome bị kéo dài.

2
Ngoài ra thêm chiều cao: 100%; để img khắc phục sự cố, tôi muốn biết tại sao nó cũng kéo dài hình ảnh.
Paran0a

3
@blonfu, giá trị mặc định trong tất cả các trình duyệt là align-items: stretch/ align-self: stretch. Nếu bạn thêm đường viền xung quanh từng mục và xóa wrap, bạn sẽ thấy tất cả các mục trải dài trong tất cả các trình duyệt: codepen.io/anon/pen/oLXBVx?editors=1100
Michael Benjamin

Ok. Tôi tìm hiểu điều này nhưng với hình ảnh hoạt động khác nhau trong chrome và trình duyệt khác. Chrome không tôn trọng tỷ lệ khung hình nếu bạn không xác định chiều cao.

@blonfu, vâng. Không có câu hỏi có sự không nhất quán trình duyệt và mức độ chi tiết hơn.
Michael Benjamin

Câu trả lời:


365

Nó được kéo dài bởi vì align-selfgiá trị mặc định là stretch. Đặt align-selfthành center.

align-self: center;

Xem tài liệu ở đây: align-self


Có nhưng trình duyệt khác xác định tỷ lệ khung hình trong ảnh. Chrome cũng không áp dụng cơ sở flex trong img

9
Tôi nghĩ rằng align-self: start;có thể là một câu trả lời mạnh mẽ hơn bởi vì hình ảnh nên thẳng hàng với TOP của các thùng chứa của chúng (không phải ở giữa) giống như bất kỳ hình ảnh không có phong cách nào (không có css). Dù bằng cách nào, cả hai câu trả lời đều sửa lỗi kéo dài. Vì vậy, nó phụ thuộc vào những gì OP muốn tất nhiên - chỉ là không có được ấn tượng 'tập trung theo chiều dọc' từ bài đăng của OP.
cóc

Nếu bạn không xác định chiều rộng trên hình ảnh và nó nằm trong hộp chứa flex, nó sẽ kéo dài đến 100%. align-self: [flex-start, center...others]sẽ ngăn hình ảnh lấy 100% chiều rộng của hộp chứa flex. align-self:centertất nhiên là sửa nó, nhưng nếu bạn muốn hình ảnh của mình bắt đầu từ đầu hoặc cuối sử dụng containeralign-items: flex-start or flex-end
mã hóa

1
Bạn cũng có thể đặt align-items: center(hoặc bất kỳ căn chỉnh nào phù hợp với nhu cầu của bạn) cho phụ huynh.
bầu chọn

16

Thuộc tính chính là align-self: center:

.container {
  display: flex;
  flex-direction: column;
}

img {
  max-width: 100%;
}

img.align-self {
  align-self: center;
}
<div class="container">
    <p>Without align-self:</p>
    <img src="http://i.imgur.com/NFBYJ3hs.jpg" />
    <p>With align-self:</p>
    <img class="align-self" src="http://i.imgur.com/NFBYJ3hs.jpg" />
</div>


1

Tôi đã đối mặt với cùng một vấn đề với một menu Foundation. align-self: center;không làm việc cho tôi.

Giải pháp của tôi là bọc hình ảnh bằng một <div style="display: inline-table;">...</div>


2
Đó là về flexbox mặc dù.

Đây một giải pháp cho flexbox. Hình ảnh và div nằm trong một hộp chứa flexbox.
isapir

0

Thêm vào marginđể căn chỉnh hình ảnh:

Vì chúng ta muốn imagetrở thành left-aligned, chúng tôi đã thêm:

img {
  margin-right: auto;
}

Tương tự cho imageright-aligned, chúng ta có thể thêm margin-right: auto;. Đoạn mã hiển thị bản demo cho cả hai loại căn chỉnh.

Chúc may mắn...

div {
  display:flex; 
  flex-direction:column;
  border: 2px black solid;
}

h1 {
  text-align: center;
}
hr {
  border: 1px black solid;
  width: 100%
}
img.one {
  margin-right: auto;
}

img.two {
  margin-left: auto;
}
<div>
  <h1>Flex Box</h1>
  
  <hr />
  
  <img src="https://via.placeholder.com/80x80" class="one" 
  />
  
  
  <img src="https://via.placeholder.com/80x80" class="two" 
  />
  
  <hr />
</div>


0

Nó được kéo dài bởi vì giá trị mặc định align-self là kéo dài. Có hai giải pháp cho trường hợp này: 1. set img align-self: centre OR 2. set Parent align-items: centre

img {

   align-self: trung tâm
}

HOẶC LÀ

.cha mẹ {
  align-item: trung tâm
}
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.