๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป ํ”„๋กœ์ ํŠธ/๐Ÿ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๐Ÿ 

[Spring] (IntelliJ, vue.js) Vue๋ฅผ ์ด์šฉํ•˜์—ฌ! ์•„์ด์ฝ˜์„ ๋ˆ„๋ฅด๋ฉด ํ™”๋ฉด ์Šฌ๋ผ์ด๋”ฉ ๋งŒ๋“ค๊ธฐ.

by ._.sori 2025. 8. 3.

 

 

์•„์ด์ฝ˜์„ ๋ˆ„๋ฅด๋ฉด,
ํ™”๋ฉด์ด ์Šฌ๋ผ์ด๋”ฉ๋˜์–ด
๋‚˜ํƒ€๋‚˜๋„๋ก ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค.

 

 

 


1.  ํ™”๋ฉด ๋™์ž‘๊ณผ ์ „์ฒด์ฝ”๋“œ
2. ์ฝ”๋“œ ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•œ ๊ฐ„๋žตํ•œ ์„ค๋ช…
3. RightSide.vue ์ž‘์„ฑ
4. MainView.vue ์ž‘์„ฑ
5. ํ๋ฆ„


 

 

 

 

1.  ํ™”๋ฉด ๋™์ž‘๊ณผ ์ „์ฒด์ฝ”๋“œ

  • ๋™์ž‘ํ™”๋ฉด

 

 

 

  • ์ „์ฒด์ฝ”๋“œ

[MainView.vue์— ๋ฉ”์ธํ™”๋ฉด ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.]

 

Register-Web-frontend/src/views at master · hyeong-ing/Register-Web-frontend

์ผ๋ฐ˜ ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ, ๊ฐ„ํŽธ ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. WebStrom์œผ๋กœ Vue.js์™€ Vite๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. - hyeong-ing/Register-Web-frontend

github.com

 

 

[RightSide.vue์— ์˜ค๋ฅธ์ชฝ ์‚ฌ์ด๋“œ ๋ทฐ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค.]

 

Register-Web-frontend/src/components/mainview/RightSide.vue at master · hyeong-ing/Register-Web-frontend

์ผ๋ฐ˜ ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ, ๊ฐ„ํŽธ ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. WebStrom์œผ๋กœ Vue.js์™€ Vite๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. - hyeong-ing/Register-Web-frontend

github.com

 

 

 

 


 

 

 

 

2.  ์ฝ”๋“œ ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•œ ๊ฐ„๋žตํ•œ ์„ค๋ช…

์–ด์ฐŒ์ €์ฐŒ ๋งŒ๋“ค๊ธด ํ–ˆ์ง€๋งŒ... ์ฝ”๋“œ ๋ณต๋ถ™ํ•˜๊ณ  ์ด๊ฒƒ์ €๊ฒƒ ์‹œ๋„ํ•˜๋ฉฐ ์–ป์–ด ๊ฑธ๋ฆฌ๋‹ค ๋ณด๋‹ˆ, ์ €๋„ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋”๋ผ๊ณ ์š”. ๊ทธ๋ž˜์„œ ์ œ ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด(?) ์งง๋ง‰ํ•œ ์„ค๋ช…์„ ์ ์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

 

 

 


 

 

 

 

 

3.  RightSide.vue ์ž‘์„ฑ

  • ํ™”๋ฉด ์˜ˆ์‹œ๋ณธ

 

 

 

  • ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค๊นŒ?

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์Šฌ๋ผ์ด๋”ฉ ๋ชจ์…˜๋งŒ ์„ค๋ช…ํ•˜๊ณ , ํ…์ŠคํŠธ ์ปฌ๋Ÿฌ ๋ณ€ํ™”๋Š” ๋‹ค์Œ ํฌ์ŠคํŒ…์— ์ ๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์•„์ด์ฝ˜์„ ๋ˆ„๋ฅด๋ฉด ์˜ค๋ฅธ์ชฝ ์‚ฌ์ด๋“œ์—์„œ ์ž‘์€ ๋ทฐ๊ฐ€ ๋‚˜์˜ค๋„๋ก ํ•  ๊ฒƒ์ด๋‹ค.MainView์— ๋งŒ๋“ค๊ธฐ๋ณด๋‹ค ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋”ฐ๋กœ vue๋ฅผ ๋งŒ๋“ค์–ด ์ž‘์„ฑํ–ˆ๋‹ค.SIGN IN์€ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์—ฐ๋™๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  GUEST ORDER INQURY๋Š” ๋น„ํšŒ์› ์กฐํšŒ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค. 

 

์•„๋ž˜์— ์žˆ๋Š” KAKAO์™€ ์ „ํ™”๋ฒˆํ˜ธ๋Š” ํ˜•์‹์ ์œผ๋กœ ๋„ฃ์€ ๊ฒƒ์ด๊ณ , ์•„์ง ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ• ์ง€ ์ƒ๊ฐํ•˜์ง„ ์•Š์•˜๋‹ค. ์ฒœ์ฒœํžˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์–ด๋–ป๊ฒŒ ํ• ์ง€ ๊ฒฐ์ •ํ•  ๊ฒƒ์ด๋‹ค. (์‹ค์ œ๋กœ ์šด์˜๋˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹ˆ๋ผ์„œ, ์—ฐ๋™๋  ์ด์œ ๊ฐ€ ์—†๊ธฐ์— ์–ด๋–ป๊ฒŒ ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค.)

 

