CSS3で一番の変化といえば、Flexboxですよね。
今までは、Floatなどを使ってレイアウトを変更させるのが一般的でした。
しかし、Floatとには様々な問題があり、扱いが難しいことが欠点です。
CSS3から登場したFlexboxを使えば簡単に要素を横並びにできます。
おそらく、要素の並び方を変更するときはFlexboxを使うのが主流になると思われます。
なので、今のうちにFlexboxを習得しましょう。
今回は、 Flexboxを使って制作したサンプルサイトを例にして説明します。
サンプルサイトを見てFlexboxを理解しよう
まずは、今回紹介するサイトのコードを記載します。
HTML
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>FlexBoxサンプルサイト</title>
    <link rel="stylesheet" href="css/bases.css">
    <link rel="stylesheet" href="css/reset.css">
    <link rel="stylesheet" href="css/main.css">
</head>
<body>
    <div class="container">
        <header class="header">
            <h1 class="logo">フレックスボックスサンプルサイト</h1>
            <div class="header-info">
                <p class="tel">TEL:000-000-000</p>
                <address class="address">住所:東京都〇〇区〇ー〇ー〇</address>
            </div>
        </header>
        <nav class="navi">
            <ul class="navi-ul">
                <li class="navi-li">
                    <a href="#">ナビ</a>
                </li>
                <li class="navi-li">
                    <a href="#">ナビ</a>
                </li>
                <li class="navi-li">
                    <a href="#">ナビ</a>
                </li>
                <li class="navi-li">
                    <a href="#">ナビ</a>
                </li>
                <li class="navi-li">
                    <a href="#">ナビ</a>
                </li>
                <li class="navi-li">
                    <a href="#">ナビ</a>
                </li>
            </ul>
        </nav>
        <div class="top-image">
            <img src="images/office.jpg" alt="メイン画像">
        </div>
        <main class="main">
            <div class="section-title">
                SECTION
            </div>
            <section class="section-image">
                <ul class="list-ul">
                    <li class="list-li">
                        <div class="list-imgae">
                            <img src="images/pc.jpg" alt="画像">
                        </div>
                        <div class="list-title">
                            <h3>見出し</h3>
                        </div>
                        <div class="list-desc">
                            <p>本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。</p>
                        </div>
                    </li>
                    <li class="list-li">
                        <div class="list-imgae">
                            <img src="images/pc.jpg" alt="画像">
                        </div>
                        <div class="list-title">
                            <h3>見出し</h3>
                        </div>
                        <div class="list-desc">
                            <p>本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。</p>
                        </div>
                    </li>
                    <li class="list-li">
                        <div class="list-imgae">
                            <img src="images/pc.jpg" alt="画像">
                        </div>
                        <div class="list-title">
                            <h3>見出し</h3>
                        </div>
                        <div class="list-desc">
                            <p>本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。</p>
                        </div>
                    </li>
                </ul>
            </section>
            <section class="section-table">
                <div class="section-title">
                    <h2>TABLE</h2>
                </div>
                    <table class="table">
                        <tbody><tr>
                            <th>会社名</th>
                            <td>株式会社FlexBoxサンプル</td>
                            </tr>
                            <tr>
                                <th>代表者名</th>
                                <td>〇〇〇〇</td>
                            </tr>
                            <tr>
                                <th>住所</th>
                                <td>東京都〇〇区〇ー〇ー〇</td>
                            </tr>
                            <tr>
                                <th>連絡先</th>
                                <td>000-000-000</td>
                            </tr>
                        </tbody></table>
                <div class="table-main">
                </div>
            </section>
            <section class="news">
                <h2 class="section_ttl">NEWS</h2>
                <dl class="news_list grid">
                    <dt>〇〇〇〇年〇〇月〇〇日</dt>
                    <dd>〇〇なニュースがありました。</dd>
                </dl>
                <dl class="news_list grid">
                    <dt>〇〇〇〇年〇〇月〇〇日</dt>
                    <dd>〇〇なニュースがありました。</dd>
                </dl>
                <dl class="news_list grid">
                    <dt>〇〇〇〇年〇〇月〇〇日</dt>
                    <dd>〇〇なニュースがありました。</dd>
                </dl>
                <dl class="news_list grid">
                    <dt>〇〇〇〇年〇〇月〇〇日</dt>
                    <dd>〇〇なニュースがありました。</dd>
                </dl>
                <p class="more"><a href="">もっと見る ></a></p>
            </section>
        </main>
        <footer class="footer">
            <div class="footer-box">
                <ul class="footer-ul">
                    <li class="footer-list">ナビ</li>
                    <li class="footer-list">ナビ</li>
                    <li class="footer-list">ナビ</li>
                    <li class="footer-list">ナビ</li>
                    <li class="footer-list">ナビ</li>
                    <li class="footer-list">ナビ</li>
                </ul>
                <p class="copy-right"><small>copy@</small></p>
            </div>
        </footer>
    </div>
</body>
</html>
CSSS
.container{
    margin-top: 20px;
}
.header{
    width: 960px;
    margin: 0 auto;
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 20px;
}
.logo{
    font-size: 26px;
}
.tel{
    padding-bottom: 5px;
}
.navi{
    width: 960px;
    margin: 0 auto;
}
.navi-ul{
    display: flex;
    justify-content: space-between;
}
.navi-li{
    width: 16rem;
    border-top: 1px solid #333;
    border-bottom: 1px solid #333;
    border-left: 1px solid #333;
    text-align: center;
}
.navi-li a{
    display: block;
    color: #333;
    padding: 10px 0;
    text-decoration: none;
    transition: 0.3s;
}
.navi-li a:hover{
    text-decoration: none;
    background: #333;
    color: #fff;
}
.navi-li:last-child{
    border-right: 1px solid #333;
}
.top-image{
    margin: 30px 0px;
}
.section-title{
    font-size: 26px;
    font-weight: bold;
    text-align: center;
    margin-bottom: 30px;
}
.main{
    width: 960px;
    margin: 0 auto;
}
.section-image{
    margin-bottom: 70px;
}
.list-ul{
    display: flex;
    justify-content: space-between;
}
.list-li{
    width: 300px;
}
.list-imgae img{
    width: 300px;
}
.list-title{
font-size: 20px;
font-weight: bold;
text-align: center;
margin: 10px 0;
}
.section-table{
    width: 780px;
    margin: 0px auto 60px;
}
.table {
    width: 780px;
    margin: 40px auto 60px;
}
.table th {
    width: 200px;
    background: #ccc;
    padding: 15px 20px;
    border: 1px solid #aaa;
}
.table td {
    padding-left: 20px;
    border: 1px solid #aaa;
}
.news {
    width: 780px;
    margin: 0 auto 60px;
}
.section_ttl {
    font-size: 26px;
    font-weight: bold;
    text-align: center;
    margin-bottom: 30px;
}
.news_list {
    border-bottom: 1px solid #ccc;
    padding-bottom: 14px;
    margin-bottom: 14px;
}
.news_list dt {
    margin-bottom: 10px;
}
.more {
    text-align: right;
}
.footer{
    background: #222;
    padding: 30px 0 10px;
}
.footer-box{
    width: 960px;
    margin: 0 auto;
}
.footer-ul {
    text-align: center;
}
.footer-list{
    color: #fff;
    display: inline-block;
    padding: 0 20px;
    border-right: 1px solid #fff;
    line-height: 1;
}
.footer-list:last-child {
    border-right: none;
}
.copy-right{
    color: #fff;
    text-align: center;
    margin-top: 30px;
}
今回、Flexboxを使用している部分は以下の2つです。
・header部分(サイトタイトルと会社情報の横並べ)
・グローバルナビの部分
・セクション部分(画像・本文の横並べ)
フッターナビの部分は「display: inline-block;」を使用しています。
上の2つの部分について詳しく説明します。
header部分

header部分は、サイトタイトル(ロゴ)とヘッダー情報を横並びにしています。
また、header部分の子要素が上下中央になるにように指定してます。
Flexboxは、要素の横並びだけでなく、上下中央を揃えることも可能です。
headerの中には、「logo」と「header-info」という子要素を作成します。
この2つの子要素を親要素の左端・右端に設置します。
両端に子要素を配置するために、親要素に以下のコードを記述しましょう、
.header{
    display: flex;
    justify-content: space-between;
}
このように記述することで、最初の子要素を親要素の左端・最後の子要素を親要素の右端に設置できます。
つまり、最初の子要素であるサイトタイトル(ロゴ)は左端に設置し、最後の子要素であるヘッダー情報は右端に設置されます。
また、「justify-content: space-between;」は最初と最後の子要素を両端に設置した後、残りの子要素がある場合は等間隔で配置されるのが特徴です。
子要素を横並びにできたら、Flexboxを使って上下中央を揃えましょう。
上下中央に揃えるために以下のコードを追記してください。
HTML
        <header class="header">
            <h1 class="logo">フレックスボックスサンプルサイト</h1>
            <div class="header-info">
                <p class="tel">TEL:000-000-000</p>
                <address class="address">住所:東京都〇〇区〇ー〇ー〇</address>
            </div>
        </header>
