Flexbox を使ってみよう === # 第21回 WordPress 勉強会@松戸 これは [第21回 WordPress 勉強会@松戸](https://wpmatsudo.doorkeeper.jp/events/39167) で使用した資料です。 ## Flexboxとは Flexible Box Layout Module CSS3のレイアウトモジュールで、今までより少ないコードでより柔軟なレイアウトを表現できる。 ## ブラウザ対応状況 ![](https://i.imgur.com/Vg0nCKe.png) > 参考) > http://caniuse.com/#search=Flexbox ## 使ってみよう ### 手順① index.htmlを用意する [index.html] ```html:index.html <!DOCTYPE html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>WP勉強会@松戸</title> <meta charset="utf-8"> <meta name="description" content=""> <meta name="author" content=""> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="http://yui.yahooapis.com/3.18.1/build/cssreset/cssreset-min.css"> <link rel="stylesheet" href="style.css"> </head> <body> <nav> <ul class="main-nav"> <li><a href="#" class="title">タイトル</a></li> <li><a href="#">メニュー1</a></li> <li><a href="#">メニュー2</a></li> <li><a href="#">メニュー3</a></li> <li><a href="#">メニュー4</a></li> </ul> </nav> </body> </html> ``` <style> ul { list-style:none; } ul,li { mrgin: 0; padding: 0; } </style> <nav> <ul class="main-nav sample-1"> <li><a href="#" class="title">タイトル</a></li> <li><a href="#">メニュー1</a></li> <li><a href="#">メニュー2</a></li> <li><a href="#">メニュー3</a></li> </ul> </nav> ### 手順② 解りやすいように色をつける [style.css] <pre> .main-nav a { margin: 10px; padding: 16px; border-radius: 5px; background: green; color: #fff; display: block; text-decoration: none; } .main-nav .title { background: blue; } </pre> <style> .main-nav.color a { margin: 10px; padding: 16px; border-radius: 5px; background: green; color: #fff; display: block; text-decoration: none; } .main-nav.color .title { background: blue; } </style> <nav> <ul class="main-nav color"> <li><a href="#" class="title">タイトル</a></li> <li><a href="#">メニュー1</a></li> <li><a href="#">メニュー2</a></li> <li><a href="#">メニュー3</a></li> </ul> </nav> ### 手順③ Flexboxを適用する [style.css] <pre> .main-nav { display: flex; } </pre> <style> .main-nav.flex { display: flex; } </style> <nav> <ul class="main-nav color flex"> <li><a href="#" class="title">タイトル</a></li> <li><a href="#">メニュー1</a></li> <li><a href="#">メニュー2</a></li> <li><a href="#">メニュー3</a></li> </ul> </nav> ### 手順④ いろいろ変えてみる [style.css] <pre> //等間隔に横並び .main-nav { justify-content: space-between; } </pre> <style> .main-nav.sample-4-1 { justify-content: space-between; } </style> <nav> <ul class="main-nav color flex sample-4-1"> <li><a href="#" class="title">タイトル</a></li> <li><a href="#">メニュー1</a></li> <li><a href="#">メニュー2</a></li> <li><a href="#">メニュー3</a></li> </ul> </nav> <pre> //中央寄せ .main-nav { justify-content: center; } </pre> <style> .main-nav.sample-4-2 { display: flex; justify-content: center; } </style> <nav> <ul class="main-nav color flex sample-4-2"> <li><a href="#" class="title">タイトル</a></li> <li><a href="#">メニュー1</a></li> <li><a href="#">メニュー2</a></li> <li><a href="#">メニュー3</a></li> </ul> </nav> <pre> //右寄せ .main-nav { justify-content: flex-end; } </pre> <style> .main-nav.sample-4-3 { justify-content: flex-end; } </style> <nav> <ul class="main-nav color flex sample-4-3"> <li><a href="#" class="title">タイトル</a></li> <li><a href="#">メニュー1</a></li> <li><a href="#">メニュー2</a></li> <li><a href="#">メニュー3</a></li> </ul> </nav> <pre> //タイトルだけ左端に .main-nav li:first-child { margin-right: auto; } </pre> <style> .main-nav.sample-4-4 li:first-child { margin-right: auto; } </style> <nav> <ul class="main-nav color flex sample-4-4"> <li><a href="#" class="title">タイトル</a></li> <li><a href="#">メニュー1</a></li> <li><a href="#">メニュー2</a></li> <li><a href="#">メニュー3</a></li> </ul> </nav> <pre> //垂直方向をセンタリング .main-nav { align-items: center; } //垂直方向を下揃え .main-nav { align-items: flex-end; } </pre> 指定前 <nav> <ul class="main-nav color flex sample-4-5"> <li><a href="#" class="title">タイトル</a></li> <li><a href="#">メニュー1</a></li> <li><a href="#">2行の<br/>メニュー2</a></li> <li><a href="#">メニュー3</a></li> </ul> </nav> - align-items: center; <style> .main-nav.sample-4-5-1 { display: flex; align-items: center; } </style> <nav> <ul class="main-nav color flex sample-4-5-1"> <li><a href="#" class="title">タイトル</a></li> <li><a href="#">メニュー1</a></li> <li><a href="#">2行の<br/>メニュー2</a></li> <li><a href="#">メニュー3</a></li> </ul> </nav> - align-items: flex-end; <style> .main-nav.sample-4-5-2 { display: flex; align-items: flex-end; } </style> <nav> <ul class="main-nav color flex sample-4-5-2"> <li><a href="#" class="title">タイトル</a></li> <li><a href="#">メニュー1</a></li> <li><a href="#">2行の<br/>メニュー2</a></li> <li><a href="#">メニュー3</a></li> </ul> </nav> <pre> //横幅を合わせる .main-nav li{ flex-basis: <font style="color:red">150px</font>; //横幅(width)を指定 } //伸びる倍率(均等幅で余白を埋める) .main-nav li{ flex-grow: 1; } </pre> **指定前** <nav> <ul class="main-nav color flex sample-4-6"> <li><a href="#" class="title">タイトル</a></li> <li><a href="#">メニュー1</a></li> <li><a href="#">menu2</a></li> <li><a href="#">メニュー3</a></li> </ul> </nav> **指定後** - flex-basis: 150px; <style> .main-nav.sample-4-6-1 li{ flex-basis: 150px; } </style> <nav> <ul class="main-nav color flex sample-4-6-1"> <li><a href="#" class="title">タイトル</a></li> <li><a href="#">メニュー1</a></li> <li><a href="#">menu2</a></li> <li><a href="#">メニュー3</a></li> </ul> </nav> - flex-basis: 150px; - flex-grow: 1; <style> .main-nav.sample-4-6-2 li{ flex-basis: 150px; flex-grow: 1; } </style> <nav> <ul class="main-nav color flex sample-4-6-2"> <li><a href="#" class="title">タイトル</a></li> <li><a href="#">メニュー1</a></li> <li><a href="#">menu2</a></li> <li><a href="#">メニュー3</a></li> </ul> </nav> <pre> //最初を2倍に .main-nav li:first-child{ flex-grow: 2; } </pre> <style> .main-nav.sample-4-6-3{ flex-basis: 150px; flex-grow: 1; } .main-nav.sample-4-6-3 li:first-child{ flex-grow: 2; } </style> <nav> <ul class="main-nav color flex sample-4-6-3"> <li><a href="#" class="title">タイトル</a></li> <li><a href="#">メニュー1</a></li> <li><a href="#">menu2</a></li> <li><a href="#">メニュー3</a></li> </ul> </nav>