protein_d
@protein_d (k .com)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

useStateでのハンバーガーメニューが開きっぱなし

解決したいこと

レスポンシブ時にハンバーガーメニューが開きっぱなしになってしまっているので、正常通りワンタッチで開け閉めができるようにしたい。

発生している問題・エラー

コードには、エラーも出てなく、チャットGPT4でも特定できず、デベロッパーツールでもエラーが出ていないので特定できず困っています。

スクリーンショット 2023-12-18 22.19.21.png

該当するソースコード

//component/nav.js

import Link from 'next/link';
import style from '../../styles/nav.module.css';

export default function Nav() {
  const [navIsOpen, setNavIsOpen] = useState(false);

  const toggleNav = () => {
    setNavIsOpen(!navIsOpen);
  };

  return (
    <nav className={style.navList}>
      <div className={style.hamburger} onClick={toggleNav}>
        <img src="/menu.png" alt="Menu" style={{ width: 30, height: 30 }} />
      </div>

      <ul className={navIsOpen ? style.navListMobile : style.navListHidden}>
        <li><Link href="/">HOME</Link></li>
        <li><Link href="/component/cardlist">CARD LIST</Link></li>
        <li><a href="https://golem-works.com/">お問合せ</a></li>
      </ul>
    </nav>
  );
}

//style/nav.module.css

.navList {
    color: antiquewhite;
    margin: 30px;
  }
  
  .navList ul {
    display: flex;
    justify-content: space-around;
    font-family: fantasy;
  }
  
  .navList ul li {
    margin-bottom: 10px; 
    transition: color 0.3s ease; 
  }
  
  /* ホバー時のスタイル */
  .navList ul li:hover {
    color: blueviolet;
    margin-bottom: 0;
  }
  
  .navList ul li a {
    transition: color 0.3s ease, text-shadow 0.3s ease;
    text-shadow: 0 0 0 transparent;
    position: relative; 
  }
  
  .navList ul li a:hover {
    color: blueviolet;
    text-shadow: 0 0 10px blueviolet;
  }
  
  /* アンダーラインのスタイル */
  .navList ul li a::after {
    content: '';
    position: absolute;
    width: 0;
    height: 2px;
    background: blueviolet;
    transition: width 0.3s;
    bottom: -5px;
    left: 0;
  }
  
  .navList ul li a:hover::after {
    width: 100%;
  }
  
  
  @media (max-width: 768px) {
    .navList ul {
      max-width: 100px;
      width: 90%;
      display: flex;
      flex-direction: column;
      list-style: none; 
      padding: 0; 
      margin: 0; 
      background-color: aliceblue; 
      text-align: center; 
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); 
    }
  
    .navList ul li {
      color: rgb(1, 3, 5);
      background-color: transparent; 
      opacity: 0.8; 
      padding: 15px 0; 
      border-bottom: 1px solid #ddd; 
    }
  
    .navListMobile {
      display: block;
    }
  
    .navList ul li a {
      color: rgb(1, 3, 5); 
      text-decoration: none; 
      font-weight: bold; 
    }
  
    .navList ul li a:hover {
      color: #0056b3; 
    }
  }
  
  @media (min-width: 769px) {
    .hamburger {
      display: none;
    }
  }



自分で試したこと

初歩的なことですが、widthの幅の問題かと思い、サイズを小さくしましたが効果なかったです。
開きっぱなしなので、逆に初期値をtureにして見ましたが、無限リログが起きました。
モバイル用のコンポーネントを増やして作ろうかとも思ったのですが、それだと根本的に解決しなそうなので、まだ試していません。ですが、できればコンポーネントを大量にしたくはないので、スマートな解決方法があればご教授いただけませんか?
よろしくお願いします。

0

2Answer

navIsOpenStateのfalse時に指定される予定のnavListHiddenクラスが、質問者様に記載いただいたcssに記載されていないと思うですが……。記載いただいたCSSから察するに下記のような指定になりますでしょうか。

.navListMobile {
  display: block;
}

/* navListHidden を追加 */
.navListHidden {
  display: none;
}

2Like

