N予備校プログラミングコースの冬といえばこの Advent Calendar、そして・・
冬のプログラミングコンテスト が始まる季節!
「Webアプリのプログラミング部分はできた、、けど、、思ったようにボタンが・・、
部品が、、置きたい場所に、、配置できないんじゃああああああ
うあああああああああああ!」って方に向けたCSSの記事です。
position: relative・absolute
おおよそ、これで配置はどうにかなります。positionプロパティ。 まずはpositionを使って、要素の**中央寄せ**を実装してみます。 **HTML**には**\<body>
<div id="A"></div>
</body>
#A{
position: relative;
margin: auto;
width: 500px;
height: 200px;
top:calc(100vh - 50vh - 100px);
border: 4px double skyblue;
}
position: relative;
margin: auto;
top:calc(100vh - 50vh - 100px);
positionプロパティで、配置する場所を直接入力する方法です。まさに力技。
現在のCSSは計算で数値を設定できるので、遠慮なく使っていきます。
calc();
↑ これで計算できます。
top:calc(100vh - 50vh - 100px);
「ブラウザの縦の大きさ」 - 「その50%」 - 「divAの縦の200pxの半分100px」
で、画面中央に! 。゚+.ヽ(´∀`*)ノ ゚+.゚
横も同じ様に設定してもOKですが、この例ではmargin: auto;で済んでしまうので省略。
練習として横の設定も変数にするのもいいのかも?
むずかしい部分としては、position属性にはrelativeとabsoluteと、似たものがあります。
2つの違いは原点 (top: 0px; left: 0px; の場所)
<body>
<div id="A">
<div id="B">B</div>
<div id="C">C</div>
</div>
</body>
#A{
position: relative;
margin: auto;
width: 500px;
height: 200px;
top:calc(100vh - 50vh - 100px);
border: 4px double skyblue;
color: deepskyblue;
}
#B{
width: 300px;
height: 50px;
border: 4px double skyblue;
}
#C{
width: 300px;
height: 50px;
border: 4px double skyblue;
}
#C{
width: 300px;
height: 50px;
border: 4px double skyblue;
position: relative;
top:0px;
left:0px;
}
#C{
width: 300px;
height: 50px;
border: 4px double skyblue;
position:absolute;
top:0px;
left:0px;
}
重なりました。これ、何が違うのかわかるでしょうか? position: absolute の原点は、周りの兄弟要素無視して、親要素Aの(0,0)が原点となります。それに対し、relativeは、通常の表示場所が原点となります。Cをposition: relative;に戻して位置を top: -25px; と設定してみると、relativeがどこを原点にして移動しているのかわるかと思います。
わかりにくかったら「子要素は全部absolute!」これで問題ないきがします。
そして自由に要素を配置すると、要素同士が重なって、見せたいほうの要素が下に行ってしまい、見えなくなることがままあります。そういうときは、
z-index: 数値;
で調整します。いわゆるレイヤー(階層)みたいなものです。上にしたい方の数値を整数で上に指定すればOK。
#B{
width: 300px;
height: 50px;
border: 4px double skyblue;
position:absolute;
top:0px;
left:0px;
z-index: 2;
}
#C{
width: 300px;
height: 50px;
border: 4px double skyblue;
position:absolute;
top:0px;
left:0px;
z-index: 1;
}
注意点としては、
positionがstatic(何も設定してない状態)では、z-indexは効きません。
Flex Box
次に、メジャーな機能が**フレックスボックス**。こちらは**親要素**と**子要素**の関係性が重要となってきます。下の**html**では**\<body>
<div id="A">
<div id="B">B</div>
<div id="C">C</div>
</div>
</body>
#A{
position: relative;
margin: auto;
width: 500px;
height: 200px;
top:calc(100vh - 50vh - 100px);
border: 4px double skyblue;
color: deepskyblue;
}
#B{
width: 100px;
height: 50px;
border: 4px double skyblue;
}
#C{
width: 100px;
height: 50px;
border: 4px double skyblue;
}
現在このように表示されます。
フレックスボックスは、親要素に設定を書き込んでいきます。
#A{
position: relative;
margin: auto;
width: 500px;
height: 200px;
top:calc(100vh - 50vh - 100px);
border: 4px double skyblue;
color: deepskyblue;
display: flex;
justify-content:center;
align-items:center;
}
#B{
width: 100px;
height: 50px;
border: 4px double skyblue;
}
#C{
width: 100px;
height: 50px;
border: 4px double skyblue;
}
justify-content:center;
align-items:center;
と、水平方向の設定のjustify-contentと、垂直方向の設定のalign-itemsを centerに設定。
こうなっていれば成功です。
フレックスボックスには並び方の設定がもろもろありますので、こちらの**チートシート**をみながら色々試してみてください。
Grid
もう一つ、よく使われるのが **グリッド**。今回はレイアウト機能だけちょこっと。 ![3colum.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212989/6984f5fa-9093-1932-b55b-4341715bb1c2.png) シンプルな3カラムレイアウト。これを**grid**で実装していきます。<body>
<header>ヘッダー</header>
<nav>サイドA</nav>
<main>コンテンツ</main>
<aside>サイドB</aside>
<footer>フッター</footer>
</body>
header{
border: 4px skyblue double;
}
nav{
border: 4px skyblue double;
}
main{
border: 4px skyblue double;
}
aside{
border: 4px skyblue double;
}
footer{
border: 4px skyblue double;
}
グリッドの詳細設定を書き込む
grid-template
そして、子要素にグリットテンプレートで書いた場所を実際にあてがう
grid-area
body{
width: 100vw;
height: 100vh;
margin: 0;
display: grid;
grid-template:
"header header header"
"sideA main sideB "
"footer footer footer"
;
}
header{
grid-area: header;
border: 4px skyblue double;
}
nav{
grid-area: sideA;
border: 4px skyblue double;
}
main{
grid-area: main;
border: 4px skyblue double;
}
aside{
grid-area: sideB;
border: 4px skyblue double;
}
footer{
grid-area: footer;
border: 4px skyblue double;
}
ここがグリッドのキモですね。
"header header header"
"sideA main sideB "
"footer footer footer"
;
うまくいったでしょうか?
次に、実際のエリアの大きさの設定です。これもかんたん。
grid-template:
"header header header" 15vh
"sideA main sideB " 1fr
"footer footer footer" 15vh
/ 1fr 3fr 1fr
;
@import url("./A.css");
@import url("./B.css");
@import url("./C.css");
ご迷惑おかけしました。
変数
CSSで計算ができるということは、変数も使えたりします。例えば「ボタンはこの色で統一」と、色を変数にしておけば、もし色を変えたい時、変数の色を変えるだけで、すべてのページのボタンの色を変えられたりするので、なかなか便利です。:root {
--bg-color: blue;
--main-fontsize: 14px;
}
body{
background-color: var(--bg-color);
font-size: var(--main-fontsize);
}
--変数名:値
変数の設定方法はこれだけです。( ハイフン(-)2つは必須 )
変数の記入場所のスタンダードは:root
という擬似クラス。ここは、この変数のスコープ(適用範囲)が、HTML全体になる場所です。
そして設定した変数の使い方
var()
このカッコの中に変数名を書くだけです。Webアプリで大作を作ろうとしてる方は必須かもしれません。
Merry Christmas