Javascript12.5(モバイルメニューの追加)

モバイルメニューの追加

scripts/libsにmobile-menu.jsを作成し以下の記述にする

class MobileMenu {
// コストラクタ関数を用意する
  constructor() {
// オブジェクトリテラルで初期化
  this.DOM = {};
  this.DOM.btn = document.querySelector('.mobile-menu__btn');
  this.DOM.cover = document.querySelector('.mobile-menu__cover');
// this.DOM.containerでないとエラーになるよ
  this.DOM.container = document.querySelector('#global-container');
  this.eventType = this._getEventType();
  this.__addEvent();
}

// プライベートメソッドにする(修正や保守のしやすさのため)
_getEventType() {
// スマホとデスクトップ対応するためにクリックかタッチかで処理をわける
  return window.ontouchstart ? "touchstart" : "click";
}

_toggle() {
// global-containerにクリックするたびにmenu-openを付加、解除
  this.DOM.container.classList.toggle("menu-open");
}
__addEvent() {
// ボタンが押されたら発火
this.DOM.btn.addEventListener(this.eventType, this._toggle.bind(this));
// カバーかクリックしたときに発火
this.DOM.cover.addEventListener(this.eventType, this._toggle.bind(this));
 }
}

モバイルメニューが正常に働くことを確認する

worldの部分(アニメーションの追加)

.world {
  @extend .content-width;
  @extend .mb-lg;
// 親要素でローカルスタッキングコンテキストを作るために必要
  &__inner {
    @extend .flex;
    justify-content: space-between;
// 周りに壁を作る
    padding: 15px;
    background-color: $cBgGray;
// 下の2つはローカルスタッキングコンテキストを作る設定
    position: relative;
    z-index: 0;
}

  &__title {
// 横線の位置決め
    position: relative;
// 横線を疑似要素で出力する
@include p-base(
$display: none,
$width: 70px,
$height: 1px,
$top: 50%,
// 線の長さ
$left: -75px
) {
// 棒線が伸びるアニメーション
  background-color: $cBlack;
  transform: translateY(-50%) scaleX(0);
// 右側を中心に伸びるアニメーション
  transition: transform 0.3s ease 1.6s;
  transform-origin: right;
 }
}
  &__sub {
    @extend .mb-sm;
}

  &__img {
    height: 300px;
    @extend .mb-sm;
// アニメーションが終わったときに表示したいので
    transition: box-shadow 1ms linear 0.8s;

    & > img {
      position: relative;
// ボックスシャドウを背面につけるための設定
      z-index: -1;
// 画像には基本object-fitをつける
      object-fit: cover;
// 画像の上部分を中心にしたいので
      object-position: top;
// 外側の親要素タテヨコ100%で画像が表示される
      width: 100%;
      height: 100%;
}

  &.inview {
// 内側にボックスシャドウを付ける設定
    box-shadow: inset 0 0 30px $cBlack;
}
}

  &__texts {
  @extend .pb-sm;
// 横線のアニメーションの設定
  &.inview {
  & .world__title::before {
//右から左に線が伸びるように
     transform: translateY(-50%);
   }
  }
 }
}

サイドバーやロゴのスタイル

//ロゴ
.logo {
  font-size: 42px;
  display: flex;

  &__img {
    width: 0.7em;
}

  &__Garden {
    color: $cWineRed;
 }
}
// スマホ画面のときサイド要素を非表示にする
.side {
  display: none;
// 固定する
   position: fixed;
// 画面の上から70%から表示する
  top: 70%;
// ここは検証で試してみるとよい
  transform: translateY(-50%);
  transition: all 0.3s ease-in;
  & .tween-animate-title {
    color: $cBlack;
    text-decoration: none !important;
    margin: 0 40px;
// ロゴと文字の中心のズレを修正
    vertical-align: middle;
    letter-spacing: 2px;
}
// サイドバー左側の設定
  &.left {
    left: -50px;
  &.inview {
    left: 50px;
}
  & .side__inner {
// 左端を軸とするための設定
    transform-origin: top left;
// 文字を-90度回転させる
    transform: rotate(-90deg);
}
}
// サイドバー右側の設定
  &.right {
    right: -50px;
  &.inview {
    right: 50px;
}
  & .side__inner {
// 右端を軸とするための設定
    transform-origin: top right;
// 文字を90度回転させる
    transform: rotate(90deg);
  }
 }
}
.icon {
  position: relative;
@include p-base($left: -20px, $top: 50%, $width: 1em, $height: 1em) {
transform: translateY(-50%);
background-position: center;
background-repeat: no-repeat;
background-size: contain;
}
//ロゴの設定
  &.twitter {
     &::before {
      background-image: url(../images/twitter.svg);
 }
}
  &.fb {
  &::before {
    background-image: url(../images/facebook.svg);
  }
 }
}
// サイドバーのローカルスタッキングコンテキストを作るための設定 
#main-content {
 position: relative;
 z-index: 0;
}
// サイドバーより背面にしたい 
main {
 position: relative;
 z-index: -1;
 }