Comments

  1. @protein_d

    Questioner

    ご返信ありがとうございます。
    そちらの記入もしましたが、やはり動きませんでした。

    もしかしてグローバルcssに問題があったりしますか?

    //追記後

    .navList {
        color: antiquewhite;
        margin: 30px;
      }
      
      .navList ul {
        display: flex;
        justify-content: space-around;
        font-family: fantasy;
      }
      
      .navList ul li {
        margin-bottom: 10px; 
        transition: color 0.3s ease; 
      }
      
      /* ホバー時のスタイル */
      .navList ul li:hover {
        color: blueviolet;
        margin-bottom: 0;
      }
      
      .navList ul li a {
        transition: color 0.3s ease, text-shadow 0.3s ease;
        text-shadow: 0 0 0 transparent;
        position: relative; 
      }
      
      .navList ul li a:hover {
        color: blueviolet;
        text-shadow: 0 0 10px blueviolet;
      }
      
      /* アンダーラインのスタイル */
      .navList ul li a::after {
        content: '';
        position: absolute;
        width: 0;
        height: 2px;
        background: blueviolet;
        transition: width 0.3s;
        bottom: -5px;
        left: 0;
      }
      
      .navList ul li a:hover::after {
        width: 100%;
      }
      
      
      @media (max-width: 768px) {
        .navList ul {
          max-width: 100px;
          width: 90%;
          display: flex;
          flex-direction: column;
          list-style: none; 
          padding: 0; 
          margin: 0; 
          background-color: aliceblue; 
          text-align: center; 
          box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); 
        }
      
        .navList ul li {
          color: rgb(1, 3, 5);
          background-color: transparent; 
          opacity: 0.8; 
          padding: 15px 0; 
          border-bottom: 1px solid #ddd; 
        }
      
        .navListMobile {
          display: block;
        }
    
    
        /* 追記 */
        .navListHidden { 
          display: none;
        }
      
        .navList ul li a {
          color: rgb(1, 3, 5); 
          text-decoration: none; 
          font-weight: bold;
        }
    
      
        .navList ul li a:hover {
          color: #0056b3; 
        }
      }
      
      @media (min-width: 769px) {
        .hamburger {
          display: none;
        }
      }
    

    グローバルCSS

    @tailwind base;
    @tailwind components;
    @tailwind utilities;
    @import url('https://fonts.googleapis.com/css2?family=Creepster&display=swap');
    
    :root {
      --black: rgb(6, 5, 5);
    }
    
    body {
      background-color: var(--black);
      text-align: center;
      margin: auto;
    }
    .videoContainer {
      width: 90%;
      margin: auto;
      display: flex; 
      flex-direction: column; 
      align-items: center; 
      height: 100vh; 
      position: relative;
    }
    
    .videoContainer video {
      width: 100%;
      height: auto; 
      max-height: 80vh; 
    }
    
    /* 点滅アニメーション*/
    @keyframes blink {
      0%, 100% {
        opacity: 1; 
      }
      50% {
        opacity: 0.5; 
      }
    }
    
    button {
      
      color: white;
      font-family: 'fantasy';
      background-color: darkred;
      border: none;
      padding: 10px 20px;
      text-transform: uppercase;
      letter-spacing: 2px;
      transition: all 0.3s ease;
      box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
      cursor: pointer;
      border-radius: 20px;
      margin: auto;
      position: absolute;
      width: 200px;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
    
      /* 点滅アニメーションの適用 */
      animation: blink 2s infinite;
    }
    
    button:hover {
      background-color: crimson;
      box-shadow: 0 0 20px rgba(0, 0, 0, 0.7);
    }
    
    .cm {
      width: 700px;
      margin: auto;
      transition: transform 1s ease;
    }
    
    .cmText {
      margin-top: 10px;
      margin-bottom: 10rem;
      color: aliceblue
    }
    
    .cmText:hover {
      color: blueviolet;
    }
    
    .cm:hover {
      transform: scale(1.1);
    }
    
    
    /* スマートフォン用のスタイル */
    @media (max-width: 768px) {
      body {
        display: grid; 
        place-items: center; 
        font-size: 14px; 
      }
    
      .videoContainer {
        width: 100%; 
      }
    
      .videoContainer video {
        max-height: 60vh; 
      }
    
      .cm {
        width: 70%;
        margin-top: 10rem;
      }
    }
    
  2. CSSの詳細度の問題ではないでしょうか?

    .navList ul {
          max-width: 100px;
          width: 90%;
          display: flex; // ←ここが詳細度によって優先的にあてられている
          ...
        }
    

    もしそうだとすると

    .navList ul.navListHidden { 
          display: none;
        }
    

    または

    .navListHidden { 
          display: none!important;
        }
    

    でいかがでしょう?

    Chrome などブラウザの開発者ツールで要素のスタイリングを確認されると良いかもしれません。詳細度の問題の場合は追記した.navListHiddenで指定しているスタイルに打ち消し線が入っていると思います。

  3. @protein_d

    Questioner

    ご指摘の通り、優先順位の問題でした!
    全く考えになっかたです。インポータントで解決できました。
    本当にありがとうございました。

  4. 解決してよかったです。

Comments

  1. @protein_d

    Questioner

    シンタックスできてませんでした。ご指摘ありがとうございます。

  2. シンタックスハイライトも使ったほうが見やすいです。

Your answer might help someone💌