Làm cách nào để kết hợp flexbox và cuộn dọc trong một ứng dụng có chiều cao đầy đủ?


101

Tôi muốn sử dụng một ứng dụng có chiều cao đầy đủ bằng flexbox. Tôi đã tìm thấy thứ mình muốn bằng cách sử dụng mô-đun bố cục flexbox cũ ( display: box;và những thứ khác) trong liên kết này: Ứng dụng CSS3 Flexbox full-height và tràn

Đây là một giải pháp chính xác cho các trình duyệt chỉ hỗ trợ phiên bản cũ của các thuộc tính CSS flexbox.

Nếu tôi muốn thử sử dụng các thuộc tính flexbox mới hơn, tôi sẽ thử sử dụng giải pháp thứ hai trong cùng một liên kết được liệt kê dưới dạng hack: sử dụng vùng chứa với height: 0px;. Nó giúp hiển thị một cuộn dọc.

Tôi không thích nó cho lắm vì nó giới thiệu các vấn đề khác và nó là một cách giải quyết hơn là một giải pháp.

html, body {
    height: 100%;    
}
#container {
	display: flex;
	flex-direction: column;
	height: 100%;
}
#container article {
	flex: 1 1 auto;
	overflow-y: scroll;
}
#container header {
    background-color: gray;
}
#container footer {
    background-color: gray;
}
<section id="container" >
    <header id="header" >This is a header</header>
    <article id="content" >
        This is the content that
        <br />
        With a lot of lines.
        <br />
        With a lot of lines.
        <br />
        This is the content that
        <br />
        With a lot of lines.
        <br />
        <br />
        This is the content that
        <br />
        With a lot of lines.
        <br />
        <br />
        This is the content that
        <br />
        With a lot of lines.
        <br />
    </article>
    <footer id="footer" >This is a footer</footer>
</section>

Tôi cũng đã chuẩn bị một JSFiddle với một ví dụ cơ bản: http://jsfiddle.net/ch7n6/

Đây là một trang web HTML có chiều cao đầy đủ và chân trang nằm ở dưới cùng do thuộc tính flexbox của phần tử nội dung. Tôi khuyên bạn nên di chuyển thanh giữa mã CSS và kết quả để mô phỏng chiều cao khác nhau.


Đây không phải là hành vi bạn đang tìm kiếm? jsfiddle.net/ch7n6/2
cimmanon

2
jsfiddle.net/ch7n6/3 Có! Nó là. : D Nhưng tôi không hiểu tại sao tôi cần phải chỉ ra chiều cao để có được hiệu ứng. Dù sao thì thiết lập: height: 1px; hoạt động
José Cabo

Bây giờ tôi đã thay đổi chiều cao thành chiều cao tối thiểu. Tốt hơn nhiều. Cảm ơn bạn.
José Cabo

1
@ JoséCabo +1 - chiều cao lừa đẹp: 0 để hiển thị cuộn dọc! Bạn có thể giải thích tại sao điều này hoạt động?
Danield

1
Bạn nên áp dụng flex-shrink:0cho cả đầu trang và chân trang.
Saorikido,

Câu trả lời:


201

Cảm ơn https://stackoverflow.com/users/1652962/cimmanon đã cho tôi câu trả lời.

Giải pháp là đặt chiều cao cho phần tử có thể cuộn dọc. Ví dụ:

#container article {
    flex: 1 1 auto;
    overflow-y: auto;
    height: 0px;
}

Phần tử sẽ có chiều cao vì flexbox tính toán lại nó trừ khi bạn muốn chiều cao tối thiểu để bạn có thể sử dụng phần tử height: 100px;đó chính xác như:min-height: 100px;

#container article {
    flex: 1 1 auto;
    overflow-y: auto;
    height: 100px; /* == min-height: 100px*/
}

Vì vậy, giải pháp tốt nhất nếu bạn muốn có min-heighttrong cuộn dọc:

#container article {
    flex: 1 1 auto;
    overflow-y: auto;
    min-height: 100px;
}

Nếu bạn chỉ muốn cuộn dọc đầy đủ trong trường hợp không có đủ dung lượng để xem bài viết:

#container article {
    flex: 1 1 auto;
    overflow-y: auto;
    min-height: 0px;
}

Mã cuối cùng: http://jsfiddle.net/ch7n6/867/


2
Sử dụng min-heighttrong Chrome không hoạt động, nó ảnh hưởng đến kích thước của footer bằng cách nào đó. heightTuy nhiên, sử dụng sẽ cho kết quả mong muốn.
phant0m

1
Cố gắng đặt chiều cao đó ở nơi "tự động". Tôi đã nghiên cứu điều này và tôi nghĩ nơi phù hợp là tài sản này. Vì vậy, thay vì sử dụng chiều cao tối thiểu và chiều cao sử dụng nó.
José Cabo

height: 0đã sửa lỗi nhảy 2px khi nội dung tràn so với khi không. Thật ki cục. Xin cảm ơn.
ProblemsOfSumit

@Sumit, bạn có thể cung cấp hình ảnh về vấn đề bạn đang gặp phải không?
José Cabo

Tôi đã mở liên kết fiddle và dường như không còn hoạt động trên Chrome (hoạt động trên Firefox). Thanh cuộn biến mất. Có ai có ý tưởng làm thế nào để làm cho điều này hoạt động trở lại?
cược vào

61

Trình soạn thảo thông số Flexbox tại đây.

Đây là cách sử dụng flexbox được khuyến khích, nhưng có một số điều bạn nên điều chỉnh để có hành vi tốt nhất.

  • Không sử dụng tiền tố. Flexbox không định sẵn được hỗ trợ tốt trên hầu hết các trình duyệt. Luôn bắt đầu với không có tiền tố và chỉ thêm tiền tố nếu cần thiết để hỗ trợ nó.

  • Vì đầu trang và chân trang của bạn không có nghĩa là linh hoạt, nên cả hai đều nên flex: none;đặt trên chúng. Ngay bây giờ bạn có một hành vi tương tự do một số tác động chồng chéo, nhưng bạn không nên dựa vào đó trừ khi bạn muốn vô tình nhầm lẫn chính mình sau này. (Mặc định là flex:0 1 auto, vì vậy chúng bắt đầu ở độ cao tự động và có thể thu nhỏ nhưng không phát triển, nhưng chúng cũng overflow:visibletheo mặc định, điều này kích hoạt mặc định của chúng min-height:autođể ngăn chúng thu nhỏ lại. Nếu bạn đã từng đặt overflowchúng, hành vi min-height:autosẽ thay đổi (chuyển sang 0 thay vì nội dung tối thiểu) và chúng sẽ đột nhiên bị bóp nghẹt bởi <article>phần tử quá cao .)

  • Bạn cũng có thể đơn giản hóa việc này <article> flex- chỉ cần thiết lập flex: 1;và bạn sẽ sẵn sàng. Cố gắng gắn bó với các giá trị chung trong https://drafts.csswg.org/css-flexbox/#flex-common trừ khi bạn có lý do chính đáng để làm điều gì đó phức tạp hơn - chúng dễ đọc hơn và bao gồm hầu hết các hành vi bạn sẽ muốn gọi.


21

Thông số kỹ thuật hiện tại cho biết điều này liên quan đến flex: 1 1 auto:

Định kích thước mục dựa trên thuộc tính width/ heightnhưng làm cho chúng hoàn toàn linh hoạt để chúng hấp thụ mọi không gian trống dọc theo trục chính. Nếu tất cả các mục đều là flex: auto, flex: initialhoặc flex: none, bất kỳ không gian trống tích cực nào sau khi các mục đã được định kích thước sẽ được phân phối đồng đều cho các mục có flex: auto.

http://www.w3.org/TR/2012/CR-css3-flexbox-20120918/#flex-common

Tôi nghe có vẻ giống như nếu bạn nói một phần tử cao 100px, thì phần tử đó được coi giống như kích thước "được đề xuất" hơn, chứ không phải là tuyệt đối. Bởi vì nó được phép thu nhỏ và phát triển, nó chiếm nhiều không gian cho phép. Đó là lý do tại sao việc thêm dòng này vào phần tử "chính" của bạn có tác dụng: height: 0(hoặc bất kỳ số nhỏ nào khác).

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.