Czy istnieje sposób na przerwanie linii w wielu liniach Flexbox?
Na przykład, aby złamać po każdym 3. elemencie w CodePen .
.container {
background: tomato;
display: flex;
flex-flow: row wrap;
align-content: space-between;
justify-content: space-between;
}
.item {
width: 100px;
height: 100px;
background: gold;
border: 1px solid black;
font-size: 30px;
line-height: 100px;
text-align: center;
margin: 10px;
}
.item:nth-child(3n) {
background: silver;
}
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">10</div>
</div>
Lubić
.item:nth-child(3n){
/* line-break: after; */
}
Odpowiedzi:
Najprostszym i najbardziej niezawodnym rozwiązaniem jest wstawianie elementów elastycznych we właściwych miejscach. Jeśli są wystarczająco szerokie (
width: 100%
), wymuszą przerwanie linii.Pokaż fragment kodu
Ale to brzydkie i nie semantyczne. Zamiast tego możemy wygenerować pseudoelementy wewnątrz elastycznego kontenera i użyć
order
do przeniesienia ich we właściwe miejsca.Pokaż fragment kodu
Ale nie jest to ograniczenie: flex pojemnik może mieć tylko
::before
i jak::after
pseudo-element. Oznacza to, że możesz wymusić tylko 2 łamanie linii.Aby rozwiązać ten problem, możesz wygenerować pseudoelementy wewnątrz elementów elastycznych zamiast w kontenerze elastycznym. W ten sposób nie będziesz ograniczony do 2. Ale te pseudoelementy nie będą elementami elastycznymi, więc nie będą w stanie wymusić przerwania linii.
Ale na szczęście CSS Display L3 wprowadził
display: contents
(obecnie obsługiwane tylko przez Firefoksa 37):Możesz więc zastosować
display: contents
do elementów podrzędnych elastycznego pojemnika i zawinąć zawartość każdego z nich w dodatkowe opakowanie. Następnie elementami elastycznymi będą te dodatkowe opakowania i pseudoelementy dzieci.Pokaż fragment kodu
Alternatywnie, według fragmentacji Flex Układ i CSS Fragmentacja , schematu flexbox umożliwia wymuszone przerwy za pomocą
break-before
,break-after
lub ich CSS 2.1 aliasów:Pokaż fragment kodu
Wymuszone podziały linii w Flexbox nie są jeszcze powszechnie obsługiwane, ale działa w przeglądarce Firefox.
źródło
break-after
rozwiązaniem, które wymagałoby jedynie modyfikacji selektora w arkuszu stylów.display: block;
do.container
::before
i::after
pseudo klas, aby liczba Rozwiązanie drugie działa w IE. YMMV!Z mojej perspektywy bardziej semantyczne jest używanie
<hr>
elementów jako podziałów linii między elementami elastycznymi.Testowane w Chrome 66, Firefox 60 i Safari 11.
źródło
gap: 10px;
z odległości między rzędami jest w rzeczywistości20px
. Adres, określ odstęp wiersza połowę tej wielkości:gap: 5px 10px;
.border
należy ustawić nanone
, zamiast0
border:0;
jest tak samo ważny jakborder:none;
. Zobacz: stackoverflow.com/questions/2922909/…@Oriol ma doskonałą odpowiedź, niestety od października 2017 r., Ani
display:contents
, anipage-break-after
jest szeroko obsługiwany, lepiej powiedzieć, że chodzi o Firefox, który obsługuje to, ale nie inne odtwarzacze, wymyśliłem następujący „hack”, który uważam za lepszy niż trudny kodowanie z przerwą po każdym trzecim elemencie, ponieważ bardzo utrudni to dostosowanie strony do urządzeń mobilnych.Jak już powiedziano, jest to hack, a wadą jest to, że musisz dodać całkiem sporo dodatkowych elementów za darmo, ale robi to sztuczkę i działa w różnych przeglądarkach nawet w datowanym IE11.
„Hack” polega po prostu na dodaniu dodatkowego elementu po każdym div, który jest ustawiony na,
display:none
a następnie użył css,nth-child
aby zdecydować, który z nich powinien być rzeczywiście widoczny, wymuszając hamulec linii taki jak ten:źródło
.container>p
. Wtedy wszystkie te<p></p>
tagi nie potrzebowałyby tegoclass
atrybutu. Nie ważne, oczywiście. Tylko mój leniwy mózg znajduje drobny, zajmujący mało miejsca drobiazg do twojego sprytnego rozwiązania. Oczywiście zależy to również od tego, czy użytkownik nie ma innych<p>
znaczników jako bezpośrednich potomków.container
div. Technicznie można zrobić to samo z innymi<div>
dziećmi, ale jesteś o wiele bardziej prawdopodobne, że inne<div>
sw.container
niż ty<p>
s, więc prawdopodobnie nie jest to mądry ruch tam.Chcesz semantyczny podział linii?
Następnie rozważ użycie
<br>
. W3Schools może sugerować, żeBR
to tylko do pisania wierszy (moje już wkrótce), ale możesz zmienić styl, aby zachowywał się jak element blokowy o szerokości 100%, który popchnie twoją treść do następnego wiersza. Jeśli „br” sugeruje przerwę, to wydaje mi się bardziej odpowiednie niż używaniehr
lub 100%div
i sprawia, że HTML jest bardziej czytelny.Wstaw miejsce, w
<br>
którym potrzebujesz podziałów linii, i stylizuj go w ten sposób.Możesz wyłączyć za
<br>
pomocą zapytań o media , ustawiającdisplay:
nablock
lubnone
odpowiednio (podałem przykład tego, ale zostawiłem komentarz).W
order:
razie potrzeby możesz użyć, aby ustawić kolejność.I możesz umieścić tyle, ile chcesz, z różnymi klasami lub nazwami :-)
Nie musisz ograniczać się do tego, co mówi W3Schools:
źródło
<br class="2col">
co drugi element,<br class="3col">
co trzeci. Następnie zastosuj klasęcols-2
do kontenera i utwórz css, aby włączyć tylko odpowiednie łamanie wierszy dla tej liczby kolumn. na przykład.br { display: none; } .cols-2 br.2col { display: block; }
br
nie jest przeznaczone do elementów łamania linii , tylko do tekstu : developer.mozilla.org/en-US/docs/Web/HTML/Element/br ... stackoverflow.com/questions/3937515/break-*
pokazany w zaakceptowanej odpowiedzi), ale niestety nie dotarł on już do różnych przeglądarek , więc drugim najlepszym rozwiązaniem jest użycie elementu, który natywnie wypełnia szerokość rodzica i wypycha kolejne rodzeństwo do rzędu siebie, co znowu jest podane w zaakceptowanej odpowiedzi. Zatem użycie dowolnego elementu innego niż blok, takiego jak jeden, byłoby gorsze, semantycznie, jakbr
.Myślę, że tradycyjny sposób jest elastyczny i dość łatwy do zrozumienia:
Narzut
Utwórz plik grid.css :
Stworzyłem przykład (jsfiddle)
Spróbuj zmienić rozmiar okna poniżej 400 pikseli, jest responsywny !!
źródło
Innym możliwym rozwiązaniem, które nie wymaga dodawania żadnych dodatkowych znaczników, jest dodanie dynamicznego marginesu w celu oddzielenia elementów.
W przypadku tego przykładu można to zrobić
calc()
, dodającmargin-left
i dodającmargin-right
element 3n + 2 (2, 5, 8)Przykład fragmentu
źródło
calc
jak opisano w tej odpowiedzi.margin-right: 1px
przedmiot i sprawi, że następny element zacznie od nowego wiersza.W przypadku przyszłych pytań można to również zrobić za pomocą
float
właściwości i usuwając ją z każdego 3 elementów.Oto przykład, który stworzyłem.
źródło
display: flex;
, a niedisplay: inline-block;
.cell:nth-child(3n + 1)
zamiast tego napisaćPróbowałem tutaj kilku odpowiedzi i żadna z nich nie zadziałała. Jak na ironię, to, co zadziałało, było najprostszą alternatywą dla
<br/>
jednej z możliwych:<div style="flex-basis: 100%;"></div>
lub możesz także:
<div style="width: 100%;"></div>
Umieść to w dowolnym miejscu nowej linii. Wydaje się, że działa nawet z sąsiednimi
<span>
, ale używam go z sąsiednimi<div>
.źródło
flex-basis
.możesz spróbować zawinąć elementy w element dom, taki jak tutaj. z tym nie musisz wiedzieć dużo css tylko posiadanie dobrej struktury rozwiąże problem.
źródło
display: block
i uczynić te nowe Flexboxy div 2 poziomu. Działa to dla wierszy. W trybie kolumnowym zamień div na rozpiętości.