Vue.js 3.0 기본 레이아웃 - (4) Navigation Drawer 슬라이딩 에니메이션
08 Apr 2022 | Vue.js cssNavigation Drawer Slide 애니메이션
기존 코드에서 아래 부분에 애니메이션이 추가되었습니다.
<script setup> let isDrawerOpened = false; const toggleDrawer = () => { isDrawerOpened = !isDrawerOpened; if (isDrawerOpened) { document.getElementById("drawer").style.width = "200px"; } else { document.getElementById("drawer").style.width = "0px"; } }; </script> #drawer { display: flex; flex-direction: column; width: 0px; height: 100vh; background: darkcyan; color: white; transition: 0.2s; overflow-x: hidden; }
전체 코드
<template> <div id="wrapper"> <!-- Navigation Drawer --> <div id="drawer"> <div id="drawer-header">SnowDeer Drawer</div> <div id="drawer-content"> <div id="drawer-menu-item"> <i class="bi bi-house"></i> <span>Home</span> </div> <div id="drawer-menu-item"> <i class="bi bi-gift"></i> <span>Hello</span> </div> <div id="drawer-menu-item"> <i class="bi bi-info-square"></i> <span>About</span> </div> </div> </div> <!-- Main --> <div id="main"> <!-- AppBar --> <div id="appbar"> <div id="hamburg-menu" class="h-center v-center" @click="toggleDrawer"> <i class="bi bi-list"></i> </div> <div id="title" class="v-center">AppBar Title</div> <div id="action-items"> <i class="action-item bi bi-heart"></i> <i class="action-item bi bi-three-dots-vertical"></i> </div> </div> <!-- Content --> <div id="content"></div> </div> </div> </template> <script setup> let isDrawerOpened = false; const toggleDrawer = () => { isDrawerOpened = !isDrawerOpened; if (isDrawerOpened) { document.getElementById("drawer").style.width = "200px"; } else { document.getElementById("drawer").style.width = "0px"; } }; </script> <style> .h-center { display: flex; flex-direction: row; justify-content: center; } .v-center { display: flex; flex-direction: row; align-items: center; } #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; } #wrapper { display: -webkit-flex; display: flex; flex-flow: row wrap; justify-content: flex-start; width: 100vw; height: 100vh; margin: 0 auto; } #main { flex: 1; flex-flow: column wrap; justify-content: flex-start; background: #bbe4e9; transition: margin-left 0.5s; } #appbar { display: flex; flex-direction: row; height: 48px; background: #edb1f1; } #hamburg-menu { width: 48px; height: 48px; background: #d59bf6; cursor: pointer; } #title { flex: 1; height: 48px; } #action-items { display: flex; flex-direction: row; height: 48px; background: #d59bf6; } .action-item { width: 48px; height: 48px; display: flex; justify-content: center; align-items: center; cursor: pointer; } #drawer { display: flex; flex-direction: column; width: 0px; height: 100vh; background: darkcyan; color: white; transition: 0.2s; overflow-x: hidden; } #drawer-header { width: 100%; height: 100px; padding: 20px; background: teal; } #drawer-content { flex: 1; } #drawer-menu-item { padding: 16px; cursor: pointer; } #drawer-menu-item:hover { color: black; background: turquoise; } </style>