2017-07-03 26 views
36

Một hình ảnh trong một hộp có kiểu max-height xuất hiện để hiển thị khác nhau tùy thuộc vào việc nó có thuộc tính heightwidth được đặt hay không.Tại sao chiều rộng và chiều cao của mặt hàng flex ảnh hưởng đến cách một mặt hàng flex được hiển thị?

với thuộc tính, được đặt thành chiều rộng/chiều cao thực của hình ảnh, hiển thị với tỷ lệ khung hình được giữ nguyên, nhưng không có thuộc tính tôn trọng max-height và xuất hiện bị đè bẹp.

.flex-parent { 
 
    display: flex; 
 
    max-height: 10vh; 
 
}
<div class="flex-parent"> 
 
    <img       src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Red_eyed_tree_frog_edit2.jpg/320px-Red_eyed_tree_frog_edit2.jpg"> 
 
    <img width="320" height="240" src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Red_eyed_tree_frog_edit2.jpg/320px-Red_eyed_tree_frog_edit2.jpg"> 
 
</div>

Đây là như thế nào là xuất hiện trong Chrome 58 (và nó xuất hiện tương tự như trong Firefox 54).

Different rendering of img in flexbox. Without width and height attributes, and with

Tại sao họ làm cách khác nhau? Các quy tắc chi phối hành vi này là gì?

Sự hiểu biết của tôi (rõ ràng là không chính xác) là thuộc tính chiều cao và chiều rộng ghi đè chiều cao và chiều rộng nội tại được tìm thấy khi tải hình ảnh và nếu thuộc tính chiều cao và chiều rộng bằng kích thước của hình ảnh, sẽ không có sự khác biệt hiển thị khi hình ảnh đã được tải.

Bối cảnh được thực hiện một trang với những hình ảnh đáp ứng, trong đó mỗi hình ảnh

  • có thể có kích thước gốc độc đáo
  • không gây ra một quy trình ngược khi nó được nạp, tức là không gian chính xác được dành riêng trên ban đầu render (do đó sử dụng chiều cao và các thuộc tính chiều rộng)
  • có thể phù hợp với tất cả trên màn hình cùng một lúc (vì thế tôi rối tung với vh trong CSS)

Hình ảnh ếch là từ https://en.wikipedia.org/wiki/File:Red_eyed_tree_frog_edit2.jpg

+0

Bạn đã gán 'max-height' cho div cha, gán chiều cao đó vào thẻ img' flex-parent img: first-of-type' tôi đã sử dụng 'first-of-type' để chỉ thực hiện' img' đầu tiên. Hình ảnh thứ hai có 'chiều cao' và' chiều rộng' để có tỷ lệ khung hình phù hợp nhưng đầu tiên là chiều rộng hiển thị không phải là tỷ lệ co – LKG

+0

Bạn có thể xem tại đây ví dụ https://jsfiddle.net/Lokeshg27/tp53tv82/23/ – LKG

Trả lời

31

Cài đặt ban đầu của hộp chứa flex là align-items: stretch.

Điều đó có nghĩa là các mặt hàng flex sẽ mở rộng trên cross axis của vùng chứa.

Trong vùng chứa hướng hàng, như trong câu hỏi, trục chéo là dọc.

Điều đó có nghĩa là các mục (hình ảnh, trong trường hợp này) sẽ bao phủ chiều cao đầy đủ của vùng chứa.

Tuy nhiên, khi một mục flex có kích thước chữ thập xác định, ghi đè mặc định stretch.

Từ spec:

8.3. Cross-axis Alignment: the align-items and align-self properties

mục Flex có thể được sắp xếp ở trên trục ngang của dòng hiện tại của container flex , tương tự như justify-content nhưng trong vuông góc hướng.

stretch

Nếu chéo sở hữu của mục flex kích thước tính để auto, và không phải của lề chéo trục là auto, mục flex là kéo dài.

