作成日:2021/04/12 更新日:2022/09/21
#1 枠のことを「要素」と呼ぶ
枠も、文字も、画像もすべて要素
htmlを学ぶのにいろいろな書物がありますが、枠も、文字も、画像のこともたいてい「要素」と 一括りに呼ばれています。 ただし、要素といっても複数のことを指していますので、これまでCBC入門1ではdivやpなどの枠のことをそのまま「枠」とよんできました。しかし、これからわからない機能を調べる際にwebや書籍から情報を集めます。その際ほとんどが「要素」と呼ばれますので、 慣れておきましょう。
#2 要素のレイアウトにflexを使う
要素をレイアウトする際にflexを使う
CSS3から使われるdisplayプロパティの新しい値として「flex」があります。flexを指定した要素はflexコンテナと呼ばれる親要素となり、 この中の子要素のことをflexボックスと呼び自由にレイアウトができるようになります。主な特長としてはflexコンテナ内にある、縦につみ下がる要素を横並びにできるということです。
いまはすべてのflexプロパティをすべて覚えなくてもいいです。よく使う手法を覚えていきましょう。
ここでは代表的な使い方の例をあげています。
flexコンテナ(親要素)で使えるプロパティ
flex-direction | 子要素の配置する方向を指定するプロパティ。水平か垂直を指示 |
---|---|
flex-wrap | 子要素の行数を指定するプロパティ。一行、または複数行に並べるかを指示 |
flex-flow | flex-directionとflex-wrapをまとめて指定できるプロパティ。flex-flow:row nowrap; |
justify-content | flexコンテナー内に空きスペースがあった場合、水平方向のなかで要素をどの位置に配置するかを指定 |
align-items | flexコンテナー内に空きスペースがあった場合、垂直方向のなかで要素をどの位置に配置するかを指定 |
align-content | 子要素が複数行に渡った場合の垂直方向の揃えを指定 |
flexボックス(子要素)で使えるプロパティ
order | 子要素を任意の順で並べ替えられます。 |
---|---|
flex-grow | 親要素にスペースがある場合、子要素が他の子要素に対してどれくらい伸びるかを指定します。 |
flex-shrink | 子要素が他の子要素に対してどれくらい縮むかを指定 |
flex-basis | widthと同じように幅の値を指定できます。autoと指定した場合は子要素のコンテンツのサイズが適応されます。 |
flex | flex-grow、flex-shrink、flex-basis の3つのプロパティーを一行で指定できます。 |
align-self | 親要素に高さにスペースがある場合、子要素を垂直方向のどの位置に配置するかを指定 |
htmlファイルに直接cssを書き込んでブラウザで確認
テストフォルダにindex2.htmlを作成し、以下の内容を記入します。<style>タグの中にcssファイルに書いているように記述できます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>flexテスト</title>
</head>
<body>
<style>
--ここにcssを記入できます--
</style>
--ここにhtmlを記入します--
</body>
</html>
01 flex
<div class="container">
<div class="box">①</div>
<div class="box">②</div>
</div>
<div class="container">
<div class="box">①</div>
<div class="box2">②</div>
</div>
.container{
display:flex;
}
.box{
flex:1; /* flexのありなしを確認してみよう*/
}
.box2{
flex:3; /* 値を変えてみよう */
}
親要素.containerにdisplay:flex;を指定すると、
子要素はflexボックスとなり横並びになります。子要素にflexプロパティを指定して幅を調整できます。
子要素に特に指定なし
子要素にflex:1を指定した場合
子要素のflexの値を変える。 ②は①の3倍のサイズに
①
②
①
②
①
②
02 flex-direction
<div class="container">
<div>①</div>
<div>②</div>
<div>③</div>
<div>④</div>
<div>⑤</div>
</div>
.container{
display:flex;
flex-direction:column; /* 値を変えてみよう */
}
親要素に指定し並ばせる方向を指示できます。値の初期値はrow(横並び)column(たて並び)
row-reverse(横方向逆並び)
column-reverse(たて方向逆並び)があります。
flex-direction:column;
flex-direction:row;
flex-direction:row-reverse;
①
②
③
④
⑤
①
②
③
④
⑤
①
②
③
④
⑤
03 flex-wrap
<div class="container">
<div class="box">①</div>
<div class="box">②</div>
<div class="box">③</div>
<div class="box">④</div>
<div class="box">⑤</div>
</div>
.container{
display:flex;
flex-wrap:nowrap; /* 値を変えてみよう */
}
.box{
width:30%;
}
親要素に指定し、折返しするかどうかを指示します。初期値はnowrap(flexコンテナに収まる)
wrap(flexコンテナからあふれて複数行に)
wrap-reverse(wrapの逆順)
flex-wrap:nowrap;
flex-wrap:wrap;
①
②
③
④
⑤
①
②
③
④
⑤
04 align-content
<div class="container">
<div class="box">①</div>
<div class="box">②</div>
<div class="box">③</div>
<div class="box">④</div>
<div class="box">⑤</div>
<div class="box">⑥</div>
<div class="box">⑦</div>
<div class="box">⑧</div>
<div class="box">⑨</div>
</div>
.container{
display: flex;
flex-wrap: wrap;
align-content: center; /* 値を変えてみよう */
height:200px;
}
.box{
width:30%;
}
親要素にflex-wrap: wrap;(複数行になる)を指定したときの、子要素の配置のされ方を指定します。stretch(親要素の高さぴったりになる)
flex-start(親要素の頭から始まる)
flex-end(親要素の下付けになる)
center(親要素の天地のセンターになる)
必ず複数行のときに使います。下のように、align-content:center; でも1行だと意味がないです。。。
①
②
③
④
⑤
⑥
⑦
⑧
⑨
align-content:stretch;
align-content:flex-start;
align-content:flex-end;
align-content:center;
align-content:space-between;
align-content:space-around;
①
②
③
④
⑤
⑥
⑦
⑧
⑨
①
②
③
④
⑤
⑥
⑦
⑧
⑨
①
②
③
④
⑤
⑥
⑦
⑧
⑨
①
②
③
④
⑤
⑥
⑦
⑧
⑨
①
②
③
④
⑤
⑥
⑦
⑧
⑨
①
②
③
④
⑤
⑥
⑦
⑧
⑨
05 justify-content
<div class="container">
<div>①</div>
<div>②</div>
<div>③</div>
<div>④</div>
<div>⑤</div>
</div>
.container{
display:flex;
justify-content: flex-end; /* 値を変えてみよう */
}
flexボックスの位置や間隔を指定します。
justify-content:flex-start;
justify-content:flex-end;
justify-content:center;
justify-content:space-between;
justify-content:space-around;
justify-content:space-evenly;
①
②
③
④
⑤
①
②
③
④
⑤
①
②
③
④
⑤
①
②
③
④
⑤
①
②
③
④
⑤
①
②
③
④
⑤
06 align-items
<div class="container">
<div style="height:50px;">①</div>
<div>②</div>
<div style="height:70px;">③</div>
<div>④</div>
<div>⑤</div>
</div>
.container{
height:100px;
display:flex;
align-items: flex-end; /* 値を変えてみよう */
}
flexボックスのたて位置の配置方法を指定します。高さがバラバラな要素を作って配置してみました。stretch(高さの指定していない子要素は、高さが親要素に揃います)
flex-start(子要素は親要素の上にそろいます)
flex-end(子要素は親要素の下にそろいます)
center(子要素は親要素に対して天地のセンターに配置されます)
stretch(子要素は親要素の天地のセンターかつ、文字の下の位置にそろいます)
align-items:stretch;
align-items:flex-start;
align-items:flex-end;
align-items:center;
align-items:baseline;
①
②
③
④
⑤
①
②
③
④
⑤
①
②
③
④
⑤
①
②
③
④
⑤
①
②
③
④
⑤
07 要素を途中からちがう動きにする
margin-lfetのみ
<div class="container">
<div>①</div>
<div class="box1">②</div>
<div>③</div>
</div>
margin:auto;の場合
<div class="container">
<div>①</div>
<div class="box2">②</div>
<div>③</div>
</div>
.container{
display:flex;
}
.box1{
margin-left:auto; /* 右に移動する */
background-color:#c55;
}
.box2{
margin:auto; /* センターになる */
background-color:#c55;
}
marginのかけ方でいろんな配置ができます。
margin-lfetのみ
margin:auto;に設定した場合は中央に配置される
①
②
③
margin:auto;に設定した場合は中央に配置される
①
②
③
08 センタリング
<div class="container">
<div class="box">子要素</div>
</div>
.container{
height:160px;
display:flex;
justify-content: center;
align-items: center;
}
.box{
background-color:#eee;
}
親要素にセンタリングするプロパティを入れます。
子要素
align-items(縦の位置)、
どちらもcenterにすることで中央配置になります。
09 レイアウト
<div class="container">
<div class="header">
<div class="header-logo">logo</div>
<ul class="header-nav">
<li class="header-nav-a">menuA</li>
<li class="header-nav-a">menuB</li>
<li class="header-nav-a">menuC</li>
</ul>
</div>
<div class="content">
<div class="key">key</div>
<ul class="column">
<li class="col">col1</li>
<li class="col">col2</li>
<li class="col">col3</li>
<li class="col">col4</li>
<li class="col">col5</li>
<li class="col">col6</li>
</ul>
</div>
<div class="footer">footer</div>
</div>
.header{
display:flex;
}
.header-nav{
display:flex;
margin-left:auto;
}
.key{
height:100px;
display:flex;
justify-content: center;
align-items: center;
}
.column{
display: flex;
flex-wrap: wrap;
align-content: space-around;
}
.col{
width:30%;
}
※border、margin、paddingなどは省略しています。
logo
- menuA
- menuB
- menuC
key
- col1
- col2
- col3
- col4
- col5
- col6
cssは、flexプロパティを使った要素だけ記載してみました。たったこれだけの記述でも、Webサイトの大枠が組めるのがわかります。