ํ”„๋ก ํŠธ๋ฅผ ๋Œ€์ถฉํ•  ์ƒ๊ฐ์€ ์—†๋‹ค. ์–ด์ฐจํ”ผ ํ•˜๋Š”๊ฑฐ ์ œ๋Œ€๋กœ ํ•˜์ž๋Š” ์ฃผ์˜๋ผ์„œ ๋‚˜์˜ ์ทจํ–ฅ์„ ์ตœ๋Œ€ํ•œ ๋‹ด์•„๋ณผ ๊ฒƒ์ด๋‹ค. ๊ฐ ๋ฒ„ํŠผ์— ์ปค์„œ๋ฅผ ๋Œ€๋ฉด ์ปฌ๋Ÿฌ๊ฐ€ ๋ฐ”๋€Œ๋ฉฐ ์•ฝ๊ฐ„์˜ ์›€์ง์ž„์„ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ด๊ณ , ์‚ฌ์†Œํ•œ ๋””ํ…Œ์ผ๋„ ์‹ ๊ฒฝ์“ธ ๊ฒƒ์ด๋‹ค.

 

์ฐธ๊ณ ๋กœ Vue๋ฅผ ์ฒ˜์Œ ๋‹ค๋ค„๋ด์„œ ์ž˜ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๋ชจ์Šต์„ ์œ„ํ•ด ์ฝ”๋“œ ์ฐพ๊ณ  ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ํ™•์ธํ•˜๋ฉฐ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์–ด์„œ ์ฝ”๋“œ ํšจ์œจ์ด ๋–จ์–ด์ง€๊ฑฐ๋‚˜ ๊ฐ„๊ฒฐํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

 

 

 

 

  • template ์ฝ”๋“œ
<div class="right-side" :class="{ open: open }">
    <div class="right-side-content">
      <p class="change-color" @click="$router.push('/simpleRegister')" style="cursor:pointer;"> SIGN UP </p>
      <p class="change-color" style="cursor:pointer;"> SIGN IN </p>
      <p class="change-color" style="cursor:pointer;"> GUEST ORDER INQUIRY </p>
      <div class="right-side-bottom">
        <p> KAKAO</p>
        <p> consultation call_ </p>
        <p> 02 - 0000 - 0000 </p>
      </div>
    </div>
  </div>
๊ฐ€์žฅ ์ƒ์œ„ ํด๋ž˜์Šค๋Š” right-side ํด๋ž˜์Šค๋กœ ์ด ํด๋ž˜์Šค์— ์›€์ง์ž„์„ ๋ถ€์—ฌํ•  ๊ฒƒ์ด๋‹ค. ์›€์ง์ž„์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด v-bind๋ฅผ ์จ์•ผํ•œ๋‹ค. v-bind๋Š” ๋™์  ๋ฐ”์ธ๋”ฉ์œผ๋กœ ์–ด๋–ค ์ƒํƒœ์˜ ๊ฐ’์ด ๋ณ€ํ™”ํ•˜๋ฉด ํ™”๋ฉด์ด ์ž๋™์„ ๋ฐ”๋€๋‹ค๋Š” ๊ฑธ ์˜๋ฏธํ•œ๋‹ค. :open์ด v-bind์˜ ์ถ•์•ฝํ˜•์ด๋‹ค. ์›๋ž˜๋Š” v-bind: class--- ํ˜•ํƒœ์ง€๋งŒ, ์ถ•์•ฝํ˜•์œผ๋กœ ๋งŽ์ด ์“ฐ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. open: open์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์„ค์ •ํ•˜๋Š” ์ด๋ฆ„์ด๋ฉฐ, ์™ผ์ชฝ open์€ ํด๋ž˜์Šค๋ช… ์˜ค๋ฅธ์ชฝ open์€ ๋ณ€์ˆ˜๋ช…์ด๋‹ค. script๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, open์— true ๊ฐ’์ด ์™€์•ผ ๋ณด์ด๋„๋ก ์†์„ฑ์„ ์„ค์ •ํ•  ๊ฒƒ์ด๋‹ค.

๋ฐฉ๊ธˆ open์€ ํด๋ž˜์Šค๋ช…์ด๋ผ๊ณ  ์ ์—ˆ๋Š”๋ฐ, ์ด๊ฒŒ ๋ฌด์Šจ ๋ง์ธ์ง€ ์„ค๋ช…ํ•  ๊ฒƒ์ด๋‹ค. open์˜ ๊ฐ’์ด false๋ฉด ํด๋ž˜์Šค ์ด๋ฆ„์€ ๊ทธ๋ƒฅ right-side๊ฐ€ ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ open์— true๊ฐ’์ด ์˜ค๋ฉด right-side open์ด ๋œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํด๋ž˜์Šค ๋ชฉ๋ก์— ๋‘ ๊ฐœ์˜ ํด๋ž˜์Šค๊ฐ€ ์žˆ๊ฒŒ๋œ๋‹ค. ์•„๋ž˜ vue ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋‚จ๊ฒจ๋†“์„ํ…Œ๋‹ˆ ์ฒœ์ฒœํžˆ ์ฝ์–ด๋ณด๋ฉด ๋„์›€์ด ๋  ๊ฒƒ์ด๋‹ค. (๋ฌผ๋ก  ์ฝ๊ธฐ ์‹ซ๊ฒŒ ์ƒ๊ฒผ๋‹ค!)

