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を使えば、簡単にレイアウトを変更できます。
ぜひ、試してくださいね。




