Apakah ada cara untuk membuat garis terputus dalam beberapa saluran flexbox?
Misalnya untuk istirahat setelah setiap item ke-3 dalam CodePen ini .
.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>
Suka
.item:nth-child(3n){
/* line-break: after; */
}
Jawaban:
Solusi paling sederhana dan paling dapat diandalkan adalah memasukkan item fleksibel di tempat yang tepat. Jika mereka cukup lebar (
width: 100%
), mereka akan memaksa garis putus.Tampilkan cuplikan kode
Tapi itu jelek dan tidak semantik. Sebagai gantinya, kita bisa membuat elemen pseudo di dalam wadah fleksibel, dan menggunakannya
order
untuk memindahkannya ke tempat yang tepat.Tampilkan cuplikan kode
Tetapi ada batasan: wadah fleksibel hanya dapat memiliki
::before
dan::after
elemen pseudo. Itu berarti Anda hanya dapat memaksa 2 jeda baris.Untuk mengatasinya, Anda dapat membuat elemen pseudo di dalam item fleksibel alih-alih dalam wadah fleksibel. Dengan cara ini Anda tidak akan terbatas pada 2. Tetapi elemen-elemen semu itu tidak akan menjadi item fleksibel, sehingga mereka tidak akan dapat memaksa jeda baris.
Namun untungnya, CSS Display L3 telah diperkenalkan
display: contents
(saat ini hanya didukung oleh Firefox 37):Jadi Anda bisa menerapkannya
display: contents
pada anak-anak wadah fleksibel, dan bungkus masing-masing isi bungkus tambahan. Kemudian, item fleksibel adalah pembungkus tambahan dan elemen pseudo anak-anak.Tampilkan cuplikan kode
Atau, menurut Fragmenting Flex Layout dan CSS Fragmentation , Flexbox memungkinkan pemutusan paksa dengan menggunakan
break-before
,break-after
atau alias CSS 2.1 mereka:Tampilkan cuplikan kode
Pemutusan saluran secara paksa di flexbox belum didukung secara luas, tetapi bekerja pada Firefox.
sumber
break-after
solusinya, yang hanya membutuhkan modifikasi pemilih dalam stylesheet.display: block;
ke kelas.container
::before
dan::after
pseudo untuk membuat solusi nomor dua berfungsi di IE. YMMV!Dari perspektif saya itu lebih semantik untuk menggunakan
<hr>
elemen sebagai garis istirahat antara item fleksibel.Diuji di Chrome 66, Firefox 60 dan Safari 11.
sumber
gap: 10px;
jarak antar baris sebenarnya20px
. Untuk alamat, menentukan kesenjangan deretan setengah ukuran bahwa:gap: 5px 10px;
.border
harus di set kenone
, alih-alih0
border:0;
denganborder:none;
. Lihat: stackoverflow.com/questions/2922909/…@Oriol memiliki jawaban yang sangat bagus, sayangnya pada Oktober 2017, tidak
display:contents
jugapage-break-after
didukung secara luas, lebih baik mengatakan ini tentang Firefox yang mendukung ini tetapi bukan pemain lain, saya telah datang dengan "hack" berikut yang saya anggap lebih baik daripada sulit mengkode dalam istirahat setelah setiap elemen ke-3, karena itu akan membuatnya sangat sulit untuk membuat halaman mobile friendly.Seperti yang dikatakan itu adalah peretasan dan kelemahannya adalah Anda perlu menambahkan cukup banyak elemen tambahan untuk apa-apa, tetapi ia melakukan trik dan bekerja lintas peramban bahkan pada IE11 tanggal.
"Retasan" adalah dengan menambahkan elemen tambahan setelah setiap div, yang diatur ke
display:none
dan kemudian menggunakan cssnth-child
untuk memutuskan yang mana dari ini yang benar-benar harus dibuat terlihat memaksa rem garis seperti ini:sumber
.container>p
. Maka semua<p></p>
tag itu tidak perluclass
atribut. Tentu tidak penting . Hanya otak malas saya menemukan tweak kecil hemat-ruang untuk solusi pintar Anda. Tentu saja, itu juga bergantung pada pengguna yang tidak memiliki<p>
tag lain sebagai anak langsung dari.container
div. Secara teknis Anda bisa melakukan hal yang sama dengan semua lainnya<div>
anak-anak, tapi kau banyak lebih mungkin untuk memiliki lain<div>
s dalam.container
dari Anda<p>
s, jadi mungkin bukan langkah yang cerdas di sana.Anda ingin linebreak semantik?
Kemudian pertimbangkan untuk menggunakan
<br>
. W3Schools mungkin menyarankan AndaBR
hanya untuk menulis puisi (punyaku akan segera datang) tetapi Anda dapat mengubah gaya sehingga berperilaku sebagai elemen blok 100% lebar yang akan mendorong konten Anda ke baris berikutnya. Jika 'br' menyarankan istirahat maka tampaknya lebih tepat bagi saya daripada menggunakanhr
atau 100%div
dan membuat html lebih mudah dibaca.Masukkan di
<br>
mana Anda perlu linebreak dan beri style seperti ini.Anda dapat menonaktifkan
<br>
dengan kueri media , dengan menyeteldisplay:
keblock
ataunone
sebagaimana mestinya (saya telah menyertakan contoh ini tetapi tidak berkomentar).Anda dapat menggunakan
order:
untuk mengatur pesanan jika diperlukan juga.Dan Anda dapat menempatkan sebanyak yang Anda inginkan, dengan kelas atau nama yang berbeda :-)
Tidak perlu membatasi diri dengan apa yang dikatakan W3Schools:
sumber
<br class="2col">
setelah setiap item kedua,<br class="3col">
setelah setiap ketiga. Kemudian menerapkan kelascols-2
ke wadah dan membuat css hanya memungkinkan linebreak yang sesuai untuk jumlah kolom itu. misalnya.br { display: none; } .cols-2 br.2col { display: block; }
br
bukan untuk elemen pemecah baris , itu untuk teks : developer.mozilla.org/en-US/docs/Web/HTML/Element/br ... stackoverflow.com/questions/3937515/…break-*
ditampilkan dalam jawaban yang diterima) meskipun sayangnya belum mencapai browser lintas belum , jadi yang terbaik kedua adalah menggunakan elemen yang secara native mengisi lebar induknya dan mendorong saudara kandung berikutnya ke barisan mereka sendiri, yang lagi-lagi diberikan dalam jawaban yang diterima. Jadi dengan menggunakan elemen lain selain blok seperti itu akan lebih buruk, semantik, sepertibr
.Saya pikir cara tradisional itu fleksibel dan cukup mudah dimengerti:
Markup
Buat file grid.css :
Saya telah membuat contoh (jsfiddle)
Cobalah untuk mengubah ukuran jendela di bawah 400px, responsif !!
sumber
Solusi lain yang mungkin tidak perlu menambahkan markup tambahan adalah menambahkan margin dinamis untuk memisahkan elemen.
Dalam kasus contoh, ini dapat dilakukan dengan bantuan
calc()
, cukup menambahkanmargin-left
danmargin-right
ke elemen 3n + 2 (2, 5, 8)Contoh cuplikan
sumber
calc
sebagaimana diuraikan dalam jawaban ini.margin-right: 1px
item, dan itu akan membuat item berikutnya dimulai pada baris baru.Untuk pertanyaan di masa mendatang, Anda juga dapat melakukannya dengan menggunakan
float
properti dan membersihkannya di setiap 3 elemen.Ini contoh yang saya buat.
sumber
display: flex;
, tidakdisplay: inline-block;
.cell:nth-child(3n + 1)
gantinyaSaya mencoba beberapa jawaban di sini, dan tidak ada yang berhasil. Ironisnya, apa yang berhasil adalah tentang alternatif paling sederhana yang
<br/>
bisa dilakukan seseorang:<div style="flex-basis: 100%;"></div>
atau Anda juga bisa melakukan:
<div style="width: 100%;"></div>
Tempatkan itu di mana pun Anda inginkan jalur baru. Tampaknya berfungsi bahkan dengan yang berdekatan
<span>
, tapi saya menggunakannya dengan yang berdekatan<div>
.sumber
flex-basis
.Anda bisa mencoba membungkus item dalam elemen dom seperti di sini. dengan ini Anda tidak perlu tahu banyak css hanya dengan memiliki struktur yang baik akan menyelesaikan masalah.
sumber
display: block
dan membuat kotak 2 divs flexbox baru. Ini berfungsi untuk baris. Ganti div dengan rentang saat menggunakan mode kolom.