250x250
Notice
Recent Posts
Recent Comments
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

진스

웹에서 다크 모드로 토글 (css 변수 이용) 본문

JavaScript

웹에서 다크 모드로 토글 (css 변수 이용)

입방정 2021. 4. 14. 11:49
728x90

다크모드

css에서도 변수를 선언하고 사용할 수 있다는 사실!
이를 이용해서 다크모드 기능을 만들어보자
(디폴트가 다크모드)

 

1. toggle 버튼 생성

📃 html 파일

<head>

    <!-- ... -->

    <link rel="stylesheet" href="./style.css">

  </head>

  <body>

    <!-- ... -->

    <label class="switch">

      <input id="toggleBtn" type="checkbox" checked>

      <span class="slider round"></span>   

    </label>

    <div class="flexbox">

        <img src="./bjm.jpg" alt="사진">

        <div class="boxwrap">

            <h3>BaeJM</h3>

            <p>신입 프론트 엔드 / 직장인</p>

            <div class="popular">

                <p>연결 21</p>

                <p>팔로잉 8</p>

                <p>팔로워 5</p>

            </div>

            <ul class="favorite">

                <li>JavaScript</li>

                <li>jQuery</li>

                <li>MySQL</li>

                <li>Vue</li>

                <li>Ajax</li>

                <li>HTML5</li>

                <li>Git</li>

                <li>Css</li>

            </ul>

        </div>

    </div>

 

    <!-- ... -->

    <script src="mode.js"></script> 

    <script src="main.js"></script>

    

 

📃 css 파일

 /* 토글버튼 */

.switch {

    positionabsolute;

    top20px;

    right20px;

    displayinline-block;

    width60px;

    height34px;

  }

  

  .switch input { 

    opacity0;

    width0;

    height0;

  }

  

  .slider {

    positionabsolute;

    cursorpointer;

    top0;

    left0;

    right0;

    bottom0;

    background-color#ccc;

    -webkit-transition.4s;

    transition.4s;

  }

  

  .slider:before {

    positionabsolute;

    content"";

    height26px;

    width26px;

    left4px;

    bottom4px;

    background-colorwhite;

    -webkit-transition.4s;

    transition.4s;

  }

  

  input:checked + .slider {

    background-color#2196F3;

  }

  

  input:focus + .slider {

    box-shadow0 0 1px #2196F3;

  }

  

  input:checked + .slider:before {

    -webkit-transformtranslateX(26px);

    -ms-transformtranslateX(26px);

    transformtranslateX(26px);

  }

  

  /* Rounded sliders */

  .slider.round {

    border-radius34px;

  }

  

  .slider.round:before {

    border-radius50%;

  }

 

/* 기본값 설정 */

  :root {

    --background#1b1d21;

    --backgrounds#3c3b3b;

    --input#24272b;

    --inputTxt#b6b7b8;

    --card#2c3035;

    --infoTxt#e5e6e7;

    --liBgColor:#252525;

    --repo#393c42;

    --border#646568;

  }

body { background-color: var(--background); /* ... */ }

 

/* transition 효과 주기 */

* { transition: background-color 1s, color 0.1s, border 0.5s; }

 

2. js파일에 컬러 값 선언

📃 mode.js 파일

 

const darkColors = {

    background: '#1b1d21',

    backgrounds: '#3c3b3b',

    input: '#24272b',

    inputTxt: '#b6b7b8',

    card: '#2c3035',

    infoTxt: '#e5e6e7',

    liTxt:'#fff',

    liBgColor:'#252525',

    repo: '#393c42',

    border: '#646568'

}

const whiteColors = {

    background: '#ffffff',

    backgrounds: '#e8e8e8',

    input: '#f3f3f3',

    inputTxt: '#000000',

    card: '#ffffff',

    infoTxt: '#000000',

    liBgColor:'#9c9c9c',

    liTxt:'#fff',

    repo: '#f3f3f3',

    border: '#393c42'

}

 

3. js 이벤트 등록

📃 main.js 파일

 

// 컬러 모드

const setColorType = (colors) =>{

    for (const [key, value] of Object.entries(colors)){

        document.documentElement.style.setProperty(`--${key}`, `${value}`);

    }

}

 

const addEventListenerToToggle = ($toggleBtn) => {

    $toggleBtn.addEventListener("click", (e) => {

        const isDarkMode = e.target.checked

        isDarkMode ? setColorType(darkColors) : setColorType(whiteColors)

    })

}

 

// IIFE 이용 초기화 함수 선언

const basicInit = (() => {

    const $toggleBtn = document.getElementById("toggleBtn");

    addEventListenerToToggle($toggleBtn)

})()

index.zip
0.12MB
압축 해제 파일

 

728x90
Comments