CSS
.header{
    width: 960px;
    margin: 0 auto;
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 20px;
}
.logo{
    font-size: 26px;
}
.tel{
    padding-bottom: 5px;
}
「align-items: center;」を追記することで、子要素の縦の間隔を揃えることが可能です。
グローバルナビの部分

グローバルナビもFlexboxを使って要素を横並びにしています。
ここでが「ulタグ」と「liタグ」使ってグローバルナビを作成しています。
なので、「ulタグ」に子要素を横並びにするスタイルを適用しましょう。
HTML
        <nav class="navi">
            <ul class="navi-ul">
                <li class="navi-li">
                    <a href="#">ナビ</a>
                </li>
                <li class="navi-li">
                    <a href="#">ナビ</a>
                </li>
                <li class="navi-li">
                    <a href="#">ナビ</a>
                </li>
                <li class="navi-li">
                    <a href="#">ナビ</a>
                </li>
                <li class="navi-li">
                    <a href="#">ナビ</a>
                </li>
                <li class="navi-li">
                    <a href="#">ナビ</a>
                </li>
            </ul>
        </nav>
CSS
.navi-ul{
    display: flex;
    justify-content: space-between;
}
.navi-li{
    width: 16rem;
    border-top: 1px solid #333;
    border-bottom: 1px solid #333;
    border-left: 1px solid #333;
    text-align: center;
}
このように記述すれば、子要素(リストタグ)が横並びになります。
ヘッダー部分では子要素が2つしかなかったので、「justify-content: space-between;」を使うと子要素が両端に設置されました。
しかし、グローバルナビの部分では子要素が2以上あるため、最初と最後の子要素は両端に設置され、残りの子要素は等間隔に配置されます。
セクション部分

セクション部分もFlexboxを使用しています。
まずは、実際のコードを見てみましょう。
HTML
            <div class="section-title">
                SECTION
            </div>
            <section class="section-image">
                <ul class="list-ul">
                    <li class="list-li">
                        <div class="list-imgae">
                            <img src="images/pc.jpg" alt="画像">
                        </div>
                        <div class="list-title">
                            <h3>見出し</h3>
                        </div>
                        <div class="list-desc">
                            <p>本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。</p>
                        </div>
                    </li>
                    <li class="list-li">
                        <div class="list-imgae">
                            <img src="images/pc.jpg" alt="画像">
                        </div>
                        <div class="list-title">
                            <h3>見出し</h3>
                        </div>
                        <div class="list-desc">
                            <p>本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。</p>
                        </div>
                    </li>
                    <li class="list-li">
                        <div class="list-imgae">
                            <img src="images/pc.jpg" alt="画像">
                        </div>
                        <div class="list-title">
                            <h3>見出し</h3>
                        </div>
                        <div class="list-desc">
                            <p>本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。本文が入ります。</p>
                        </div>
                    </li>
                </ul>
            </section>
CSS
.section-title{
    font-size: 26px;
    font-weight: bold;
    text-align: center;
    margin-bottom: 30px;
}
.section-image{
    margin-bottom: 70px;
}
.list-ul{
    display: flex;
    justify-content: space-between;
}
.list-li{
    width: 300px;
}
.list-imgae img{
    width: 300px;
}
.list-title{
      font-size: 20px;
      font-weight: bold;
      text-align: center;
      margin: 10px 0;
}
セクション部分も「justify-content: space-between;」を使って、要素を横並びにしています。
基本的な使い方は、ヘッダー部分・グローバルナビ部分と変わりません。
また、単純に横並びにしたいだけなら、「display: flex;」を適用するだけでOKです。
Flexboxのスタイルは、必ず親要素に適用してください。
子要素にFlexboxのスタイルを適用しても反映されないので注意しましょう。
まとめ
いかがでしたか?
Flexboxを使えば、簡単にレイアウトを変更できます。
ぜひ、試してくださいね。





									