๊ทธ ๋‹ค์Œ์€ ์ฝ”๋“œ๋Š” ๊ฐ„๋‹จํ•˜๋‹ค. ํ…์ŠคํŠธ์— ์ปค์„œ๋ฅผ ๋Œ€๋ฉด ์ƒ‰์ด ๋ณ€ํ•˜๋„๋ก ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด class = "chage.color"๋กœ ๋™์ผ์‹œ์ผฐ๋‹ค.(์ด ๋ถ€๋ถ„์€ ๋‹ค์Œ ํฌ์ŠคํŠธ๋กœ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค) ๊ทธ๋ฆฌ๊ณ  ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋ฅผ ํ˜„์žฌ ์‹œ์ ์—๋Š” ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, @click์„ ํ†ตํ•ด ํ…์ŠคํŠธ ํด๋ฆญ์‹œ simpleRegister ๊ฒฝ๋กœ๋กœ ๊ฐ€๋„๋ก ์„ค์ •ํ–ˆ๋‹ค.

 

 

- v-bind

 

Vue.js

Vue.js - ํ”„๋กœ๊ทธ๋ž˜์‹œ๋ธŒ ์ž๋ฐ”์ŠคํŠธ๋ฆฝํŠธ ํ”„๋ ˆ์ž„์›Œํฌ

ko.vuejs.org

 

Vue.js

Vue.js - The Progressive JavaScript Framework

vuejs.org

 

 

  • style ์ฝ”๋“œ 
.right-side {
  position: fixed;
  top: 0;
  right: 0;
  width:22vw;
  height: 100vh;
  background: #9f9f9f;
  border-left: 4px solid #020202;
  border-radius: 10px;
  box-shadow: -4px 0 12px rgba(0, 0, 0, 0.23);
  transform: translateX(100%);
  transition: transform 0.4s cubic-bezier(.71,1.7,.58,.98);
  z-index: 1000;
}

.right-side.open {
  transform: translateX(0%);
}
position์€ fixed๋กœ ํ™”๋ฉด์„ ๊ณ ์ •์‹œ์ผฐ๋‹ค. ๋‚˜์ค‘์— ๋ฉ”์ธํ™”๋ฉด์— ๊ฒŒ์‹œ๊ธ€์ด ๋„˜์ณ์„œ ์Šคํฌ๋กค์„ ๋‚ด๋ ค๋„, ์š”์†Œ๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ๊ธธ ๋ฐ”๋ž˜์„œ ์ผ๋‹จ ๊ทธ๋ ‡๊ฒŒ ์„ค์ •ํ•ด๋‘๊ธด ํ–ˆ๋‹ค.

right-side๋Š” main-view์˜ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. width๋Š” ๋„ˆ๋น„ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. 22vw๋กœ ์ƒ์œ„ ํด๋ž˜์Šค์˜ 22% ์ •๋„ ์ฐจ์ง€ ํ•˜๋Š” ๋น„์œจ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ main-view์— ์„ค์ •ํ•œ ํ™”๋ฉด ํฌ๊ธฐ์˜ 22%๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. height๋Š” ๋†’์ด๋กœ 100vh๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋†’์ด์™€ ๋˜‘๊ฐ™์ด ์œ ์ง€๋˜๋„๋ก ํ–ˆ๋‹ค.

background๋Š” ๋ฐฐ๊ฒฝ์ƒ‰์ด๋œ๋‹ค. ์ด ์ฝ”๋“œ์— ์—†์ง€๋งŒ color๋Š” ํ…์ŠคํŠธ ์ƒ‰์ด ๋œ๋‹ค.

border์€ ํ…Œ๋‘๋ฆฌ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์™ผ์ชฝ ํ…Œ๋‘๋ฆฌ๋งŒ ์„ค์ •ํ•˜๊ณ  ์‹ถ์–ด์„œ border-left๋ฅผ ์ ์—ˆ๋‹ค. solid๋Š” ํ…Œ๋‘๋ฆฌ ์„ ์˜ ํ˜•ํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์•„๋ž˜ ์‚ฌ์ง„์œผ๋กœ ๋‹ค์–‘ํ•œ ์„ ์˜ ํ˜•ํƒœ์˜ ์ด๋ฆ„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 4px๋Š” ๊ตต๊ธฐ๋ฅผ ์„ค์ •ํ•˜๋ฉฐ #์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋Š” ์ปฌ๋Ÿฌ ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค.

box-shadow๋Š” ์ด ํ”„๋ ˆ์ž„์˜ ๊ทธ๋ฆผ์ž๋ฅผ ์„ค์ •ํ–ˆ๋‹ค. -4px๋Š” x์ถ•, 0์€ y์ถ•, 12px๋Š” blur๊ฐ€ ๋œ๋‹ค. rgba๋Š” ์ปฌ๋Ÿฌ๋ฅผ ์„ค์ •ํ•œ๋‹ค.

ํ˜„์žฌ right-side ํด๋ž˜์Šค๋Š” true๋ผ๋Š” ๊ฐ’์ด ์˜ค๊ธฐ ์ „์—๋Š” ๋ณด์ด๋ฉด ์•ˆ๋œ๋‹ค. ๊ทธ๋ž˜์„œ transform: translateX(100%);๋กœ ์„ค์ •ํ–ˆ๋‹ค. transform์€ ์„ค์ •๋œ ํ˜„์žฌ ์œ„์น˜์—์„œ ์›€์ง์ด๋„๋ก ํ•œ๋‹ค. translateX(100%)๋Š” ํ˜„์žฌ ์œ„์น˜์—์„œ x์ถ• ๋์— ๋„๋‹ฌํ•˜์—ฌ right-side๊ฐ€ ์•ˆ๋ณด์ด๋„๋ก ์„ค์ •ํ–ˆ๋‹ค. ์ด ๊ฐ’์„ 90%๋กœ ์กฐ์ •ํ•˜๋ฉด ์•ฝ๊ฐ„์€ ๋ณด์ด๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

