Learning site for website creation

スマホヘッダー

公開日:2020年07月05日 更新日:2020年07月09日

HTML

  <div class="sp-header">
    <input id="nav-input" type="checkbox">
    <div class="nav-box">
      <div class="logo-box">
        <a href="#"><img class="logo" src="img/logo_white.png" alt="ロゴ"></a>
      </div><!-- .logo-box -->
      <div class="nav-drawer">
        <label class="nav-icon" for="nav-input">
          <span></span>
          <span></span>
          <span></span>
        </label>
      </div><!-- .nav-drawer -->
    </div><!-- .nav-box -->
    <div class="nav-content">
      <ul class="menu">
        <li><a href="#">メニュー</a></li>
        <li><a href="#">メニュー</a></li>
        <li><a href="#">メニュー</a></li>
        <li><a href="#">メニュー</a></li>
      </ul>
    </div><!-- .nav-content -->
  </div><!-- .sp-header -->

CSS

/*---------------------------------
  スマホ用ヘッダー:ハンバーガーメニュー付き
---------------------------------*/
/* PC幅で非表示 */
.sp-header {
  display: none;
}

@media screen and (max-width:480px) {

  /* ヘッダー固定時の画面上部余白 */
  body {
    margin-top: 45px;
  }

  /* スマホ幅で表示 */
  .sp-header {
    display: block;
  }

  /* チェックボックス非表示 */
  .sp-header #nav-input {
    display: none;
  }

  /* 上部固定ヘッダー */
  .sp-header .nav-box {
    position: fixed;
    top: 0;
    left: 0;
    z-index: 1000;
    display: flex;
    justify-content: space-between;
    background: #000;
    color: #fff;
    padding: 10px;
    width: 100%;
    height: 45px;
  }

  /* ロゴ */
  .sp-header .logo-box {
    width: 50vw;
  }

  /* ハンバーガーアイコン:通常時 */
  .sp-header .nav-icon {
    position: relative;
    display: block;
    width: 30px;
    height: 30px;
    cursor: pointer;
  }

  .sp-header .nav-icon span {
    position: absolute;
    left: 0px;
    display: block;
    width: 100%;
    border-bottom: solid 3px #555;
    transition: 0.5s ease-in-out;
  }

  .sp-header .nav-icon span:nth-child(1) {
    top: 2px;
  }

  .sp-header .nav-icon span:nth-child(2) {
    top: 10px;
  }

  .sp-header .nav-icon span:nth-child(3) {
    top: 18px;
  }

  /* ハンバーガーアイコン:クリック時 */
  .sp-header #nav-input:checked~.nav-box .nav-icon span:nth-child(1) {
    top: 10px;
    transform: rotate(-45deg);
  }

  .sp-header #nav-input:checked~.nav-box .nav-icon span:nth-child(2) {
    opacity: 0;
  }

  .sp-header #nav-input:checked~.nav-box .nav-icon span:nth-child(3) {
    top: 10px;
    transform: rotate(45deg);
  }

  /* ナビゲーションエリア */
  .sp-header .nav-content {
    position: fixed;
    top: 0;
    left: 0;
    z-index: 100;
    width: 100vw;
    height: 100vh;
    background: rgba(55, 0, 0, 0.9);
    color: #fff;
    transition: 0.5s;
    transform: translateY(-100%);
  }

  /* ナビゲーションエリア:ハンバーガーアイコンクリック時 */
  .sp-header #nav-input:checked~.nav-content {
    transform: translateY(0%);
    top: 45px;
  }

  /* ナビゲーションリスト */
  .sp-header .nav-content .menu {
    list-style-type: none;
    padding: 0 2vw;
  }

  .sp-header .nav-content a {
    display: block;
    background-color: rgba(255, 255, 255, 0.8);
    border: solid 3px #fff;
    border-radius: 30px;
    color: #000;
    font-size: 4vw;
    padding: 2vw 4vw;
    margin: 2vw 0;
  }
}

解説

パーツの重なり順