サイドバーは前面にしたいのでmainのz-indexを低くしている

_600up.scssに以下の記述にする

// Stylesheet: 600px以上のタブレットやモニタで適用
.flex {
// 横に2列したいときの設定
  flex-direction: row;
// これを設定しないとflex-basisが変わらない
  flex-wrap: wrap;
}

.flowers {
  &__item {
    flex-basis: 50%;
    margin-bottom: 60px;
}
}

.popular {
  &__container {
// 余白を真ん中にしたい
     justify-content: space-between;
}

  &__item {
    flex-basis: 47%;
}
}

.world {
  &__inner {
    padding: 50px;
}
  &__texts,
  &__img {
    flex-basis: 47%;
}

  &__texts {
    display: flex;
// 文字を下揃えにするときに便利な設定
    align-items: flex-end;
}
}

.footer {
  & .logo {
// 左寄りにする右寄りはflex-end
    justify-content: flex-start;
}

  &__li {
// 検証を使いながら位置調整
    margin-left: 0;
    margin-right: 30px;
 }
}

.flexにflex-wrap: wrap;をつけるのを忘れないように!(flex-basisで調整できないから)

_960up.scssに以下の記述にする

// Stylesheet: 960px以上のモニタで適用

.font-sm {
  font-size: 16px;
}
.font-md {
  font-size: 19px;
}
.font-lr {
  font-size: 23px;
}
.font-lg {
  font-size: 36px;
}
.mb-lg {
  margin-bottom: 150px !important;
}
.pb-lg {
  padding-bottom: 150px !important;
}

.popular {
  &__item {
    flex-basis: 25%;
}

  &__img {
    height: 335px;
}
}

.world {
  &__img {
    height: 400px;
}

  &__description {
    margin-bottom: 40px;
}
  &__title {
// アニメーションを表示するための設定
  &::before {
// 960px以上のときアニメーションするように設定
    display: block;
}
}
}

.footer {
  &__li {
    justify-content: flex-start;
}
}
// 960以上ではヘッダー表示
.header {
  &__nav {
    display: block;
}
}
// ハンバーガーメニューを非表示にする(モバイル用でないため)
.mobile-menu {
  &__btn {
    display: none;
}
}
// スワイパースライドに影をつける
.swiper-slide {
  box-shadow: 0 8px 40px -10px rgba(0, 0, 0, 0.8);
}

ハンバーガーメニューを非表示にすることdisplay: none;

960px以上のときアニメーションとヘッダー表示display: block;を忘れずに!

_1280up.scssに以下の記述にする

// Stylesheet: 1280px以上のモニタで適用

.world {
  &__inner {
    padding: 50px 150px;
}
}
.popular {
  &__item {
    flex-basis: 23%;
}
}
// サイドバー要素を表示する
.side {
  display: block;
}

display: block;でサイドバーを表示させるのを忘れずに!

_viriables.scssを以下の記述にする

$cWhite: white;
$cBlack: black;
$cSubTitle: #535353;
$cBgGray: #eaebe6;
$cWineRed: #904669;
$contentMaxWidth: 1070px;
$navHeight: 100px;

2:ページローダーの導入

以前作成したページローダーを流用する

pace.jsとloader.scssをコピーして貼り付け以下のように配置

index.htmlの<head>タグの中に読み込ませるよう記述する

loader.scssに読み込ませるため以下のように記述

このようになっていればOK

3:_appear.scssを追加してアニメーションを追加する

フェードインアニメーションで作った_appear.scssをmodulesに配置してstyle.scssで読み込む

使い方index.htmlの親要素にappearをつけて子要素にitemをつけるとフェードインアニメーションを付加できる。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です