Đây là ngôn ngữ chính:

Nếu chéo sở hữu của mục flex kích thước tính để auto

Và đây là cách spec định nghĩa "sở hữu kích thước chéo":

Chiều rộng hoặc chiều cao của mặt hàng flex, tùy theo kích thước nào trong khổ ngang , là t mặt hàng số của anh ấy là. Thuộc tính kích thước chéo là tùy theo số nào của width hoặc height có kích thước chéo.

https://www.w3.org/TR/css-flexbox-1/#cross-size-property


Vì vậy, mã của bạn dường như được chơi ra như đã định nghĩa trong spec.

Đây là những gì bạn có:

.flex-parent { 
 
    display: flex; 
 
    max-height: 10vh; 
 
}
<div class="flex-parent"> 
 
    <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Red_eyed_tree_frog_edit2.jpg/320px-Red_eyed_tree_frog_edit2.jpg"> 
 
    <img width="320" height="240" src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Red_eyed_tree_frog_edit2.jpg/320px-Red_eyed_tree_frog_edit2.jpg"> 
 
</div>

Những hình ảnh đầu tiên không có chiều rộng được xác định (kích thước chính) hoặc chiều cao (kích thước chữ thập), hoặc trong CSS hoặc HTML . Do đó, kích thước chữ thập của nó tính đến auto.

Tuyên bố này:

Nếu chéo sở hữu của mục flex kích thước tính để auto

... là đúng, và align-items: stretch đi vào hiệu lực.

Hình ảnh mở rộng trên chiều cao của vùng chứa, là 10px.

Hình ảnh thứ hai, tuy nhiên, có định cỡ rõ ràng. Kích thước chéo được xác định trong HTML (height="240").

Bây giờ tuyên bố này:

Nếu chéo sở hữu của mục flex kích thước tính để auto

... là sai, và align-items: stretch được ghi đè. Thuộc tính HTML height chiếm ưu thế.

Hai lưu ý về hình ảnh thứ hai:

  1. Hình ảnh lờ đi max-height hạn trên thùng vì một thiết lập ban đầu trong CSS là overflow: visible.
  2. HTML widthheight thuộc tính ánh xạ tới thuộc tính CSS tương ứng của chúng. Do đó, height="240" ghi đè mặc định height: auto. Xem dưới đây để tham khảo spec. *

Có hai vấn đề khác cần xem xét khi render hình ảnh trong một container flex.

  1. Kích thước tối thiểu mặc định của các mục flex. Cài đặt này ngăn các mục flex co lại bên dưới kích thước nội dung của chúng. Đọc bài này để biết chi tiết đầy đủ:

  2. hành vi Nhờ biển đổi giữa các trình duyệt lớn. Firefox, Chrome, Safari, Edge và IE11 không phải lúc nào cũng hiển thị hình ảnh dưới dạng các mục flex theo cùng một cách. Đọc bài này để biết thêm chi tiết:


Xem xét tất cả các yếu tố trên, đây là giải pháp đề nghị của tôi:

.flex-parent { 
 
    display: flex; 
 
    max-height: 50vh; /* adjusted for demo */ 
 
} 
 

 
.flex-parent { 
 
    min-width: 0; 
 
} 
 

 
img { 
 
    width: 100%; 
 
    height: auto; 
 
}
<div class="flex-parent"> 
 
    <div> 
 
    <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Red_eyed_tree_frog_edit2.jpg/320px-Red_eyed_tree_frog_edit2.jpg"> 
 
    </div> 
 
    <div> 
 
    <img width="320" height="240" src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Red_eyed_tree_frog_edit2.jpg/320px-Red_eyed_tree_frog_edit2.jpg"> 
 
    </div> 
 
</div>


* HTML widthheight thuộc tính ánh xạ tới thuộc tính CSS tương ứng của chúng. Do đó, khi được chỉ định, chúng sẽ ghi đè các giá trị mặc định của CSS.Từ spec HTML5:

