⬇️前回の続きです!
【Nuxt.js】Nuxt文法編:Grid Layout①
レスポンシブ対応を
Grid Layoutの実践形式でやります✨🙋♀️
簡単ver.
前回までの復習を含め
やってみましょう💪
幅や小要素の余白などは
つけなくてOKです⭕️
boxの中身は
中央配置をしましょう💡
ticktack…
答え
前回と同じくclass名
は
分かりやすく安直に命名😃
パッと見でgrid
の範囲が見にくい🤔💦
と感じたら全ての要素にborder
をつけてあげましょう🎗
1 2 3 |
* { border: 1px solid deepskyblue; } |
grid-column
が全て同じになるので
あとはgrid-row
を
それぞれ上から指定すればOKです✳
ちなみに1/2, 2/3, 3/4
など
隣の数字を使う場合は
省略して開始地点のみの記載でOK⭕️1/2 → 1
2/3 → 2
3/4 → 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
<template> <div class="page"> <div class="container"> <div class="box first">1</div> <div class="box second">2</div> <div class="box third">3</div> </div> </div> </template> <script> export default { } </script> <style lang="scss" scoped> .page { > .container { display: grid; > .box { display: flex; align-items: center; justify-content: center; &.first { grid-row: 1/2; grid-column: 1/2; @include sp { grid-row: 1/2; grid-column: 1/2; } } &.second { grid-row: 1/2; grid-column: 2/3; @include sp { grid-row: 2/3; grid-column: 1/2; } } &.third { grid-row: 2/3; grid-column: 2/3; @include sp { grid-row: 3/4; grid-column: 1/2; } } } } } </style> |
省略するとこうなります💡
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
<style lang="scss" scoped> * { border: 1px solid deepskyblue; } .page { > .container { display: grid; > .box { display: flex; align-items: center; justify-content: center; &.first { grid-row: 1; grid-column: 1; @include sp { grid-row: 1; grid-column: 1; } } &.second { grid-row: 1; grid-column: 2; @include sp { grid-row: 2; grid-column: 1; } } &.third { grid-row: 2; grid-column: 2; @include sp { grid-row: 3; grid-column: 1; } } } } } </style> |
⬇️メディアクエリについては
こちらをご覧ください✨👀
【Nuxt.js】mixin実践編:Sass & mixinで簡単メディアクエリ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
$sp: 425px; $tab: 768px; $lap: 1024px; $pc: 1200px; @mixin sp { @media screen and (max-width: ($sp)) { @content; } } @mixin tab { @media screen and (max-width: ($tab)) { @content; } } @mixin lap { @media screen and (max-width: ($lap)) { @content; } } @mixin pc { @media screen and (max-width: ($pc)) { @content; } } |
入れ子を使用ver1. 難易度アップ🔥
入れ子を使用した使い方です❗️
1がテキストで
2, 3がそれに対応する画像だとします📸
2, 3をdiv
で囲ってimg
というclass名
をつけたいです💡
テンプレートはこうなりますね💭
1 2 3 4 5 6 7 8 9 10 11 |
<template> <div class="page"> <div class="container"> <div class="box first">①</div> <div class="box img"> <div class="box second">②</div> <div class="box third">③</div> </div> </div> </div> </template> |
Point!
div container
にdisplay: grid;
をつけていますが、
効くのは直下のfirst
とdiv img
のみです🌀second
とthird
もgrid
にしたいのでdiv img
にもdisplay: grid;
をつけます💫☝️
それぞれ開始地点は
親のdiv img
に依存しますね🤔
幅はそれぞれ100px
ずつにしましょう🌟
ticktack…
答え
緑がdiv img
です🍀
⬅️左の図
親のconteiner
から
見た場合の位置はgrid-row: 1/3;
grid-column: 2/3;
ですね💡
➡️右の図
自分が親の場合
2つの小要素の位置は
これを元に決めます❗️grid-row: 1/2;
grid-column: 1/2;
grid-row: 2/3;
grid-column: 1/2;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
<template> <div class="page"> <div class="container"> <div class="box first">①</div> <div class="box img"> <div class="box second">②</div> <div class="box third">③</div> </div> </div> </div> </template> <script> export default { } </script> <style lang="scss" scoped> .page { > .container { display: grid; grid-template-rows: 100px 100px; grid-template-columns: 100px 100px; @include sp { grid-template-rows: 100px 100px 100px; grid-template-columns: 100px; } > .box { display: flex; align-items: center; justify-content: center; &.first { grid-row: 1/2; grid-column: 1/2; @include sp { grid-row: 1/2; grid-column: 1/2; } } &.img { grid-row: 1/3; grid-column: 2/3; display: grid; grid-template-columns: 100px; > .box { display: flex; align-items: center; justify-content: center; height: 100%; } @include sp { grid-row: 2/4; grid-column: 1/2; } > .second { grid-row: 1/2; grid-column: 1/2; @include sp { grid-row: 1/2; grid-column: 1/2; } } > .third { grid-row: 2/3; grid-column: 1/2; @include sp { grid-row: 2/3; grid-column: 1/2; } } } } } } </style> |
入れ子を使用ver2. 難易度さらにアップ🔥🔥
今度はdiv img
の間に
テキストが入り込みます💥🧱
テンプレートは変わらずこちらです❗️
1 2 3 4 5 6 7 8 9 10 11 |
<template> <div class="page"> <div class="container"> <div class="box first">①</div> <div class="box img"> <div class="box second">②</div> <div class="box third">③</div> </div> </div> </div> </template> |
ticktack…
答え
div img
の中に
1を入れるなんて無理なのでは❓
と思った方がいらっしゃるかもしれません。flex
に慣れている方は特に❗️
が、grid
ならできるんです❣️
図の通り、grid
とは線の本数を決めてから
要素を置くやり方なので…
簡単にできてしまうんです❤️🧸
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
<template> <div class="page"> <div class="container"> <div class="box first">①</div> <div class="box img"> <div class="box second">②</div> <div class="box third">③</div> </div> </div> </div> </template> <script> export default { } </script> <style lang="scss" scoped> .page { > .container { display: grid; grid-template-rows: 100px 100px; grid-template-columns: 100px 100px; @include sp { grid-template-rows: 100px 100px 100px; grid-template-columns: 100px; } > .box { display: flex; align-items: center; justify-content: center; &.first { grid-row: 1/2; grid-column: 1/2; @include sp { grid-row: 2/3; grid-column: 1/2; } } &.img { grid-row: 1/3; grid-column: 2/3; display: grid; grid-template-rows: 100px 100px; grid-template-columns: 100px; @include sp { grid-row: 1/4; grid-column: 1/2; } > .box { display: flex; align-items: center; justify-content: center; height: 100%; } > .second { grid-row: 1/2; grid-column: 1/2; @include sp { grid-row: 3/4; grid-column: 1/2; } } > .third { grid-row: 2/3; grid-column: 1/2; @include sp { grid-row: 1/2; grid-column: 1/2; } } } } } } </style> |
これ、flex
ではかなり無理があります💦
⭕️できることdisplay: flex;
をあてた親要素が
同じ場合の要素同士container
の直下first
, div img
を入れ替える、div img
の直下second
, third
を入れ替える
➡️order
やflex-direction
プロパティを使用
❌できないことdisplay: flex;
をあてた親要素が
違うもの同士container
の直下first
とdiv img
の直下second
, third
の入れ替えは
親が違うので不可
➡️2, 3の間にpaddingをつくって
1をposition
で
無理やり入れることになる😨
というのは想像がつくかと思います💡
まとめ
コツさえ掴めば
レスポンシブ対応がしやすいことが
分かったかと思います💕flex
も便利ですが、
要素の位置がCSSの数字で
すぐに認識できるのも魅力的ですね❤️💡🤔