transition์€ ์›€์ง์ž„์„ ์ฃผ๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด transition: transform 0.4s cubic-bezier(.71,1.7,.58,.98);์€  transform์ด 0.4์ดˆ ๋™์•ˆ cubic-bezier ์ฆ‰, ํŠน์ • ๊ณก์„ ์„ ๋”ฐ๋ผ ๋ณ€ํ™”ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ์•„๋ž˜ ๋„์›€์ด ๋  ์‚ฌ์ดํŠธ๋ฅผ ๋„ฃ์–ด๋‘๊ฒ ๋‹ค. ์•ž์˜ .71๊ณผ 1.7์€ ์ถœ๋ฐœํ•  ๋•Œ ๋ชจ์…˜์ด๊ณ , .58๊ณผ .98์€ ๋„์ฐฉํ•  ๋•Œ์˜ ๋ชจ์…˜์ด๋‹ค. ์ด ๋ชจ์…˜์€ ์ง์ ‘ ์„ค์ •ํ•œ ์›€์ง์ž„์ด๋‹ค. transition: transform 0.4s linear; ํ˜น์€ transition: transform 0.4s ease-out; ๋“ฑ ์ด๋ฏธ ์„ค์ •๋˜์–ด ์žˆ๋Š” ์›€์ง์ž„๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

right-side.open
์„ ๋ณด๋ฉด open ํด๋ž˜์Šค๊ฐ€ ๋ถ™์„ ์‹œ, x์ถ•์ด 0%๊ฐ€ ๋˜์–ด ํ•ด๋‹น ๋ทฐ๊ฐ€ ์™„์ „ํžˆ ๋ณด์ด๋„๋ก ์„ค์ •ํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์„ค์ •ํ•œ transition์œผ๋กœ ํ™”๋ฉด์˜ x์ถ•์ด ์›€์ง์ด๋„๋ก ์„ค์ •ํ•œ ๊ฒƒ์ด๋‹ค.

๋‹ค์‹œ right-side ํด๋ž˜์Šค๋กœ ๋Œ์•„๊ฐ€๋ฉด z-index๊ฐ€ ์žˆ๋‹ค. ์ด๊ฑด ์ง€๊ธˆ ์–ด๋–ค ์ฝ”๋“œ์ธ์ง€ ํฌ๊ฒŒ ๋ˆˆ์œผ๋กœ ๋ณด์ด์ง„ ์•Š๋Š”๋‹ค. ๋งŒ์•ฝ ๋ฉ”์ธํ™”๋ฉด์— ์—ฌ๋Ÿฌ ์š”์†Œ๋“ค์ด ์Œ“์ด๊ฒŒ ๋˜๋ฉด right-side ๋ทฐ๊ฐ€ ๊ทธ ์š”์†Œ๋“ค์— ๊ฐ€๋ ค์ € ์•ˆ๋ณด์ผ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๊ฑธ ๋ฐฉ์ง€ํ•˜๊ณ ์ž ๋‹ค๋ฅธ ์š”์†Œ๋“ค๋ณด๋‹ค ์•ž์— ๋ณด์ด๋„๋ก ์„ค์ •ํ•ด๋‘” ๊ฒƒ์ด๋‹ค.

 

์ถœ์ฒ˜: https://www.w3.org/wiki/Css/Training/borders

 

 

- cubic-bezier

 

cubic-bezier.com

 

cubic-bezier.com

 

 

.right-side-content {
  padding: 40px 32px  32px 32px;
  font-size: 1.0rem;
  color: #020202;
  height: 100%;
  display: flex;
  gap: 7px;
  flex-direction: column;
}
padding์€ ์—ฌ๋ฐฑ ๊ณต๊ฐ„์„ ์„ค์ •ํ•œ ๊ฒƒ์ด๋‹ค. ์—ฌ๋ฐฑ์„ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ  right-side-content์˜ ๋„ˆ๋น„์™€ ํฌ๊ธฐ๋ฅผ ์ •ํ•œ ๋’ค, top๊ณผ left๋กœ ์œ„์น˜๋ฅผ ์กฐ์ •ํ•ด๋„ ๋˜์ง€๋งŒ ๊ทธ๊ฑด ์œ„์—์„œ ํ–ˆ์œผ๋‹ˆ ์ด๋ฒˆ์—” padding์„ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ์œ„์น˜๋ฅผ ์„ค์ •ํ–ˆ๋‹ค. 

gap์€ right-side-content์— ๋“ค์–ด๊ฐˆ ๊ฐ ์š”์†Œ๋“ค์ด ์–ผ๋งˆ๋‚˜ ๋–จ์–ด์ ธ์žˆ์œผ๋ฉด ์ข‹์„์ง€ ์„ค์ •ํ•œ ๊ฒƒ์ด๋‹ค. flex-direction์€ ์–ด๋–ค ๋ฐฉํ–ฅ์œผ๋กœ ์š”์†Œ๋“ค์„ ๋ฐฐ์น˜ํ• ๊ฑด์ง€ ์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. column์€ ์œ„์—์„œ ์•„๋ž˜๋กœ ์š”์†Œ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.(ํ•œ ์ค„์— ํ•˜๋‚˜์˜ ์š”์†Œ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค) ๊ทธ๋Ÿฌ๋ฉด ๊ฐ€๋กœ๋กœ ์š”์†Œ๋“ค์„ ๋ฐฐ์น˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด? row ๊ฐ’์„ ์ฃผ๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์š”์†Œ๊ฐ€ ์ขŒ์—์„œ ์šฐ๋กœ ๋ฐฐ์น˜๋œ๋‹ค.

 

 

 

 

  • script ์ฝ”๋“œ
