「[[.NET 開発基盤部会 Wiki>http://dotnetdevelopmentinfrastructure.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>CSS]]

*目次 [#jb35b81b]
#contents

*概要 [#u552b382]
CSSのレイアウトって難しいですね。

というか専門的にやったことなかったので、~
この際、色々と調べてみました。

*基本 [#qf286d8d]

**ボックスモデル [#h21dfa30]
-↓を参考にするとイメージし易い。~
https://www.google.co.jp/search?q=%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%83%A2%E3%83%87%E3%83%AB&tbm=isch

***コンテンツ(content) [#md3c875c]
-コンテンツ自体。
-コンテンツのwidth, height (= ボックスサイズ)は、~
下記のボーダー(border)と、余白(padding、margin)を含まない。

***ボーダー(border) [#oae6be9e]
-境界線の太さを指定する。
-borderプロパティにて指定。

***内容とボーダーの間の余白(padding) [#n833f4c0]
-境界線とコンテンツの間の余白を指定する。
-paddingプロパティにて指定。

***ボーダーと他のボックスとの間の余白(margin) [#b45c1c41]
-境界線と[[包含ブロック>#i75661bf]]の間の余白を指定する。
-marginプロパティにて指定。
-marginの重ね合わせ。
--上下の要素間でmarginの重ね合わせが起きる。
--親子の要素間でも、marginの重ね合わせが起きる。
---ただし、親要素にborderを指定すると重ね合わせは起きない。
---ただし、親要素にpaddingを指定すると重ね合わせは起きない。

**包含ブロック(コンテナブロック) [#i75661bf]
最も近い祖先の要素にあたる[[ブロックボックス>#qf00ce14]]を形成する要素の内容領域

***子要素の位置と大きさは、包含ブロックに依存 [#ub595026]
-位置:~
自要素の[[position プロパティ>#n74b5898]]に依存。

-自要素の大きさ:width、height などの プロパティに依存。
--子要素に width、height を指定してない場合、
--子要素に width、height に % 指定をしている場合

***子要素の位置の基準点 ≠ 包含ブロックのケース [#v06a70d5]
-基本的に、子要素の位置の基準点は ≒ 包含ブロックだが、
-自要素の[[position プロパティ>#n74b5898]]がstaticの場合は、~
子要素の位置の基準点は包含ブロック内の左上の要素になる。~
(通常フロー:左上から右下にスタックしていく)。

**[[ブロックボックス>#qf00ce14]]と[[インラインボックス>#k14a82a6]] [#v48d1bad]
包含ブロック内に配置されるボックスは、~
[[ブロックボックス>#qf00ce14]]と[[インラインボックス>#k14a82a6]]のふたつに分けられる。

***ブロックボックス [#qf00ce14]
-行を専有して、下にスタックされていく。
-width や height を指定できる。
-ブロックレベル要素はブロックボックスを生成する。

***インラインボックス [#k14a82a6]
-行内に、どんどん右・下にスタックされていく。
-以下を指定できない(img、input、textareaを除く)
--width や height (line-heightで代替)。
--margin、paddingの上下
-インラインレベル要素はインラインボックスを生成する。

***displayプロパティ [#i47b0ac9]
-ブロックレベル要素にdisplay: inline を指定すれば、[[インラインボックス>#k14a82a6]]として表示
-インラインレベル要素にdisplay: block を指定すれば、[[ブロックボックス>#qf00ce14]]として表示~
これにより、単なるリンクをボタンのように表示することができる。

**配置方法(position プロパティ) [#n74b5898]
-ボックスの配置位置を決めるためのボックスの配置方法を指定
-指定できる値には、static、relative、absolute、fixed がある。

***static(静的配置) [#p6e6f5be]
-既定値(position プロパティを指定しないとき)
-[[包含ブロック>#i75661bf]]の左上 or スタック対象ブロックの右下が起点となる。
-起点から、右下方向に順にスタックさせる通常フローと呼ばれるスタック方式

***relative(相対配置) [#f391cf07]
-[[包含ブロック>#i75661bf]]の左上 or スタック対象ブロックの右下が起点となる。
-起点をtop、left、right、bottom プロパティの相対位置指定で変更可能。
-変更後の起点から、右下方向に順にスタックさせる通常フローと呼ばれるスタック方式

***absolute(絶対配置) [#hf451572]
-[[包含ブロック>#i75661bf]]の左上から、
左上座標の絶対配置をtop、left、right、bottom プロパティで指定可
-この場合、起点となるのは、
--static 以外の値が指定されているボックスの左上になる。
--起点となるボックスがない場合、”HTMLの描画領域”が配置位置の基準点になる。
-これはスタックしないので、フローではない(Z軸で重なる)。

***fixed(固定配置) [#s5b916a0]
-absolute を指定したときと同じ様な仕組みで配置
-absolute と異なる点、
--配置位置の基準点が”画面表示領域”に固定される点。
--従って、スクロールしても、常に同じ位置に表示され固定される。
-同様に、これはスタックしないので、フローではない(Z軸で重なる)。

**スタック方向(floatプロパティ) [#xec6ed76]
-[[ブロックボックス>#qf00ce14]]を[[インラインボックス>#k14a82a6]]のように、左、または右に寄せて配置し、~
後続の[[ブロックボックス>#qf00ce14]]を 指定した方向と反対方向にスタックさせる配置方法

-[[ブロックボックス>#qf00ce14]]をフロートさせると、横いっぱいに広がらなくなる。~
このため、幅指定が必要になる。決まったサイズがなければ、width: autoを指定する。

***position プロパティ [#s01320b1]
-absolute(絶対配置)・fixed(固定配置) に設定されている場合、
--スタックしない。

-static(静的配置)・relative(相対配置)に設定されている場合、
--[[ブロックボックス>#qf00ce14]]がスタックされる方向を~
float: left; or float: right;によって、垂直方向から水平方向の左・右どちらかに変更する。
--これにより、[[ブロックボックス>#qf00ce14]]を右から左 or 左から右にスタックさせるフローを実装が可能になる。

***float プロパティのフロート解除 [#u70de0cf]
-子[[ブロックボックス>#qf00ce14]]がfloatプロパティで浮いて、親[[ブロックボックス>#qf00ce14]]が高さを認識できなくなる。
-これにより、高さによって決まる親[[ブロックボックス>#qf00ce14]]の描写領域が表示されなくなる。
-以下の方法でfloatプロパティのフロートを解除することでこの問題にも対応できる。

-解除方法

--clear プロパティ~
フロートしている子[[ブロックボックス>#qf00ce14]]の後続の[[ブロックボックス>#qf00ce14]]に指定する。~
子[[ブロックボックス>#qf00ce14]]の後続の[[ブロックボックス>#qf00ce14]]が存在しない場合、空のdivを置いてコレに適用する。
---clear: left;   左側フロート要素の回り込み解除
---clear: right;  右側フロート要素の回り込み解除
---clear: both;   両側すべてのフロート要素の回り込み解除

--clearfix という手法~
---after擬似要素のセレクタを使用して、親[[ブロックボックス>#qf00ce14]]の後続の[[ブロックボックス>#qf00ce14]]にclear プロパティを指定する手法。
---clearfix手法は、親[[ブロックボックス>#qf00ce14]]の後続の[[ブロックボックス>#qf00ce14]]が存在しない場合でも適用可能。

--overflow: hidden~
後続のブロックボックスではなく、親ブロックボックスにoverflow: hiddenを指定する。~
(autoまたはscrollでも解除可能だがスクロールバーが表示されるので問題)

-参考
--cssのfloatを解除する方法 〜あこがれの2カラムレイアウト〜 - やさしく つよく おもしろく~
http://pbrsk.hatenablog.com/entry/2016/02/08/000416
--floatを解除する手法のclearfix と 次世代のレイアウトの話|Web Design KOJIKA17~
http://kojika17.com/2013/06/clearfix-2013.html
--結局どれをつかえばいいの?floatの解除方法を3つ比較してみる~
これからWEBデザイナーを目指す高校生のブログ~
http://stinkear.blog39.fc2.com/blog-entry-3.html
--デザインサンプルで学ぶCSSによるスタイリング~~
「floatプロパティによるレイアウト」編 (1/4):CodeZine(コードジン)~
https://codezine.jp/article/detail/8239

*個別 [#a08df518]
**tableタグ [#rae95cb7]
古の方法。

***メリット [#gc4757fa]
CSSのレイアウトより簡単なので、
-初心者でも使いやすい。
-難しいことをしないのでブラウザ間の差異が無い。

***デメリット [#a9b05660]
以下の理由で、コンテンツのメンテナンス性の低下、レイアウト変更の手間が増加。
-HTMLとデザインを切り離せない(CSSなら切り離すことができる)。
-文章構造の論理性・汎用性が確保できなくなる。
-複雑化し易い(エクセル方眼紙 in Webみたいなことに)

***参考 [#lc457364]
-ホームページのレイアウトはテーブルではなくCSSを使う理由 | 大阪のホームページ制作会社YCOM~
http://www.y-com.info/contents/?p=388

**横並べ [#r1c60978]
以下の2つの方法がある。

***[[floatプロパティ>#xec6ed76]] [#te1189ef]
***[[display: inline>#i47b0ac9]] [#p62426fc]

**中央揃え [#xdc8bc68]

***text-align:center; vertical-align:middle; [#ve9b3728]
-インラインレベル要素を上下・左右の中央揃えにする最も一般的な方法。
-ブロックレベル要素は中央寄せにならないので、
--display:inline-block;でインラインレベル要素にする。
--もしくは、[[display:table-cell;>#ie078fdd]]を使用する。

***line-height:heightの値px [#ff82f281]
-インラインレベル要素を上下中央揃えにするハック的な方法。
-heightの値と、line-heightの値を同じにして上下中央揃え。
-2行以上になると、2行目以降が要素からはみ出してしまう。

***padding: xx px yy px; [#v2aeeb43]
-自要素に、高さ、幅の指定が無い(サイズが可変の)場合のみ有効。
-この場合、paddingは、記述した順に[上下][左右]のパディングとなる。
-この2つの値を指定したpaddingにより上下・左右の中央揃えになる。

***marginを使う。 [#cf68b378]
応用して、右寄せ・左寄せ、上寄せ・下寄せなどもできる。

-margin:auto
--上下・左右の中央揃えにする。
--自要素に、高さ、幅の指定が有るブロックボックスの場合のみ有効。
--自要素に、高さ、幅の指定が無い場合、自要素が親要素のサイズに合わせて伸びてしまう。

-margin:auto 0;
--上下の中央揃えにする。
--自要素に、高さの指定が有るブロックボックスの場合のみ有効。
--自要素に、高さの指定が無い場合、自要素が親要素のサイズに合わせて伸びてしまう。

-margin:0 auto;
--左右の中央揃えにする。
--自要素に、幅の指定が有るボックスの場合のみ有効。
--自要素に、幅の指定が無い場合、自要素が親要素のサイズに合わせて伸びてしまう。

***positionを使う。 [#vf1fbbbf]
高さ、幅の指定が無いブロックボックスを上下・左右の中央揃えにする。

-包含ブロック(コンテナブロック)からの絶対座標配置(position:absolute;)を使用する。
-左上を、包含ブロック(コンテナブロック)中央に合わせる(top:50%; left:50%;)
-そこからCSS3の transform: translate(-50%,-50%);で左上を中央に調整する

***display: table-cell;、display:table-cell; [#ie078fdd]
-親要素に「display:table;」と子要素に「display:table-cell;」を指定する。

-display:table;
--table要素のようになる。

-display:table-row;
--tr要素のようになる。
--子要素の高さが同じになる。

-display:table-cell;
--td要素のようになる。
--td要素は均等に配置される。
--td要素に[[text-align:center; vertical-align:middle;>#ve9b3728]]を指定すると、~
td要素の子要素に、これらが適用され、上下・左右の中央揃えにする。
--td要素の子要素がブロックレベル要素の場合、td要素ではなく、~
子要素に「margin: 0 auto;」を指定することで左右の中央揃えにする。

-参考
--display:table-cell;を安易に使うべきでない理由いろいろ - Qiita~
http://qiita.com/sawadays0118/items/4c329fd05cdff14ffebc

***参考 [#babf9f5e]
-【CSS】様々な要素を中央揃えにする方法 | Creator Clip~
http://creatorclip.info/2014/05/css-layout-center/
-CSSで中央寄せの方法いろいろメモ - Qiita~
http://qiita.com/KAMEch/items/b52c5e23212b8fef81a7
-floatしたものを中央に寄せたい! - Yahoo!知恵袋~
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11120240036

*その他 [#af09d7c4]
**[[CSS3のレイアウト>CSS3#w3ed3639]] [#x783302a]
**[[Bootstrapのレイアウト>Bootstrap#v5377ce1]] [#g0751ec7]
**[[CSS3のレイアウト>CSS3#w3ed3639]] [#x783302a]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS