Latar Belakang
The Flexbox Layout
(Flexible Box) modul (Rekomendasi W3C Calon per Oktober 2017) tujuan untuk memberikan cara yang lebih efisien untuk lay out, menyelaraskan dan mendistribusikan ruang di antara item dalam sebuah wadah, bahkan ketika ukuran mereka tidak diketahui dan / atau dinamis (dengan demikian kata "flex").
Ide utama di balik tata letak fleksibel adalah memberi wadah kemampuan untuk mengubah lebar / tinggi item (dan urutan) untuk mengisi ruang yang tersedia (sebagian besar untuk mengakomodasi semua jenis perangkat tampilan dan ukuran layar). Wadah fleksibel memperluas item untuk mengisi ruang kosong yang tersedia atau menyusutkannya untuk mencegah meluap.
Yang terpenting, tata letak flexbox adalah arah-agnostik sebagai lawan dari tata letak biasa (blok yang berbasis vertikal dan sebaris yang berbasis horizontal). Meskipun berfungsi dengan baik untuk halaman, mereka kekurangan fleksibilitas (tidak ada permainan kata-kata yang dimaksudkan) untuk mendukung aplikasi yang besar atau kompleks (terutama dalam hal perubahan orientasi, pengubahan ukuran, peregangan, penyusutan, dll.).
Catatan: Tata letak Flexbox paling sesuai untuk komponen aplikasi, dan tata letak skala kecil, sedangkan tata letak Kisi ditujukan untuk tata letak skala besar.
Dasar & Terminologi
Karena flexbox adalah keseluruhan modul dan bukan satu properti, ini melibatkan banyak hal termasuk seluruh rangkaian propertinya. Beberapa dari mereka dimaksudkan untuk diatur pada wadah (elemen induk, dikenal sebagai “wadah fleksibel”) sedangkan yang lainnya dimaksudkan untuk diatur pada anak-anak (dikatakan “item fleksibel”).
Jika tata letak "biasa" didasarkan pada arah blok dan aliran sebaris, tata letak fleksibel didasarkan pada "arah aliran-fleksibel". Silakan lihat gambar ini dari spesifikasinya, menjelaskan ide utama di balik tata letak fleksibel.
Item akan disusun mengikuti main axis
(dari main-start
ke main-end
) atau sumbu silang (dari cross-start
ke cross-end
).
- main axis - Sumbu utama wadah fleksibel adalah sumbu utama tempat item-item fleksibel diletakkan. Hati-hati, ini tidak selalu horizontal; itu tergantung pada
flex-direction
properti (lihat di bawah). - main-mulai | main-end - Item flex ditempatkan di dalam container mulai dari main-start dan pergi ke main-end.
- ukuran utama - Lebar atau tinggi item fleksibel, mana pun yang ada dalam dimensi utama, adalah ukuran utama item tersebut. Properti ukuran utama item fleksibel adalah properti 'width' atau 'height', mana saja yang ada dalam dimensi utama.
- sumbu silang - Sumbu tegak lurus dengan sumbu utama disebut sumbu silang. Arahnya tergantung dari arah sumbu utama.
- lintas-mulai | cross-end - Garis lentur diisi dengan item dan ditempatkan ke dalam wadah mulai dari sisi cross-start wadah flex dan menuju ke sisi cross-end.
- ukuran silang - Lebar atau tinggi item fleksibel, mana pun yang berada dalam dimensi silang, adalah ukuran silang item. Properti ukuran silang adalah salah satu dari 'lebar' atau 'tinggi' yang ada dalam dimensi silang.
Dapatkan posternya!
Sering mereferensikan panduan ini? Sematkan salinan di dinding kantor.
Beli PosterProperti untuk Induk
(wadah fleksibel)
layar
Ini mendefinisikan wadah fleksibel; sebaris atau blok tergantung pada nilai yang diberikan. Ini memungkinkan konteks fleksibel untuk semua turunan langsungnya.
.container ( display: flex; /* or inline-flex */ )
Perhatikan bahwa kolom CSS tidak berpengaruh pada penampung fleksibel.
arah fleksibel
Ini menetapkan sumbu utama, sehingga menentukan arah item fleksibel ditempatkan di wadah fleksibel. Flexbox adalah (selain dari pembungkus opsional) konsep tata letak satu arah. Pikirkan item fleksibel sebagai tata letak utama baik dalam baris horizontal atau kolom vertikal.
.container ( flex-direction: row | row-reverse | column | column-reverse; )
row
(default): kiri ke kanan dalamltr
; kanan ke kirirtl
row-reverse
: kanan ke kiriltr
; dari kiri ke kananrtl
column
: samarow
tapi dari atas ke bawahcolumn-reverse
: sama sepertirow-reverse
tetapi dari bawah ke atas
flex-wrap
Secara default, semua item flex akan mencoba untuk masuk ke dalam satu baris. Anda dapat mengubahnya dan mengizinkan item untuk dibungkus sesuai kebutuhan dengan properti ini.
.container ( flex-wrap: nowrap | wrap | wrap-reverse; )
nowrap
(default): semua item flex akan berada dalam satu bariswrap
: item flex akan dibungkus menjadi beberapa baris, dari atas ke bawah.wrap-reverse
: item flex akan dibungkus menjadi beberapa baris dari bawah ke atas.
Ada beberapa demo visual di flex-wrap
sini.
aliran fleksibel
Ini adalah singkatan dari the flex-direction
and flex-wrap
properties, yang bersama-sama mendefinisikan sumbu utama dan sumbu silang wadah fleksibel. Nilai defaultnya adalah row nowrap
.
.container ( flex-flow: column wrap; )
membenarkan-konten
Ini mendefinisikan perataan di sepanjang sumbu utama. Ini membantu mendistribusikan sisa ruang kosong ekstra jika semua item fleksibel dalam satu baris tidak fleksibel, atau fleksibel tetapi telah mencapai ukuran maksimumnya. Ini juga memberikan beberapa kontrol atas penyelarasan item saat mereka meluap dari garis.
.container ( justify-content: flex-start | flex-end | center | space-between | space-around | space-evenly | start | end | left | right… + safe | unsafe; )
flex-start
(default): item dikemas menuju awal arah-fleksibel.flex-end
: barang dikemas menjelang akhir arah fleksibel.start
: item dikemas ke awalwriting-mode
arah.end
: item dikemas menjelang akhirwriting-mode
petunjuk.left
: item dikemas ke arah tepi kiri wadah, kecuali itu tidak masuk akal denganflex-direction
, maka berperilaku sepertistart
.right
: item dikemas ke tepi kanan wadah, kecuali itu tidak masuk akal denganflex-direction
, maka berperilaku sepertiend
.center
: item dipusatkan di sepanjang garisspace-between
: item didistribusikan secara merata di baris; item pertama di baris awal, item terakhir di baris akhirspace-around
: item didistribusikan secara merata di baris dengan ruang yang sama di sekitarnya. Perhatikan bahwa spasi secara visual tidak sama, karena semua item memiliki ruang yang sama di kedua sisi. Item pertama akan memiliki satu unit ruang di tepi wadah, tetapi dua unit ruang di antara item berikutnya karena item berikutnya memiliki spasi tersendiri yang berlaku.space-evenly
: item didistribusikan sehingga jarak antara dua item (dan spasi di tepinya) sama.
Perhatikan bahwa dukungan browser untuk nilai-nilai ini memiliki perbedaan. Misalnya, space-between
tidak pernah mendapat dukungan dari beberapa versi Edge, dan start / end / kiri / kanan belum ada di Chrome. MDN memiliki grafik rinci. Nilai-nilai yang paling aman adalah flex-start
, flex-end
, dan center
.
Ada juga dua kata kunci tambahan yang dapat Anda pasangkan dengan nilai berikut: safe
dan unsafe
. Menggunakan safe
memastikan bahwa bagaimanapun Anda melakukan jenis pemosisian ini, Anda tidak dapat mendorong elemen sedemikian rupa sehingga merender di luar layar (misalnya di bagian atas) sedemikian rupa sehingga konten tidak dapat digulir juga (disebut "kehilangan data") .
menyelaraskan-item
Ini mendefinisikan perilaku default untuk bagaimana item fleksibel diletakkan di sepanjang sumbu silang pada baris saat ini. Anggap saja sebagai justify-content
versi untuk sumbu melintang (tegak lurus dengan sumbu utama).
.container ( align-items: stretch | flex-start | flex-end | center | baseline | first baseline | last baseline | start | end | self-start | self-end +… safe | unsafe; )
stretch
(default): regangkan untuk mengisi wadah (tetap menghormati min-width / max-width)flex-start
/start
/self-start
: item ditempatkan di awal sumbu silang. Perbedaan antara keduanya tidak kentara, dan tentang menghormatiflex-direction
aturan atauwriting-mode
aturan.flex-end
/end
/self-end
: item ditempatkan di ujung sumbu silang. Perbedaannya lagi-lagi tidak kentara dan tentang menghormatiflex-direction
aturan vs.writing-mode
aturan.center
: item dipusatkan di sumbu silangbaseline
: item disejajarkan seperti garis dasarnya
Kata kunci safe
dan unsafe
pengubah dapat digunakan bersama dengan semua kata kunci lainnya (meskipun perhatikan dukungan browser), dan membantu Anda mencegah penyejajaran elemen sehingga konten menjadi tidak dapat diakses.
menyelaraskan konten
Ini meratakan garis wadah fleksibel di dalam ketika ada ruang ekstra di sumbu silang, mirip dengan bagaimana justify-content
meratakan item individu dalam sumbu utama.
Catatan: Properti ini hanya berlaku pada penampung fleksibel multi-baris, flex-flow
yang disetel ke wrap
atau wrap-reverse
). Penampung fleksibel satu baris (yaitu di mana flex-flow
disetel ke nilai defaultnya, no-wrap
) tidak akan mencerminkan align-content
.
.container ( align-content: flex-start | flex-end | center | space-between | space-around | space-evenly | stretch | start | end | baseline | first baseline | last baseline +… safe | unsafe; )
normal
(default): item dikemas dalam posisi defaultnya seolah-olah tidak ada nilai yang ditetapkan.flex-start
/start
: item dikemas ke awal wadah. The (lebih didukung)flex-start
menghormatiflex-direction
sementarastart
menghormatiwriting-mode
arah.flex-end
/end
: barang yang dikemas sampai ujung wadah. (Lebih banyak dukungan)flex-end
menghormatiflex-direction
sementara ujung menghormatiwriting-mode
arah.center
: item yang dipusatkan di wadahspace-between
: item didistribusikan secara merata; baris pertama di awal wadah sedangkan yang terakhir ada di akhirspace-around
: item didistribusikan secara merata dengan ruang yang sama di sekitar setiap barisspace-evenly
: item didistribusikan secara merata dengan ruang yang sama di sekitarnyastretch
: garis membentang untuk mengambil ruang yang tersisa
Kata kunci safe
dan unsafe
pengubah dapat digunakan bersama dengan semua kata kunci lainnya (meskipun perhatikan dukungan browser), dan membantu Anda mencegah penyejajaran elemen sehingga konten menjadi tidak dapat diakses.
Properti untuk Anak-anak
(item fleksibel)
memesan
Secara default, item flex diatur dalam urutan sumber. Namun, order
properti mengontrol urutan kemunculannya dalam wadah fleksibel.
.item ( order: 5; /* default is 0 */ )
flex-grow
This defines the ability for a flex item to grow if necessary. It accepts a unitless value that serves as a proportion. It dictates what amount of the available space inside the flex container the item should take up.
If all items have flex-grow
set to 1, the remaining space in the container will be distributed equally to all children. If one of the children has a value of 2, the remaining space would take up twice as much space as the others (or it will try to, at least).
.item ( flex-grow: 4; /* default 0 */ )
Negative numbers are invalid.
flex-shrink
This defines the ability for a flex item to shrink if necessary.
.item ( flex-shrink: 3; /* default 1 */ )
Negative numbers are invalid.
flex-basis
This defines the default size of an element before the remaining space is distributed. It can be a length (e.g. 20%, 5rem, etc.) or a keyword. The auto
keyword means “look at my width or height property” (which was temporarily done by the main-size
keyword until deprecated). The content
keyword means “size it based on the item’s content” - this keyword isn’t well supported yet, so it’s hard to test and harder to know what its brethren max-content
, min-content
, and fit-content
do.
.item ( flex-basis: | auto; /* default auto */ )
If set to 0
, the extra space around content isn’t factored in. If set to auto
, the extra space is distributed based on its flex-grow
value. See this graphic.
flex
This is the shorthand for flex-grow,
flex-shrink
and flex-basis
combined. The second and third parameters (flex-shrink
and flex-basis
) are optional. The default is 0 1 auto
, but if you set it with a single number value, it’s like 1 0
.
.item ( flex: none | ( ? || ) )
It is recommended that you use this shorthand property rather than set the individual properties. The shorthand sets the other values intelligently.
align-self
This allows the default alignment (or the one specified by align-items
) to be overridden for individual flex items.
Please see the align-items
explanation to understand the available values.
.item ( align-self: auto | flex-start | flex-end | center | baseline | stretch; )
Note that float
, clear
and vertical-align
have no effect on a flex item.
Examples
Let’s start with a very very simple example, solving an almost daily problem: perfect centering. It couldn’t be any simpler if you use flexbox.
.parent ( display: flex; height: 300px; /* Or whatever */ ) .child ( width: 100px; /* Or whatever */ height: 100px; /* Or whatever */ margin: auto; /* Magic! */ )
This relies on the fact a margin set to auto
in a flex container absorb extra space. So setting a vertical margin of auto
will make the item perfectly centered in both axes.
Now let’s use some more properties. Consider a list of 6 items, all with fixed dimensions, but can be auto-sized. We want them to be evenly distributed on the horizontal axis so that when we resize the browser, everything scales nicely, and without media queries.
.flex-container ( /* We first create a flex layout context */ display: flex; /* Then we define the flow direction and if we allow the items to wrap * Remember this is the same as: * flex-direction: row; * flex-wrap: wrap; */ flex-flow: row wrap; /* Then we define how is distributed the remaining space */ justify-content: space-around; )
Done. Everything else is just some styling concern. Below is a pen featuring this example. Be sure to go to CodePen and try resizing your windows to see what happens.
Let’s try something else. Imagine we have a right-aligned navigation element on the very top of our website, but we want it to be centered on medium-sized screens and single-columned on small devices. Easy enough.
/* Large */ .navigation ( display: flex; flex-flow: row wrap; /* This aligns items to the end line on main-axis */ justify-content: flex-end; ) /* Medium screens */ @media all and (max-width: 800px) ( .navigation ( /* When on medium sized screens, we center it by evenly distributing empty space around items */ justify-content: space-around; ) ) /* Small screens */ @media all and (max-width: 500px) ( .navigation ( /* On small screens, we are no longer using row direction but column */ flex-direction: column; ) )
Let’s try something even better by playing with flex items flexibility! What about a mobile-first 3-columns layout with full-width header and footer. And independent from source order.
.wrapper ( display: flex; flex-flow: row wrap; ) /* We tell all items to be 100% width, via flex-basis */ .wrapper> * ( flex: 1 100%; ) /* We rely on source order for mobile-first approach * in this case: * 1. header * 2. article * 3. aside 1 * 4. aside 2 * 5. footer */ /* Medium screens */ @media all and (min-width: 600px) ( /* We tell both sidebars to share a row */ .aside ( flex: 1 auto; ) ) /* Large screens */ @media all and (min-width: 800px) ( /* We invert order of first sidebar and main * And tell the main element to take twice as much width as the other two sidebars */ .main ( flex: 2 0px; ) .aside-1 ( order: 1; ) .main ( order: 2; ) .aside-2 ( order: 3; ) .footer ( order: 4; ) )
Prefixing Flexbox
Flexbox requires some vendor prefixing to support the most browsers possible. It doesn’t just include prepending properties with the vendor prefix, but there are actually entirely different property and value names. This is because the Flexbox spec has changed over time, creating an “old”, “tweener”, and “new” versions.
Perhaps the best way to handle this is to write in the new (and final) syntax and run your CSS through Autoprefixer, which handles the fallbacks very well.
Alternatively, here’s a Sass @mixin
to help with some of the prefixing, which also gives you an idea of what kind of things need to be done:
@mixin flexbox() ( display: -webkit-box; display: -moz-box; display: -ms-flexbox; display: -webkit-flex; display: flex; ) @mixin flex($values) ( -webkit-box-flex: $values; -moz-box-flex: $values; -webkit-flex: $values; -ms-flex: $values; flex: $values; ) @mixin order($val) ( -webkit-box-ordinal-group: $val; -moz-box-ordinal-group: $val; -ms-flex-order: $val; -webkit-order: $val; order: $val; ) .wrapper ( @include flexbox(); ) .item ( @include flex(1 200px); @include order(2); )
Related Properties
- A Complete Guide to Grid
- Almanac entries on Grid properties, like grid-row / grid-column
Other Resources
- Flexbox in the CSS specifications
- Flexbox at MDN
- Flexbox at Opera
- Diving into Flexbox by Bocoup
- Mixing syntaxes for best browser support on CSS-Tricks
- Flexbox by Raphael Goetter (FR)
- Flexplorer by Bennett Feely
Bugs
Flexbox is certainly not without its bugs. The best collection of them I’ve seen is Philip Walton and Greg Whitworth’s Flexbugs. It’s an open-source place to track all of them, so I think it’s best to just link to that.
Dukungan Browser
Dipecah oleh "versi" dari flexbox:
- (baru) berarti sintaks terbaru dari spesifikasi (misalnya
display: flex;
) - (tweener) berarti sintaks tidak resmi yang aneh dari tahun 2011 (misalnya
display: flexbox;
) - (lama) berarti sintaks lama dari 2009 (misalnya
display: box;
)
Chrome | Safari | Firefox | Opera | YAITU | Tepi | Android | iOS |
---|---|---|---|---|---|---|---|
20- (lama) 21+ (baru) | 3.1+ (lama) 6.1+ (baru) | 2-21 (lama) 22+ (baru) | 12.1+ (baru) | 10 (tweener) 11+ (baru) | 17+ (baru) | 2.1+ (lama) 4.4+ (baru) | 3.2+ (lama) 7.1+ (baru) |
Browser Blackberry 10+ mendukung sintaks baru.