HTML

  <div class="sp-header">
    <input id="nav-input" type="checkbox">

    <div class="nav-box">
      <div class="logo-box">
        <a href="#"><img class="logo" src="img/logo_white.png" alt="ロゴ"></a>
      </div><!-- .logo-box -->
      <div class="nav-drawer">
        <label class="nav-icon" for="nav-input">
          <span></span>
          <span></span>
          <span></span>
        </label>
      </div><!-- .nav-drawer -->
    </div><!-- .nav-box -->

    <div class="nav-content">
      <ul class="menu">
        <li><a href="#">メニュー</a></li>
        <li><a href="#">メニュー</a></li>
        <li><a href="#">メニュー</a></li>
        <li><a href="#">メニュー</a></li>
      </ul>
    </div><!-- .nav-content -->

  </div><!-- .sp-header -->

CSS

/* 上部固定ヘッダー */
.sp-header .nav-box {
         :
  z-index: 1000;
         :
}
 
/* ナビゲーションエリア */
.sp-header .nav-content {
         :
  z-index: 100;
         :
}

ハンバーガーメニュー

HTML

  <div class="sp-header">
    <input id="nav-input" type="checkbox">
    <div class="nav-box">
      <div class="logo-box">
        <a href="#"><img class="logo" src="img/logo_white.png" alt="ロゴ"></a>
      </div><!-- .logo-box -->
      <div class="nav-drawer">
        <label class="nav-icon" for="nav-input">
          <span></span>
          <span></span>
          <span></span>
        </label>
      </div><!-- .nav-drawer -->
    </div><!-- .nav-box -->
    <div class="nav-content">
      <ul class="menu">
        <li><a href="#">メニュー</a></li>
        <li><a href="#">メニュー</a></li>
        <li><a href="#">メニュー</a></li>
        <li><a href="#">メニュー</a></li>
      </ul>
    </div><!-- .nav-content -->
  </div><!-- .sp-header -->

CSS

基準枠

.sp-header .nav-icon {
  position: relative;
  display: block;
  width: 30px;
  height: 30px;
  cursor: pointer;
}

ハンバーガーの棒を絶対配置

.sp-header .nav-icon span {
  position: absolute;
  left: 0px;
  display: block;
  width: 100%;
  border-bottom: solid 3px #555;
  transition: 0.5s ease-in-out;
}
.sp-header .nav-icon span:nth-child(1) {
  top: 2px;
}
.sp-header .nav-icon span:nth-child(2) {
  top: 10px;
}
.sp-header .nav-icon span:nth-child(3) {
  top: 18px;
}

ハンバーガークリック時の「×」表示

ハンバーガー上ライン「45度」回転、下ライン「-45度」回転、真ん中非表示で「×」を作る

  /* ハンバーガーアイコン:クリック時 */
  .sp-header #nav-input:checked~.nav-box .nav-icon span:nth-child(1) {
    top: 10px;
    transform: rotate(-45deg);
  }

  .sp-header #nav-input:checked~.nav-box .nav-icon span:nth-child(2) {
    opacity: 0;
  }

  .sp-header #nav-input:checked~.nav-box .nav-icon span:nth-child(3) {
    top: 10px;
    transform: rotate(45deg);
  }

メニューが表示される仕組み

メニュー非表示時

/* ナビゲーションエリア */
.sp-header .nav-content {
  position: fixed;
  top: 0;
  left: 0;
  z-index: 100;
  width: 100vw;
  height: 100vh;
  background: rgba(55, 0, 0, 0.9);
  color: #fff;
  transition: 0.5s;
  transform: translateY(-100%);
}

メニュー表示時

/* ナビゲーションエリア:ハンバーガーアイコンクリック時 */
.sp-header #nav-input:checked ~ .nav-content {
  transform: translateY(0%);
  top: 45px;
}

兄弟セレクタ

.sp-header #nav-input:checked ~ .nav-content

CSSセレクタ「~」は「兄弟要素」を指定するセレクタです。

指定した要素より後にでてくる同じ階層の要素が対象になります。

CSSセレクタチートシート:Weblikerさん

<div class="sp-header">
  <input id="nav-input" type="checkbox">
  <div class="nav-box">
           :
  </div><!-- .nav-box -->
  <div class="nav-content">
           :
  </div><!-- .nav-content -->
</div><!-- .sp-header -->