前置き
ヘッダーがスマホではハンバーガーになり🍔
それをクリックすることで
別コンポーネントでメニューを開きます。
その時にハンバーガーボタンを
閉じるボタンに❌変更しましょう🌟
構成
アトミックデザイン
毎度のことなので省きます。
ブログ内検索してみてくださいね✨🔍
directory
components/
--| templates/
----| headers
------| HeaderDefault.vue
----| navs
------| NavSide.vue
layouts/
--| default.vue
pages/
--| index.vue
使用するもの
layout
ヘッダーやフッターは
基本的にlayout
に入れます💫
CSS
メディアクエリは
変数で設定しておきましょう!
とっても便利です💕
【Nuxt.js】mixin実践編:Sass & mixinで簡単メディアクエリ
❌にするためにtransform
プロパティを使います🌟
その他
コンポーネントは
いちいち登録が面倒なので
自動でインポートしています。
めちゃくちゃ楽ちんですよ❤️
Let's try!
まずは答えを見ずにやってみましょう♪
余白などのCSSや
ヘッダーの中身はお好きにどうぞ!
body
のmargin
などは
リセットCSSでやっておくと良いですね🙆♀️
ticktack…
答え
Point!
layouts/default
にはHeaderDefault
のみインポート
NavSide
はHeaderDefault
にある
ハンバーガーを押すことで開きます🍔🇺🇸
そのためlayoutsに入れるのはHeaderDefault
のみでOK⭕️
NavSideはposition: fixed;
全体に覆いかぶさる形になるため
閉じるボタン部分
🍔 → ❌
この時にNavSide
が
閉じるボタンを多いますがlayouts
にHeaderDefault
が
入っているため問題なくクリックできます💡
CSSは
🍔を覆うdivを基準に位置を決めるためposition: relative;
position: absolute;
を使用しています。
3本の線の位置を
それぞれ決めないと
1本に重なってしまうためtransform
プロパティで調整🌟transform: translate(X軸, Y軸) XorY個別指定, rotate(角度)
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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
<template> <div class="header header-default" > <header class="head"> <div class="container"> <nav class="nav"> <ul class="list"> <li class="item"> <nuxt-link class="link" to="/"> <p class="nav-text" > TOP </p> </nuxt-link> </li> <li class="item"> <nuxt-link class="link" to="/"> <p class="nav-text" > ABOUT </p> </nuxt-link> </li> </ul> </nav> <div class="hamburger" :class="{ active: isMenu }" @click="isMenu = !isMenu" > <span class="line" /> <span class="line center" /> <span class="line" /> </div> </div> </header> <NavSide v-if="isMenu" /> </div> </template> <script> export default { data () { return { isMenu: false, } }, } </script> <style lang="scss" scoped> .header-default { > .head { padding: 0 20px; background-color: white; box-shadow: 0 0 25px rgba(0, 204, 255, 0.3); border-radius: 0 0 16px 16px; > .container { display: flex; align-items: center; max-width: 1200px; height: 104px; @include sp { height: 65px; } > .nav { @include sp { display: none; } > .list { display: flex; padding: 0; list-style: none; > .item { > .link { display: block; text-align: center; text-decoration: none; padding-right: 16px; > .nav-text { color: #00ccff; font-size: 12px; white-space: nowrap; text-decoration: none; } } } } } > .hamburger { display: none; position: relative; z-index: 7000; @include sp { display: block; } > .line { position: absolute; display: block; top: 50%; left: 50%; width: 28px; height: 3px; background-color: #00ccff; border-radius: 2px; margin-bottom: 8px; &:first-child { transform: translate(-50%, -50%) translateY(-8px); } &.center { transform: translate(-50%, -50%); } &:last-child { transform: translate(-50%, -50%) translateY(8px); } } &.active { > .line { &:first-child { transform: translate(-50%, 0) rotate(45deg); } &.center { display: none; } &:last-child { transform: translate(-50%, 0) rotate(-45deg); } } } } } } } </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 47 48 49 50 51 52 53 |
<template> <div class="header header-default-sp"> <div class="container"> <ul class="list"> <li class="item"> <nuxt-link class="link" to=""> <p class="nav-text" > TOP </p> </nuxt-link> <nuxt-link class="link" to=""> <p class="nav-text" > ABOUT </p> </nuxt-link> </li> </ul> </div> </div> </template> <style lang="scss" scoped> .header-default-sp { position: fixed; top: 0; width: 100%; height: 100vh; background-color: rgba(0, 204, 255, 0.2); > .container { padding-top: 160px; > .list { padding: 0; list-style: none; > .item { > .link { text-align: center; text-decoration: none; > .nav-text { color: #00ccff; } } } } } } </style> |
1 2 3 4 5 6 |
<template> <div> <HeaderDefault /> <nuxt /> </div> </template> |
まとめ
変更できれば
わざわざ閉じるボタンを
別途作成する必要がないので
良いですよね💕
実践編が増えてきたので
アトミックデザインなど、
そろそろ感覚が
掴めてきたのではないでしょうか?🌟🤗