<script>
export default {
  name: 'RightSide',
  props: {
    open: {
      type: Boolean,
      required: true,
    }
  }
}
</script>
export๋Š” ์ด ํŒŒ์ผ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋‚ด๋ณด๋‚ด๋ผ๋Š” ์˜๋ฏธ๋กœ, default๋ฅผ ๋ถ™์—ฌ ์ด ํŒŒ์ผ์˜ ๋Œ€ํ‘œ export๋Š” ํ•˜๋‚˜๋งŒ ์ง€์ •๋œ๋‹ค๊ณ  ๋ง๋ถ™์˜€๋‹ค. ์ด ์ปดํฌ๋„ŒํŠธ์˜ ์ด๋ฆ„์€ RightSide๋กœ ์ง€์ •ํ–ˆ๋‹ค.

props๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ด ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์†์„ฑ์ด๋‹ค. open์ด๋ผ๋Š” ์ด๋ฆ„์˜ props๋Š” ๋ฐ˜๋“œ์‹œ Boolean ํƒ€์ž…์˜ true ๊ฐ’์„ ๋ฐ›์•„์•ผ ํ•œ๋‹ค๊ณ  ๋ช…์‹œํ–ˆ๋‹ค. open์— true ๊ฐ’์ด ์˜ค๋ฉด transform: translateX(0%)์ด ์ ์šฉ๋˜์–ด ํŒจ๋„์ด ๋ณด์ด๊ฒŒ ๋œ๋‹ค.

 

 

 

 


 

 

 

 

 

4.  MainView.vue ์ž‘์„ฑ

 

  • template ์ฝ”๋“œ
<template>
  <div class="main-view">
  
    /* ํ•˜ํŠธ ์•„์ด์ฝ˜ ์ด๋ฏธ์ง€ */
    <img src="../assets/leftHeartBar.png" alt="์™ผ์ชฝํ•˜ํŠธ" class="left-sideBar" :class="{isLeftSideOpen: isLeftSideOpen}"
          @click="toggleLeft" :style="heartLeftStyle"/>
    <LeftSide :open="isLeftSideOpen" />   
    <img src="../assets/rightHeartBar.png" alt="์˜ค๋ฅธ์ชฝํ•˜ํŠธ" class="right-sideBar" :class="{isRightSideOpen : isRightSideOpen}"
         @click="toggleRight" :style="heartRightStyle"/>
    <RightSide :open="isRightSideOpen" />     
         
    <div class="center-icon">
      <img src="../assets/wings.png" alt="๋‚ ๊ฐœ์•„์ด์ฝ˜" class="wings" @click="$router.push('/main')" style="cursor:pointer;" />
      <div class="shop-name">
        <p class="change-color01" @click="$router.push('/main')"> sori </p>
      </div>
    </div>
    
  </div>
</template>

 

main-view์— ํ•˜ํŠธ ์•„์ด์ฝ˜์„ ์ด๋ฏธ์ง€๋กœ ๋“ฑ๋กํ–ˆ๋‹ค.  src์— ๊ฒฝ๋กœ๋ฅผ ์ ์—ˆ๋‹ค. ํ•ด๋‹น ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๋Š” src ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— ์žˆ๋Š” assets ๋””๋ ‰ํ† ๋ฆฌ์— ํ•ด๋‹น ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๋‹ค. "@/assets/leftHearBar.png"๋ผ๊ณ  ํ•ด๋„ ๊ดœ์ฐฎ๊ณ , "../assets/leftHeartBar.png"๋ผ๊ณ  ํ•ด๋„ ์ข‹๋‹ค. alt๋Š” ๊ตณ์ด ์ ์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ๋‹ค. ํ•ด๋‹น ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์—†์„ ๋•Œ ํ…์ŠคํŠธ๋กœ ๋Œ€์ฒดํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š”๋ฐ, ๊นจ์ง„ ํŒŒ์ผ์ด ์–ด๋–ค ์ด๋ฏธ์ง€์˜€๋Š”์ง€ ์•Œ๊ธฐ ์‰ฝ๊ฒŒ ํ•ด์ฃผ์ง€๋งŒ ์ ์ง€ ์•Š์•„๋„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š”๋ฐ ๋ฌธ์ œ๋Š” ์—†๋‹ค.  right-sideBar ํด๋ž˜์Šค์—๋Š” ์œ„์น˜๊ฐ’์ด ๋“ค์–ด๊ฐˆ ๊ฒƒ์ด๋‹ค.

ํ˜„์žฌ ์„ค์ •ํ•ด์•ผํ•  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ MainView๊ฐ€ RightView์— ์žˆ๋Š” :open ๊ฐ’์„ ์ „๋‹ฌํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์•„์ด์ฝ˜์ด ๋ˆŒ๋ฆฌ๋ฉด false๋กœ ์„ค์ •๋œ open์˜ ๊ฐ’์„ true๋กœ ๋ฐ˜์ „์‹œ์ผœ์•ผํ•œ๋‹ค. ๊ทธ ๊ฐ’์„ ๋ฐ˜์ „์‹œ์ผœ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„์ด์ฝ˜์— isRightSideOpen์ด๋ž€ ๋™์  ๋ฐ”์ธ๋”ฉ์„ ์คฌ๋‹ค. 

๊ทธ๋Ÿฌ๋ฉด isRightSideOpen์˜ ๊ฐ’์„ RightSide๋กœ ์ „๋‹ฌํ•ด์•ผํ•˜๋Š”๋ฐ, RightSide์˜ props์—๋Š” open์ด๋ž€ ๊ฐ’ ๋ฐ–์— ์—†๋‹ค. ๊ทธ๋ž˜์„œ <RightSide :open="isRightSideOpen"/> ์ถ”๊ฐ€ํ•˜์—ฌ MainView์—์„œ isRightSideOpen์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ open์ด๋ผ๋Š” props๋กœ RightSide.vue์— ์ „๋‹ฌํ•œ๋‹ค๊ณ  ๋ช…์‹œํ–ˆ๋‹ค. (isRightSideOpen์— true๋‚˜ false์˜ ๊ฐ’์„ ๋‹ด๊ณ , isRightSideOpen์€ RightSide.vue์— ์žˆ๋Š” open์— ์ž์‹ ์˜ ๊ฐ’์„ ์ „๋‹ฌํ–ˆ๋‹ค๋Š” ๊ฒƒ.) ๋’ค์— ํ๋ฆ„์— ๋Œ€ํ•ด์„œ ๋”์šฑ ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…ํ•ด๋†“๊ฒ ๋‹ค.

@Click="toggleRight"๋Š” ์ด๋ฏธ์ง€๋ฅผ ํด๋ฆญ ์‹œ MainView์—์„œ toggleRight( ) ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ–ˆ๋‹ค.

:style="heartRightStyle"์€ ์ด ์ด๋ฏธ์ง€์˜ ์Šคํƒ€์ผ์„ ๋™์ ์œผ๋กœ ๋ฐ”๊พธ๋„๋ก ํ–ˆ๋‹ค. ์˜ค๋ฅธ์ชฝ ํŒจ๋„์ด ๋‚˜์˜ค๋ฉด ์•„์ด์ฝ˜๋„ ๊ทธ ์œ„์น˜์— ๋งž์ถฐ ์›€์ง์—ฌ์•ผํ•œ๋‹ค. ์„ค์ •์„ ์•ˆํ•˜๋ฉด ํŒจ๋„ ์œ„์— ์•„์ด์ฝ˜์ด ์žˆ๋Š” ์ƒํ™ฉ์ธ ์—ฐ์ถœ๋œ๋‹ค. ๊ทธ๊ฑธ ๋ฐฉ์ง€ํ•˜๊ณ ์ž ์ด๋ฏธ ์„ค์ •๋œ style์„ ๋™์ ์œผ๋กœ ๋ฐ”๊พธ๋„๋ก ๋งŒ๋“ค๊ฒƒ์ด๋‹ค. ์ด ๋ถ€๋ถ„์€ script์˜ computed ์†์„ฑ์—์„œ ํ•ด๊ฒฐํ•  ๊ฒƒ์ด๋‹ค.

์ด๋ฏธ์ง€ ์œ„์น˜

 

 

 

  • style
.right-sideBar {
  position: fixed;
  top: 50%;
  transform: translateY(-50%);
  width: 53px;
  height: 48px;
  cursor: pointer;
  z-index: 1100;
  transition:  transform 0.15s cubic-bezier(.71, 1.7, .58, .98);
}

 

top: 50%๋Š” ์ „์ฒด์˜ ๋ฐ˜์ ˆ์— ์œ„์น˜ํ•˜๊ฒ ๋‹ค๋Š” ์ด์•ผ๊ธฐ์ธ๋ฐ, ์‹ค์ œ๋กœ top: 50%๋ฅผ ํ•ด๋ณด๋ฉด ๊ฐ€์šด๋ฐ์— ์œ„์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ์ด์œ ๊ฐ€์šด๋ฐ๋ฅผ ๋”ฑ ์ฐ์œผ๋ฉด, ๋”ฑ ์ฐ์€ ์ง€์ ์— ๋‚ด ์š”์†Œ์˜ ์™ผ์ชฝ ์œ„ ๋ชจ์„œ๋ฆฌ๊ฐ€ ๋‹ฟ๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ์น˜์šฐ์นœ ๋ชจ์–‘์œผ๋กœ ์กด์žฌํ•œ๋‹ค. ๊ทธ๊ฑธ ๋ฐ”๋กœ ์žก๊ธฐ ์œ„ํ•ด transform: translateY(-50%)๋ฅผ ํ•ด์ค€๋‹ค.

 

 

- ์™œ ์ค‘์•™์— ์•ˆ์˜ค๋Š”๊ฐ€

 

[Vue.js] transform: translate๋กœ ํ…์ŠคํŠธ ์ค‘์•™์— ๋ฐฐ์น˜ํ•˜๊ธฐ.

์ฐธ๊ณ ๋กœ Vue.js์— ๋Œ€ํ•ด์„œ ์ž˜ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.์•„๋ฌด๊ฑฐ๋‚˜ ๋ง‰ ํ•ด๋ณด๋Š” ์ค‘์ด๊ณ  ์˜ณ์€ ์ •๋ณด์ธ์ง€ ์ €๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค! ๋…ธ๋ž€ ๋ฐฐ๊ฒฝ๊นŒ์ง€ ๋งŒ๋“ค์—ˆ๋‹ค.์ด๋ฒˆ์—” ํ…์ŠคํŠธ๋ฅผ ์ค‘์•™์— ๋ฐฐ์น˜ํ•ด๋ณด์ž! 1. ์ „์ฒด์ฝ”๋“œ MainView.vue์— ํ…์ŠคํŠธ๋ฅผ ๋งŒ

post-this.tistory.com

 

 

 

 

  • script
