Vue 3 - ๊ฐ๋จํ ํดํ ๊ธฐ๋ฅ ๊ตฌํ
Vuetify๋ฅผ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ๋ณต์กํ ๋ ์ด์์์ผ๋ก ๊ตฌ์ฑ๋ ํ๋ฉด์ด๋ content๊ฐ ๋ง์ ์ฆ, ์คํฌ๋กคํด์ผ ํ๋ ํ๋ฉด์์ v-menu, v-tooltip ๊ฐ์ด ๋ณ๋ hidden content๊ฐ ์ด๋ฒคํธ(hover)์ ๋ฐ๋ผ show/hide ๋๋ ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ ์ ๋๋ก ํ์๋์ง ์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ด๋ด๋ ‘attach’ property๋ก ์ผ๋ถ ํด๊ฒฐ์ด ๋๋ ๊ฒฝ์ฐ๋ ์์ง๋ง ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ๋ ์์ด์ ๋์์ผ๋ก ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ๊ฑฐ๋ ํ์ ์ ์ง์ ๊ตฌํ์ ํ๊ธฐ๋ ํ๋๋ฐ ์ฌํํ๊ฒ ๋์ํ๋ tooltip์ ํ๋ฒ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ vue component์์ template ์์ญ์ ๋๋ค.
|
|
๋ง์ฐ์ค ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํฌ ํ๊ฒ์ด ๋๋ slot์์ญ์ ๊ฐ์ธ๋ target element์ tooltip content๊ฐ ํ์๋๋ content element๋ฅผ ๊ตฌ๋ถํ๊ณ ์ด๋ฅผ ๊ฐ์ธ๋ container๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ์ฌ๊ธฐ์ target element ๋ง์ฐ์ค ์ด๋ฒคํธ์ ๋ฐ๋ผ tooltip์ visibility๋ฅผ ์กฐ์ ํ๋๋ฐ, ์ด๋ v-show (display is none), v-if (not mounted)๋ก ์ ์ดํ๋ ๋ฐฉ๋ฒ, ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ style์ display๋ opacity ๊ฐ์ผ๋ก ์ ์ด๋ฅผ ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ opacity๋ฅผ ์ฌ์ฉํ์ฌ ํฌ๋ช
๋๋ฅผ ์กฐ์ ํด์ ๋ณด์ด๊ณ ์ฌ๋ผ์ง๋ ๋ฐฉ์์ ํํ๊ฒ ์ต๋๋ค.
์ด์ ๋ tooltip ์์น๋ฅผ target ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฐ์ ํด์ผ ํ๋๋ฐ ํนํ, top์ด๋ left ์์น์ ํ์ํ๋ ๊ฒฝ์ฐ traget element์ content element๊ฐ ๊ฒน์น์ง ์๋๋ก ํ๊ธฐ ์ํด์ content element์ width๋ height ๋งํผ offset ์ฐธ์กฐ๊ฐ ํ์ํฉ๋๋ค. ๋ง์ฝ content element๊ฐ rendered ์ํ๊ฐ ์๋๋ ํด๋น ๊ฐ์ ์ฝ์ ๊ฒฝ์ฐ์๋ ์์น๋ ํฌ๊ธฐ ๊ฐ์ด ์ ๋๋ก ๋ฐํ์ด ๋์ง ์๊ธฐ ๋๋ฌธ์, vue component๊ฐ mounted ๋ ์์ ์ content element๋ rendered ๋ ์ํ๊ฐ ๋ ์ ์๋๋ก display ์ํ๊ฐ ๋ณ๊ฒฝ๋์ง ์๋๋ก ํฉ๋๋ค.
๋ง์ฝ opacity ๋์ ๋ค๋ฅธ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์ ํ ๋์๋ vue component์์ updated ์ด๋ฒคํธ ์ content element์ rendered ์ํ๋ฅผ ํ์ธ ํ ์์น ๊ฐ์ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ ์ธ์๋ ์์ต๋๋ค.
|
|
props์ ํดํ์ด ์์นํ ๊ณณ์ ๊ฒฐ์ ํ๋ top, left, right, bottom๋ฅผ ๊ฐ์ง๋๋ค. ๊ทธ ์ธ content์ font-size๋ margin์ ๋ณ๋๋ก ์กฐ์ ํ ์ ์๋๋ก ํ์ต๋๋ค.
๊ธฐ๋ณธ์ ์ธ ๋์์ธ target์ mouseover ์ด๋ฒคํธ๊ฐ ๋ฐ์ ์ target element์ ์์น์ content element์ ํฌ๊ธฐ ๊ฐ์ ๊ฐ์ ธ์์ ์์น๋ฅผ ๊ณ์ฐํ๊ณ ์ง์ ํฉ๋๋ค.
์์น ๊ณ์ฐ์ ๊ฒฝ์ฐ rendered ๋ ์์ ์์ ํ๋ฒ๋ง ํด๋ ๋ฉ๋๋ค. ๋ค๋ง ๋ธ๋ผ์ฐ์ ธ ๋ด๋ถ window ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ target์ ์์น๋ content element ํฌ๊ธฐ๋ ๋ณ๊ฒฝ์ด ๋ ์ ์์ผ๋ฏ๋ก ๊ฐฑ์ ์ด ํ์ํฉ๋๋ค. ์ด๋ฅผ ์ํด์ window resize ์ด๋ฒคํธ ์ ๊ฐฑ์ ์ ์ํํ๋ฉด ๋๋๋ฐ window ํฌ๊ธฐ๊ฐ ์กฐ๊ธ๋ง ๋ณ๊ฒฝ๋๋๋ผ๋ resize ์ด๋ฒคํธ๊ฐ ์์ญ ~ ์๋ฐฑ๋ฒ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์, ์ด๋ฒคํธ๋ฅผ debouncing์ด๋ throttling ๋๋๋ก ํ์ฌ ์ค๋ณต์ ์ต๋ํ ์ค์ฌ์ฃผ๋ ๊ฒ์ด ์ข์ต๋๋ค. ํ์ง๋ง ์ค์ ๋ก tootip์ ์ ์ฉํ๋ค๊ณ ํ ์ tooltip๋ฅผ ํ์ํ๋ ์ด๋ฒคํธ๋ ์๋์ ์ผ๋ก ๋ง์ง ์์ ๊ฒ์ด๋ฏ๋ก ์ค๋ณต์ฌ๋ถ ์๊ด์์ด ๋งค๋ฒ ๊ณ์ฐํ๋ ๊ฒ์ผ๋ก ํ๊ฒ ์ต๋๋ค.
|
|
์คํ์ผ ์ง์ ์ ํน๋ณํ ๊ฒ์ ์๊ณ slot์ ๋ง์ถ๊ธฐ ์ํด์ container์ display๋ฅผ inline-block์ผ๋ก ์ง์ ํ์ต๋๋ค. ๋ค๋ฅธ ์ ํ์ผ๋ก ์ ํํ๋ ๊ฒฝ์ฐ ํ์๋๋ ์์น๊ฐ ๋ฌ๋ผ์ง ์ ์๊ธฐ ๋๋ฌธ์ ์ด ๊ฒฝ์ฐ tooltip-content์ position์ fixed๋ก ์ ํํด์ผ ํ ์ ์์ต๋๋ค. transition์ opacity๋ฅผ ์ง์ ํ์๊ธฐ ๋๋ฌธ์ fade in/out ํจ๊ณผ๊ฐ ์ ์ฉ๋์ด ํ์๋๊ฒ ๋ฉ๋๋ค.
|
|
๊ทธ๋ผ ๊ฐ๋จํ ํ ์คํธ ํ์ด์ง๋ฅผ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.
ํ๊ฒ์ด ๋๋ ํ๊ทธ ์์ฒด๋ฅผ ๊ฐ์ธ๊ฑฐ๋ ํ๊ทธ ๋ด์ content๋ง ํ๊ฒ์ผ๋ก ํ์ฌ ๊ฐ๋จํ๊ฒ tooltip ๋ฉ์์ง๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
์ด๋ฆ์ ๊ฒฝ์ฐ vTooltip์ผ๋ก ์ง์ ํ๋๋ฐ ์ต๊ทผ vue 3 ์ ๋ฐ์ดํธ ๋ณ๊ฒฝ์ ์ด ์์๋์ง tooltip(๋์๋ฌธ์ ๊ตฌ๋ถ์์ด)์ ์ด๋ฆ์ ๊ทธ๋๋ก ์ฐ๋ ๊ฒฝ์ฐ ์ ์ ์๋ ์ด์ ๋ก ์๋ฌ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ (์ด์ ์ ๋ฐ์ํ์ง ์๋ ์๋ฌ๋ผ ์ถ๊ฐ ํ์ธ์ด ํ์) ๋ถ๋์ดํ๊ฒ ์ ๋์ด๋ฅผ ๋ถ์์ต๋๋ค.
์๋ gif ์ด๋ฏธ์ง๋ฅผ ๋ณด๋ฉด ๋์ํ๋ ํดํ ์์ ๋ฅผ ํ์ธ ํ ์ ์์ต๋๋ค.