Tam yükseklikte bir uygulamada flexbox ve dikey kaydırmayı nasıl birleştirebilirim?


106

Flexbox kullanarak tam yükseklikte bir uygulama kullanmak istiyorum. display: box;Bu bağlantıda eski flexbox düzen modülünü ( ve diğer şeyleri) kullanarak istediğimi buldum : CSS3 Flexbox tam boy uygulaması ve taşma

Bu, yalnızca flexbox CSS özelliklerinin eski sürümünü destekleyen tarayıcılar için doğru bir çözümdür.

İle bir kap kullanılarak: Ben daha yeni FlexBox özelliklerini kullanmayı denemek istiyorsanız, ben bir yazar olarak listelenen aynı linkte ikinci çözümü kullanmaya çalışacağım height: 0px;. Dikey bir kaydırma gösterir.

Bundan pek hoşlanmıyorum çünkü başka sorunları da beraberinde getiriyor ve çözümden çok geçici bir çözüm.

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>

Temel bir örnekle de bir JSFiddle hazırladım: http://jsfiddle.net/ch7n6/

Bu tam yükseklikte bir HTML web sitesidir ve içerik öğesinin flexbox özellikleri nedeniyle altbilgi en altta yer alır. Farklı yüksekliği simüle etmek için çubuğu CSS kodu ile sonuç arasında hareket ettirmenizi öneririm.


1
Aradığınız davranış bu değil mi? jsfiddle.net/ch7n6/2
cimmanon

2
jsfiddle.net/ch7n6/3 Evet! Bu. : D Ama etkiyi elde etmek için neden bir yükseklik belirtmem gerektiğini anlayamıyorum. Her neyse, ayar: yükseklik: 1px; işler
José Cabo

Şimdi yüksekliği minimum yüksekliğe değiştirdim. Çok daha iyi. Teşekkürler.
José Cabo

1
@ JoséCabo +1 - güzel hile yüksekliği: 0 dikey kaydırmayı göstermek için! Bunun neden işe yaradığını açıklayabilir misiniz ?
Danield

1
flex-shrink:0Hem üstbilgi hem de altbilgi için başvurmalısınız .
Saorikido

Yanıtlar:


211

Bana cevabı veren https://stackoverflow.com/users/1652962/cimmanon'a teşekkürler .

Çözüm, dikey kaydırılabilir öğeye bir yükseklik ayarlamaktır. Örneğin:

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

Eleman edecek bir istemedikçe FlexBox onu yeniden hesaplar nedeniyle yüksekliğe sahip dk-height kullanabilirsiniz böylece height: 100px;tam olarak aynı olduğunu:min-height: 100px;

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

min-heightDikey kaydırmada bir istiyorsanız en iyi çözüm :

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

Makaleyi görmek için yeterli alan olmaması durumunda sadece tam dikey kaydırma istiyorsanız:

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

Nihai kod: http://jsfiddle.net/ch7n6/867/


2
min-heightChrome'da kullanmak işe yaramıyor, altbilginin boyutunu bir şekilde etkiliyor. heightAncak kullanmak istenen sonucu verir.
phant0m

1
O yüksekliği "otomobilin" olduğu yere yerleştirmeye çalışın. Bunu inceledim ve bence doğru yer bu mülk. Bu yüzden minimum yükseklik ve yükseklik kullanmak yerine kullanın.
José Cabo

height: 0içerik taştığında ve olmadığında bazı 2px atlama düzeltildi. Çok garip. Yine de teşekkürler.
ProblemsOfSumit

@Sumit, hangi sorunla karşı karşıya olduğunuzun bir resmini verebilir misiniz?
José Cabo

Keman bağlantısını açtım ve artık Chrome'da çalışmıyor gibi görünüyor (Firefox'ta çalışıyor). Kaydırma çubuğu kayboldu. Bunu tekrar çalıştırmanın bir fikri olan var mı?
bahisleri

62

Flexbox özellik düzenleyicisi burada.

Bu, flexbox'ın teşvik edilmiş bir kullanımıdır, ancak en iyi davranış için ince ayar yapmanız gereken birkaç şey vardır.

  • Ön ek kullanmayın. Öneksiz flexbox çoğu tarayıcıda iyi desteklenmektedir. Her zaman öneksiz ile başlayın ve sadece desteklemek için gerekirse önekler ekleyin.

  • Üstbilginiz ve altbilginiz esnemeye yönelik olmadığından, her ikisi de flex: none;onlara ayarlanmış olmalıdır . Şu anda, bazı örtüşen etkiler nedeniyle benzer bir davranışınız var, ancak daha sonra kazayla kafanızı karıştırmak istemediğiniz sürece buna güvenmemelisiniz. (Varsayılan olarak flex:0 1 auto, otomatik yüksekliklerinden başlarlar ve küçülebilirler ancak büyüyemezler, ancak aynı zamanda overflow:visiblevarsayılan olarak onlar da küçülmelerini min-height:autoönlemek için varsayılanlarını tetikler . Bunlara bir kez ayarlarsanız overflow, min-height:autodeğişikliklerin davranışı (minimum içerik yerine sıfıra geçilir) ve aniden ekstra uzun <article>öğe tarafından ezilirler .)

  • Siz de basitleştirebilirsiniz <article> flex- sadece ayarlayın flex: 1;ve gitmeniz iyi olur. Daha karmaşık bir şey yapmak için iyi bir nedeniniz yoksa , https://drafts.csswg.org/css-flexbox/#flex-common adresindeki ortak değerlere bağlı kalmaya çalışın - davranışların çoğunu okumak ve kaplamak daha kolaydır. çağırmak isteyeceksiniz.


flex: yok; beni kurtardı Esnek bir elemanın çocuklarının tüm boyunu almasına ve ebeveyninin yüksekliğini% 100 görmezden gelmesine yardımcı olan
şeydi (

21

Mevcut spesifikasyon şunları söylüyor flex: 1 1 auto:

Öğeyi width/ heightözelliklerine göre boyutlandırır, ancak onları tamamen esnek hale getirir, böylece ana eksen boyunca herhangi bir boş alanı emer. Tüm öğeler ise flex: auto, flex: initialya flex: none, boyutlandınîmış öğeleri sonra herhangi olumlu boş alan ile öğelere eşit olarak dağıtılacaktır flex: auto.

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

Bana bir öğenin 100 piksel uzunluğunda olduğunu söylerseniz, mutlak değil, daha çok "önerilen" bir boyut olarak ele alınır. Küçülmesine ve büyümesine izin verildiği için, izin verdiği kadar yer kaplar. Bu nedenle, bu satırı "ana" öğenize eklemek işe height: 0yarar : (veya herhangi bir küçük sayı).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.