import RightSide from "@/components/mainview/RightSide.vue";
import LeftSide from "@/components/mainview/LeftSide.vue";
์•„๊นŒ RightSide.vue์—์„œ export ํ–ˆ๋˜ ๊ฒƒ์„ MainView์—์„œ import ํ•˜๊ฒ ๋‹ค. ์ด๋•Œ ์œ„์น˜๋„ ํ•จ๊ป˜ ์ ์–ด์ค˜์•ผํ•œ๋‹ค. import ๋’ค์— ๋ถ™์€ RightSide๋Š” MainView์—์„œ "@/components/mainview/RightSide.vue"; ์ด ๊ฒฝ๋กœ์— ์œ„์น˜ํ•œ RightSide.vue์˜ ์ด๋ฆ„์„ ์ ์€ ๊ฒƒ์ด๋‹ค. ๊ผญ vue์˜ ์ด๋ฆ„๊ณผ ๊ฐ™์ง€ ์•Š์•„๋„ ๋œ๋‹ค. (ํ•˜์ง€๋งŒ ๋‚จ๋“ค์ด ๋ดค์„ ๋•Œ ์–ด๋–ค ํŒŒ์ผ์ธ์ง€ ์•Œ๊ธฐ ์‰ฝ๋„๋ก ์ด๋ฆ„์„ ์ ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค)

์ด ๋‹ค์Œ ์ฝ”๋“œ๋ถ€ํ„ฐ๋Š” export default ์•ˆ์— ์ ์€ ์ฝ”๋“œ์ด๋‹ค.

 

 

  name: 'MainView',
  components: {RightSide, LeftSide},
๋ฐฉ๊ธˆ ๋ฐ›์•„์˜จ ์ปดํฌ๋„ŒํŠธ๋ฅผ MainView์—์„œ ์“ธ ์ˆ˜ ์žˆ๋„๋ก ๋“ฑ๋กํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  MainView๋ฅผ exportํ•œ ์ด์œ ๋Š” (์—ฌ๊ธฐ ์ฝ”๋“œ์— ์—†์ง€๋งŒ export default ์•ˆ์— ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด์žˆ์Œ) ๋ผ์šฐํ„ฐ๋กœ ๋ฐ›์•„์„œ ํ™”๋ฉด์— ๋ณด์—ฌ์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๊ฒƒ์ด๋‹ค.

 

 

data() {
    return {
      isRightSideOpen: false,
      isLeftSideOpen: false,
    }
  },
๋ฐ›์•„์˜จ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐ’์„ false๋กœ ์„ค์ •ํ•˜์—ฌ, ํ‰์†Œ์—๋Š” ๋ณด์ด์ง€ ์•Š๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค. (right-side.open์€ transform: translateX(0%)์„ ์„ค์ •ํ–ˆ๊ณ  true ๊ฐ’์„ ๋ฐ›์•„์•ผ ์ด ์ฝ”๋“œ๊ฐ€ ํ™œ์„ฑํ™”๋œ๋‹ค)

 

 

computed: {
    heartRightStyle() {
      if (this.isRightSideOpen === true) {
        return{ 
          right: '23vw',
          transition: 'right 0.4s cubic-bezier(.71, 1.7, .58, .98)'
        }
      }else { 
        return {
          right: '32px',
          transition: 'right 0.4s cubic-bezier(.71, 1.7, .58, .98)'
        }
      }
    },
* template ์ฝ”๋“œ *
<img src="../assets/rightHeartBar.png" alt="์˜ค๋ฅธ์ชฝํ•˜ํŠธ" class="right-sideBar" :class="{isRightSideOpen : isRightSideOpen}"
         @click="toggleRight" :style="heartRightStyle"/>
template์—์„œ :style์„ heartRightStyle๋กœ ์ •์˜ํ–ˆ๋‹ค.

this.isRightSideOpen์€ data์— ์ ์€ isRightSideOpen์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. this๋ฅผ ์ ์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์™ธ๋ถ€,๋‚ด๋ถ€, ํ•จ์ˆ˜ ๋“ฑ ์—ฌ๋Ÿฌ ๊ณณ์— ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ์กด์žฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ง€๊ธˆ ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ ๋‚ด๋ถ€์—์„œ ์ ‘๊ทผํ•  ๋•Œ, ํ•ญ์ƒ this.๋ฅผ ๋ถ™์—ฌ์•ผํ•œ๋‹ค.

this.isRightSideOpen์ด true์ด๋ฉด ์˜ค๋ฅธ์ชฝ์—์„œ 23vw๋งŒํผ ํ•˜ํŠธ ์•„์ด์ฝ˜์ด ์›€์ง์ด๋„๋ก ์„ค์ •ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  else(false)๋ฉด 32px์— ์œ„์น˜ํ•˜๋„๋ก ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ซํ˜€์žˆ์œผ๋ฉด ์˜ค๋ฅธ์ชฝ์—์„œ 32px ๋–จ์–ด์ง„ ์œ„์น˜์— ํ•˜ํŠธ ์•„์ด์ฝ˜์ด ์žˆ๋‹ค. ์›€์ง์ž„์€ ํŒจ๋„์˜ ์›€์ง์ž„๊ณผ ๋˜‘๊ฐ™์ด ์ ์—ˆ๋‹ค. 

 

 

 methods: {
    toggleRight() {
      this.isRightSideOpen = !this.isRightSideOpen;
    },
    toggleLeft() {
      this.isLeftSideOpen = !this.isLeftSideOpen;
    },
  },
}
* template ์ฝ”๋“œ *
<img src="../assets/rightHeartBar.png" alt="์˜ค๋ฅธ์ชฝํ•˜ํŠธ" class="right-sideBar" :class="{isRightSideOpen : isRightSideOpen}"
         @click="toggleRight" :style="heartRightStyle"/>
toggleRight๋Š” ์•„์ด์ฝ˜์„ ํด๋ฆญํ–ˆ์„๋•Œ ๋ฐœ์ƒํ•  ๋ฉ”์„œ๋“œ์ด๋‹ค. toggleRight์—์„œ isRightSideOpen์˜ ๊ฐ’์„ ๋ฐ˜์ „์‹œํ‚ฌ ๊ฒƒ์ด๋‹ค. isRightSideOpen์˜ ๊ธฐ๋ณธ๊ฐ’์€ false์˜€๊ณ , ํด๋ฆญํ•˜๋ฉด false์˜ ๊ฐ’์ด ๋ฐ˜์ „๋˜์–ด true๋กœ ๋ฐ”๋€๋‹ค. ๊ทธ๋Ÿฌ๋ฉด isRightSideOpen์˜ ๊ฐ’์€ true๊ฐ€ ๋œ๋‹ค. ๋‹ค์‹œ ํด๋ฆญ์„ ํ•˜๊ฒŒ ๋˜๋ฉด true์˜ ๊ฐ’์ด ๋ฐ˜์ „๋˜์–ด false๊ฐ€ ๋œ๋‹ค. 

 

 

 

 


 

 

 

5. ํ๋ฆ„

  • RightSide.vue
* template *
<div class="right-side" :class="{ open: open }">
open์ด๋ž€ ์ด๋ฆ„์œผ๋กœ ๊ฐ’์„ ๋ฐ›์•„ ๋™์  ๋ฐ”์ธ๋”ฉ์„ ์ค„ ๊ฒƒ์ด๋‹ค. ์–ด๋–ค ์›€์ง์ž„์„ ์ค„๊นŒ?
* style *
.right-side.open {
  transform: translateX(0%);
}
์›๋ž˜์˜ ๊ฐ’์—์„œ x์ถ•์„ 0%๋กœ ์˜ฎ๊ธด ์›€์ง์ž„์„ ์ค€๋‹ค.
* script *
props: {
    open: {
      type: Boolean,
      required: true,
    }
๋ถ€๋ชจ ํด๋ž˜์Šค์ธ MainView.vue์—๊ฒŒ ๊ฐ’์„ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ์ •์˜ํ•œ๋‹ค.

 

 

 

  • MainView.vue
* template *
<img src="../assets/rightHeartBar.png" alt="์˜ค๋ฅธ์ชฝํ•˜ํŠธ" class="right-sideBar" :class="{isRightSideOpen: isRightSideOpen}"
         @click="toggleRight" :style="heartRightStyle"/>
    <RightSide :open="isRightSideOpen" />

 

:class="{isRightSideOpen: isRightSideOpen}
: ์–ด๋–ค ์ƒํƒœ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ํ™”๋ฉด์ด ์ž๋™์„ ํ•จ๊ป˜ ๋ฐ”๋€Œ๋Š”๊ฒŒ ๋™์  ๋ฐ”์ธ๋”ฉ. ์•„์ด์ฝ˜์ด ๋ˆŒ๋ฆฌ๋ฉด false ๊ฐ’์ด true๋กœ, true ๊ฐ’์ด false๋กœ ๋ฐ”๋€Œ๋„๋ก ํ•œ๋‹ค.

<RightSide :open="isRightSideOpen" />
: isRightSideOpen์„ RightSide์˜ props์— ์žˆ๋Š” open์œผ๋กœ ๊ฐ’์ด ๊ฐ€๋„๋ก ์„ค์ •ํ–ˆ๋‹ค.

@click="toggleRight"
: ํด๋ฆญํ•˜๋ฉด toggleRight ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

:style="heartRightStyle"
: ์•„์ด์ฝ˜์˜ ์œ„์น˜๋ฅผ ํŒจ๋„์˜ ์›€์ง์ž„์— ๋งž์ถฐ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด ์„ค์ •ํ–ˆ๋‹ค.

 

data() {
    return {
      isRightSideOpen: false,
      isLeftSideOpen: false,
    }
  },
data( )์— ์ปดํฌ๋„ŒํŠธ ๊ฐ’ ์„ค์ •ํ–ˆ๋‹ค.

 

* script *

methods: {
    toggleRight() {
      this.isRightSideOpen = !this.isRightSideOpen;
    },
๋ฒ„ํŠผ์ด ๋ˆŒ๋ฆฌ๋ฉด isRightSideOpen ๊ฐ’์ด ๋ฐ˜์ „๋œ๋‹ค. ์—ฌ๊ธฐ์„œ true๋กœ ๊ฐ’์ด ๋ณ€ํ•˜๋ฉด ๊ทธ ๊ฐ’์ด open์—๊ฒŒ ์ „๋‹ฌ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์•„๊นŒ .open์— ์„ค์ •ํ–ˆ๋˜ x์ถ•์˜ ๋ณ€๋™์ด ๋‚˜ํƒ€๋‚œ๋‹ค.

 

  computed: {
    heartRightStyle() {
      if (this.isRightSideOpen === true) {
        return{
          right: '23vw',
          transition: 'right 0.4s cubic-bezier(.71, 1.7, .58, .98)'
        }
      }else {
        return {
          right: '32px',
          transition: 'right 0.4s cubic-bezier(.71, 1.7, .58, .98)'
        }
      }
    },
์•„์ด์ฝ˜๋„ ๊ฐ™์ด ์›€์ง์ธ๋‹ค. isRightSideOpen์ด true์˜ ๊ฐ’์ด๋ฉด 23vw๋งŒํผ ์›€์ง์ธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  false ๊ฐ’์ด ๋˜๋ฉด 32px ์œ„์น˜๋กœ ๋‹ค์‹œ ์›€์ง์ธ๋‹ค.