어떻게 CSS만 사용하여 호응성이 강한 햄버거 메뉴를 만듭니까?

안녕하세요.✌. 저는, 전단 개발자와...자, 시작합시다.

Tip: Follow along with me in this tutorial


왜 우리는 반응이 민감한 메뉴가 필요합니까?


대다수 사용자는 휴대전화를 사용한다.
다음과 같은 몇 가지 사실을 증명할 수 있다.
  • 1년 동안 모바일 사용자의 점유율이 10% 이상 증가했다.
  • 2020년까지 전 세계 인터넷 데이터의 분류는 다음과 같다. 50.88%의 휴대전화, 46.39%의 데스크톱, 2.74%의 태블릿PC
  • 충분하지 않으면 다음과 같은 글로벌 모바일 트래픽 데이터를 볼 수 있습니다.

    자료 출처: https://bit.ly/3xUVMhp

    최종 결과


    이곳의 주요 목표는 모바일 햄버거 메뉴를 완성하는 데 도움을 주는 것입니다.
    다음은 이 강좌에서 구축할 내용입니다.

    너는 메뉴의 유리 변형 효과에 주의했니?우리도 이렇게 할 거야!

    태그(설명 첨부)


    탐색 및 메뉴의 HTML을 설정합니다.
    <nav class="nav">
      <a href="#" class="nav__logo">CompanyLogo</a>
    
      <!-- focus on this div -->
      <div class="nav__menucontainer">
        <div class="nav__listcontainer" tabindex="0">
          <ul class="nav__menu" id="navmenu">
            <li class="nav__item">
              <a href="#" class="nav__link">About</a>
            </li>
            <li class="nav__item">
              <a href="#" class="nav__link">Projects</a>
            </li>
            <li class="nav__item">
              <a href="#" class="nav__link">Contact</a>
            </li>
            <li class="nav__item">
              <a href="#" class="nav__link">Blog</a>
            </li>
          </ul>
          <a id="hamburger" href="#navmenu" title="menu" class="nav__hamburger">
            <i class="fa fa-2x fa-hamburger"></i>
          </a>
        </div>
        <a href="#!" title="close menu" class="nav__hamburgerclose"><i class="fa fa-2x fa-times-circle"></i></a>
      </div>
    
    </nav>
    
    이 코드를 복사해서 붙이기만 하면 (만약 당신이 절대적인 초보자라면 입력할 수도 있다). 아래와 같다.
    어떤 의미의 오류와 비교적 긴 유명에 대해서도 깊은 사과의 뜻을 표합니다.
    우리가 무엇을 했는지, 왜 그랬는지 알아보자.
  • 우리는 페이지 맨 위에 고정된 내비게이션 표시줄에 내비게이션 요소가 있다.
  • <nav> 요소에는 두 개의 하위 요소가 있습니다.
  • 저희는 회사 표지를 놓는 데 사용되는 <a> 라벨이 있습니다.
  • nav의 두 번째 아이는 우리 메뉴의 용기<div class="nav__menucontainer">입니다.

  • 메뉴 컨테이너에는 두 명의 아이가 있습니다.
  • <div class="nav__listcontainer" tabindex="0"> 메뉴 목록과 햄버거 아이콘 포함
  • <a id="hamburger" href="#navmenu" title="menu" class="nav__hamburger"> 전환 메뉴
  • 의 열기 상태
  • 마지막으로 고려해야 할 요소는 목록 용기의 인접 동급이다.메뉴 닫기 상태를 전환하는 닫기 아이콘
  • 입니다.

    NOTE: Do not forget the tabindex="0" on <div class="nav__listcontainer">


    스타일시트(설명 포함)


    이제 CSS 스타일을 살펴보겠습니다.
    /* most part is for styling, and you can safely ignore it */
    /* comments are placed wherever necessary */
    
    *,
    *::before,
    *::after {
      box-sizing: border-box;
    }
    
    body {
      background-color: #f5f5f5;
      margin: 0;
      font-family: sans-serif;
    }
    
    a {
      text-decoration: none;
    }
    
    /* --- You will know what this is --- */
    #blobSvg {
      max-width: 520px;
    }
    
    .nav {
      display: flex;
      justify-content: space-between;
      align-items: center;
      position: fixed;
      width: 100%;
      background-color: rgba(51, 51, 51, 0.85);
      color: #efefef;
      z-index: 5;
      padding: 1rem;
    }
    
    .nav__logo {
      text-decoration: none;
      color: inherit;
      font-weight: 700;
      font-size: 1.5rem;
    }
    
    .nav__menucontainer {
      position: relative;
    }
    
    .nav__hamburger {
      color: inherit;
      min-width: 32px;
      min-height: 32px;
      transition: opacity 80ms linear;
      /* hiding the hamburger icon on large screen sizes */
      display: none;
      opacity: 0;
    }
    
    .nav__hamburgerclose {
      color: inherit;
      position: absolute;
      top: 0;
      min-width: 32px;
      min-height: 32px;
      transition: opacity 150ms linear;
      /*   hiding the close icon and... */
      display: none;
      opacity: 0;
      z-index: -1; /* pushing it behind the hamburger icon so that hamburger icon can be clicked */
    }
    
    .nav__menu {
      padding: 0;
      margin: 0;
      list-style: none;
      display: flex;
      flex-wrap: wrap;
      font-size: 0.95rem;
      font-weight: 500;
    }
    
    .nav__item {
      margin-right: 1rem;
    }
    
    .nav__link {
      color: inherit;
      text-decoration: none;
      width: 100%;
    }
    
    .nav__link:hover,
    .nav__link:focus-visible {
      box-shadow: 0 4px 0 -1px #a2e718;
    }
    
    이것은 우리 메뉴의 데스크톱 버전이다.그것은 큰 화면 크기에 적용된다.그럼, 이제 한 매체의 조회로 응답합시다.

    스타일시트(작은 화면용)


    보기:
    /* ----- smaller screen sizes ----- */
    @media (max-width: 520px) {
      .nav__hamburger {
        /* making the hamburger icon visible on smaller screen sizes */
        display: flex;
        opacity: 1;
      }
    
      .nav__menu {
        /* move menu offscreen */
        opacity: 0;
        position: fixed;
        visibility: none;
        top: -1000px;
    
        /* just some styles */
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
        color: #25310c;
        box-shadow: 0 0 30px rgba(0, 0, 0, 0.19);
        border: 2px solid rgba(255, 255, 255, 0.2); /* part of glass morphism effect */
        border-radius: 2rem 0 2rem 2rem;
        background: rgba(255, 255, 255, 1);
      }
    
      /* uncomment the line below to activate on hover. */
      /*   .nav__listcontainer:hover .nav__menu, */
      .nav__listcontainer:focus .nav__menu,
      .nav__listcontainer:focus-within .nav__menu {
        position: absolute;
        visibility: visible;
        opacity: 1;
        top: 2rem;
        right: 1.5rem;
      }
    
      /*   if the browser supports backdrop-filter property, 
      then add it (for the glass morphism effect) */
      @supports (backdrop-filter: blur(10px)) {
        /* uncomment the line below to activate on hover. */
        /*     .nav__listcontainer:hover .nav__menu, */
        .nav__listcontainer:focus .nav__menu,
        .nav__listcontainer:focus-within .nav__menu {
          background: rgba(255, 255, 255, 0.7);
          backdrop-filter: blur(10px);
        }
      }
    
      .nav__item {
        margin-right: 0;
        padding: 0.5rem 1.5rem;
      }
    
      .nav__link:hover,
      .nav__link:focus {
        opacity: 0.8;
        color: #121212;
      }
    
      /*  uncomment the line below to activate on hover. */
      /* NOTE: Hover is not recommended, it will have side effects on this */
      /*   .nav__listcontainer:hover .nav__hamburger, */
      .nav__listcontainer:focus .nav__hamburger,
      .nav__listcontainer:focus-within .nav__hamburger {
        opacity: 0;
        z-index: -1;
      }
    
      /* uncomment the line below to activate on hover. */
      /* NOTE: Hover is not recommended, it will have side effects on this */
      /*   .nav__listcontainer:hover + .nav__hamburgerclose, */
      .nav__listcontainer:focus + .nav__hamburgerclose,
      .nav__listcontainer:focus-within + .nav__hamburgerclose {
        display: flex;
        opacity: 1;
        z-index: 1;
      }
    }
    
    천천히천천히.나는 그것이 매우 비슷해 보인다는 것을 알고 있지만, 이것은 SCSS로 작성된 것이고, 컴파일된 CSS는 초보자의 우호적인 해석에 사용된다는 것을 알아야 한다.

    Tip: Copy-paste all these styles


    그럼 여기 무슨 일이 일어났어요?


    물론 그곳에서 많은 일이 일어났지만, 첫 번째 논평에서 말했듯이, 대부분을 안심하고 소홀히 할 수 있다.
    내가 처음에 말했듯이 우리는 이동 부분에 주목할 것이다.
    그럼 여기서부터 시작합시다. @media (max-width: 520px) {
  • 메뉴 크기에 맞는 중단점 선택
  • 처음에 우리는 스크린display: none; opacity: 0;에 햄버거와 문을 닫는 아이콘을 숨겼다.그러나 작은 스크린에서 우리는 햄버거 아이콘을 보고 싶다.그래서 우리는 이렇게 했다. display: flex; opacity: 1;
  • 다음에 메뉴 목록(<ul>)을 화면에서 옮겨서 잘못 클릭하지 않도록 하겠습니다.이런 (<ul>스타일 없이 검사opacity: 0; position: fixed; visibility: none; top: -1000px;해 보세요.

  • 이제 주요 기능은 다음과 같습니다.
  • .nav__listcontainer:focus .nav__menu, .nav__listcontainer:focus-within .nav__menu {: 이 선택기는listcontainer에 초점이 있거나 이 원소 중의 어떤 원소에 초점이 있으면 .nav__menu에 스타일 설정을 한다고 합니다.우리는 단지 표시하기 전에 화면 밖으로 옮겼을 뿐이다. .nav__menu
  • 에서 .nav__listcontainer:focus .nav__hamburger, .nav__listcontainer:focus-within .nav__hamburger { 선택기로 이동: 이 선택기는listcontainer에 초점이 있거나 이 요소의 모든 요소에 초점이 있으면 .nav__hamburger에 스타일 설정을 실행합니다.우리는 햄버거 아이콘을 여기에 숨겼다.
  • 현재 후속 선택기의 기능을 알 수 있기를 바랍니다.네, 네 말이 맞아요.닫기 아이콘을 표시하고 z-index: 1;을 사용하여 를 클릭할 수 있도록 앞에 가져옵니다.
  • @supports (backdrop-filter: blur(10px)) {: 이 (@supports (...)규칙은 브라우저가 괄호() 내의 속성을 지원하는지 확인합니다.지원되는 경우 스타일이 적용됩니다.여기에 흰색 배경을 부분적으로 추가했고 유리 변형 효과에 약간 모호한 효과를 추가했다.
  • 이제 .nav_item.nav_item:hover, .nav:focus만 남았다.너는 그것들을 소홀히 할 수 있다. 왜냐하면 그것들은 단지 약간의 스타일만 추가했기 때문이다.
  • 등등...선택기가 하나 더 있습니다#blobSvg.이 요소를 가져오려면 blobs.app로 이동하여 원하는 blob을 만들고 SVG 코드를 복사하여 붙여넣기.container에 다음과 같이 하십시오.
  • <nav>
       ...
    </nav>
    
    <div class="container">
      <!--   svg is placed to see the glass morphism effect -->
      <svg viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100%" id="blobSvg">
        <defs>
          <linearGradient id="gradient" x1="0%" y1="0%" x2="0%" y2="100%">
            <stop offset="0%" style="stop-color: rgb(255, 95, 109);"></stop>
            <stop offset="100%" style="stop-color: rgb(255, 195, 113);"></stop>
          </linearGradient>
        </defs>
        <path id="blob" d="M365,286Q374,322,337.5,330.5Q301,339,275.5,410.5Q250,482,221.5,415Q193,348,154.5,337.5Q116,327,82,288.5Q48,
                           250,57,197Q66,144,98,93.5Q130,43,190,76Q250,109,304,86Q358,63,361,123.5Q364,184,360,217Q356,250,365,286Z" fill="url(#gradient)"></path>
      </svg>
    </div>
    
    그런 다음 아래에 제시된 <div class="container"> 스타일을 끝(또는 맨 위의 위치)에 붙여 넣습니다.
    .container {
      display: flex;
      flex-direction: column;
      align-items: center; /* centering elements inside .container */
      width: 100%;
      max-width: 720px;
      margin: 0 auto; /* centering container within its parent */
      padding: 2em 1.5em;
      background: #fff;
    }
    
    이렇게!너와 내가 방금 세운 반응과 유리 변형 효과를 검사해 봐라.
    다음 과정에서 문제가 발생하면 다음 코드 펜을 보거나 링크드린이나 트위터 (@gautamtiwari003) 에서 저를 핑하십시오.

    결론


    HTML과 CSS는 과소평가되었지만 강력했다.그들은 심지어 자바스크립트와 관련이 없는 상황에서 많은 마력을 발휘할 수 있다(오해하지 마라, 나는 JS를 좋아한다)❤).
    나는 네가 오늘 나와 함께 공부하고 뭔가를 세울 수 있기를 바란다.

    Keep coding imperfectly. Keep coding experimentally.


    읽어주셔서 감사합니다.

    좋은 웹페이지 즐겨찾기