10.4.3 Attributes for embedded content and images

Các widthheight thuộc tính trên applet, embed, iframe, object hoặc video yếu tố, và input yếu tố với một thuộc tính type ở bang Nút hình ảnh và đại diện cho hình ảnh hoặc người dùng dự kiến ​​cuối cùng sẽ đại diện cho một hình ảnh, bản đồ cho các thuộc tính kích thướcwidthheight trên phần tử tương ứng.

10.2 The CSS user agent style sheet and presentational hints

Khi văn bản dưới đây nói rằng một thuộc tính trên một yếu tố bản đồ đến chiều tài sản (hoặc tài sản), có nghĩa là nếu các phần tử có một thuộc tính được thiết lập, và phân tích giá trị của thuộc tính đó sử dụng rules for parsing dimension values không tạo ra lỗi, khi đó tác nhân người dùng được mong đợi sử dụng thứ nguyên được phân tách là làm giá trị cho một thuộc tính , với giá trị được cho dưới dạng chiều dài pixel nếu kích thước là số nguyên và giá trị được đưa ra dưới dạng phần trăm nếu số kích thước là phần trăm.

3

Đã thử đọc thông số kỹ thuật flexbox w3c và vấp vào this. Nó nói rằng

Đối với mỗi thứ nguyên, nếu kích thước của hộp chứa nội dung flex là là kích thước nhất định, hãy sử dụng; nếu kích thước của thùng chứa flex đang được kích thước theo giới hạn tối thiểu hoặc tối đa nội dung, thì không gian có sẵn trong thứ nguyên đó là ràng buộc đó.

Nếu không, trừ lề, đường viền và đệm của vùng chứa flex khỏi khoảng trống có sẵn cho vùng chứa flex trong kích thước đó và sử dụng giá trị đó có thể dẫn đến giá trị vô hạn.

Hy vọng điều này sẽ hữu ích.

3

Ở đây bạn đã viết chiều cao tối đa: 10vh, vh không hỗ trợ trong bất kỳ trình duyệt nào ngoại trừ iOS mới nhất 6. Điều này áp dụng cho tất cả đơn vị độ dài liên quan đến chế độ xem. sử dụng các giá trị khác thay vì Vh này sẽ hoạt động tốt. Vui lòng đọc blog này https://css-tricks.com/the-lengths-of-css/.

.flex-parent { 
 
    display: flex; 
 
    max-height: max-content; 
 
}
<div class="flex-parent"> 
 
    <img       src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Red_eyed_tree_frog_edit2.jpg/320px-Red_eyed_tree_frog_edit2.jpg"> 
 
    <img width="320" height="240" src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Red_eyed_tree_frog_edit2.jpg/320px-Red_eyed_tree_frog_edit2.jpg"> 
 
</div>

+4

Bài viết bạn đã chỉ ra là từ năm 2013, trong thời gian internet, khoảng một thập kỷ trước. https://caniuse.com/#search=vw Điều này cho thấy có bao nhiêu phép đo liên quan đến khung nhìn được cải thiện. Cá nhân tôi thực sự thích sử dụng vh/vw trong một số trường hợp. –

0

Vấn đề là nơi bạn đặt max-height. Chiều cao tối đa của thuộc tính css không được kế thừa theo mặc định. Khai báo css của bạn tạo ra một div là 10% chiều cao của khung nhìn. Hình ảnh không có kích thước được đặt thu nhỏ dựa trên kích thước gốc của nó. Hình ảnh bạn đặt kích thước ẩn sẽ luôn là những thứ nguyên đó. Tùy thuộc vào kích thước của div, nó có thể tràn. Nếu bạn đặt thuộc tính chiều cao tối đa trên hình ảnh đầu tiên, nó phải thay đổi kích thước để giữ tỷ lệ khung hình giống nhau.

Các vấn đề liên quan