ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 체크박스를 이용해 슬라이드 메뉴 만들기(뒷 배경 블러효과)
    CSS 2023. 2. 13. 13:46

    javascript없이 CSS만 사용합니다!

     

    기본적인 틀은,

    웹 브라우저의 화면에 보이지않는 곳(화면 바깥)에 메뉴를 만들어 놓은 후

    체크박스의 체크 여부에 따라 보이는 화면에 들어오고 나가는 개념입니다.

     

     

     

    <HTML>

    <input type="checkbox" id="openMenu">
    <label for="openMenu" id="openMenuLabel">
    	<span></span>
    	<span></span>
    	<span></span>
    </label>
    
    
    <div id="showMenu">
    	<div id="menuButtons">
    		<label for="openMenu" id="closeMenuLabel">
    			<span></span>
    			<span></span>
    		</label>
    	</div>
    	<div id="testText">
    		<p>메뉴 1</p>
    		<p>메뉴 2</p>
    		<p>메뉴 3</p>
    		<p>메뉴 4</p>
    	</div>
    </div>

    썸네일 상에 보이는 네비게이션 바는 다루지 않습니다!

    메뉴, 메뉴를 보여주는 버튼, 메뉴를 닫는 버튼

    크게 3가지로 나뉘어집니다.

     

     

     

    <CSS> -1 // 기존 체크박스 없애기

    #openMenu{
      display: none;
    }

     

     

     

    <CSS> -2 // 메뉴오픈 버튼의 영역 및 위치속성

    #openMenuLabel {
      display: block;
      position: absolute;
      right: 24px;
      top: 16px;
      width: 34px;
      height: 22px;
      cursor: pointer;
    }

    위치와 크기는 저의 기호에 맞게 작성하였습니다.

    버튼에 마우스를 올릴 시 마우스 커서를 바꾸어 사용자의 가독성을 높여줍니다.

     

     

     

    <CSS> -3 // 메뉴오픈 버튼(3선)의 선 굵기, 색상 등 공통속성

    #openMenuLabel span {
      display: block;
      position: absolute;
      width: 100%;
      height: 3.5px;
      border-radius: 30px;
      background: rgb(193, 193, 193);
    }

    색상과 크기 등 span 태그 요소들의 공통적인 속성을 잡아줍니다.

     

     

     

    <CSS> -4 // 각 선의 위치 속성

    #openMenuLabel span:nth-child(1) {
      top: 0;
    }
    
    #openMenuLabel span:nth-child(2) {
      top: 50%;
      transform: translateY(-50%);
    }
    
    #openMenuLabel span:nth-child(3) {
      bottom: 0;
    }

    위, 아래 선은 0을 주어 label의 영역에 벗어나지 않는 선에서 최하단, 최상단에 위치시킵니다.

    다만 두번 째인 가운데 선에 50%만 주게되면 span요소의 상단이 label 중간 영역에 맞춰 위치하게 됩니다.

    하여 translateY(-50%)함수를 사용하게되면,

    요소의 높이에 맞춰 -50%만큼 이동합니다.

    즉 본인의 높이가 100px이라고 가정한다면 50px만큼 이동한다는 느낌으로 이해하면 됩니다.

     

     

     

    <CSS> -5 // 열릴 메뉴의 속성

    #showMenu {
      background-color: rgb(193, 193, 193);
      position: fixed;
      top:0;
      right: -300px;
      width: 300px;
      height: 100%;
      transition: .6s;
    }

    position: fixed 속성을 활용하여 메뉴의 기본 위치를 화면 바깥에 위치시켜 줍니다.

     

     

     

    <CSS> -6 // 버튼 클릭 시 보여질 메뉴의 속성

    #openMenu:checked ~ #showMenu {
      background-color: rgb(193, 193, 193);
      top:0;
      right: 0px;
      width: 300px;
      height: 100%;
      z-index: 3;
    }

    버튼이 클릭되면(체크박스가 체크되면) 메뉴의 위치를 이동시켜줍니다.

    이 때 기본 속성에서 right로 잡아주었기 때문에 동일하게 right로 유지하지 않으면 애니메이션 속성이 적용되지 않습니다.

    더불어 z-index: 3을 주었는데 이는 뒤에 나올 블러효과를 사용하기 위함입니다.

     

     

     

    <CSS> -7 // 블러처리를 위한 기본 속성

    #openMenuLabel::after {
      content: "";
      position: fixed;
      left: 0;
      top: 0;
      display: none;
      width: 100%;
      height: 100%;
      background-color: rgba(0, 0, 0, 0.05);
      backdrop-filter: blur(2px);
    }

    메뉴가 열렸을 때 메뉴 뒤의 배경을 블러처기 해주기 위함입니다.

    label에 가상요소를 생성하여 줍니다.

    생성 후 블러효과를 주고, display: none을 주어 평소에는 화면에 보이지 않도록 해줍니다.

     

     

     

    <CSS> -8 // 메뉴가 열렸을 때 블러처리 영역 속성

    #openMenu:checked ~ #openMenuLabel::after {
      display: inline;
      z-index: 2;
    }

    display: inline 속성으로 블러효과를 보이게 하고, z-index: 2를 줍니다.

    메뉴에 3, 블러효과에 2를 주어 뒷 배경을 블러효과로 덮은 후 그 위에 메뉴를 덮어줍니다.

     

     

     

    <CSS> -9 //  메뉴안에 위치할 버튼(들)의 영역 속성

    #menuButtons {
      position: absolute;
      display: block;
      width: 100%;
    }

    닫기 버튼 외 다른 버튼이 추가 될 때 버튼들을 묶어줄 수 있는 영역을 만들어 줍니다.

     

     

     

    <CSS> -10 // 닫기 버튼의 위치 속성

    #closeMenuLabel {
      display: block;
      position: absolute;
      right: 16px;
      top: 16px;
      width: 34px;
      height: 22px;
      cursor: pointer;
    }

    메뉴 오픈 시 닫기 버튼의 위치를 잡아주고, 마우스 커서를 올렸을 시 가독성을 높이기 위해 'cursor: pointer'를 줍니다.

     

     

     

    <CSS> -11 // 닫기 버튼의 선 굵기, 색상 등 공통속성

    #closeMenuLabel span {
      display: block;
      position: absolute;
      width: 100%;
      height: 3.5px;
      border-radius: 30px;
      background: rgb(0, 0, 0);
    }

    우선 닫기 버튼의 굵기, 색상, 위치 등 공통적인 속성만 잡아줍니다.

     

     

     

    <CSS> -12 // 각 선의 위치(기울기)속성

    #closeMenuLabel span:nth-child(1){
      top: 50%;
      transform: translateY(-50%) rotate(45deg);
    }
    
    #closeMenuLabel span:nth-child(2){
      bottom: 50%;
      transform: translateY(50%) rotate(-45deg);
    }

    nth:-child()속성을 이용해 각 스팬태그 하나씩을 선택하여 기울기와 위치를 잡아주면 됩니다.

     

     

     

    <CSS> -13 // test

    #testText {
      position: absolute;
      top: 50px;
      width: 100%;
    }

    'CSS' 카테고리의 다른 글

    체크박스를 이용해 토글 스위치(ON/OFF)만들기  (0) 2022.12.23

    댓글

Designed by Tistory.