Popover API
- ๋ฅ์ง
- Development
- ๋ถ๋ฅ
- html/css
- ๋ฑ๋ก์ผ
- 2024-12-15 14:56:25
- ์กฐํ์
- 172
- ์ข์์
- 0
<dialog/>์๋ฆฌ๋จผํธ์ ๋น์ทํ ์ฑ๊ฒฉ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ํน์ ์๋ฆฌ๋จผํธ์ 1:1 ์ํธ์์ฉํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋๋ฉฐ ์์ญ์ ๋ฐฉํดํ์ง ์๋๊ฑฐ ๊ฐ๋ค.
์์ง ์ ๋๋ก ํ์ฉํ์ง ๋ชปํด๋ด์ ์ ๋๋ก ํ์
๋ชปํ์ง๋ง ๊ธฐ๋กํ๋ฉด์ ํ์ตํ ์์ ์ด๋ค.
Google IO ์์์ ์๊ฐ
์ ์ฒด์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ค์ด ๋น๋์ค๋ก ์๊ฐ๋์ด ์๋ค.
๋๋ต์ ์ธ ์์
<button type="button" popovertarget="message">๋ฉ์์ง</button>
<div popover id="message">
message
</div>
์๋ฌด๋ฐ ์ต์ ์์ด ์ฌ์ฉํ ๋ ๋ฒํผ์ ๋๋ฅด๋ฉด ํ๋ฉด ์ค๊ฐ์์ ํ์ ์ด ์๊ธฐ๋๊ฒ์ ๋ณผ ์ ์๋ค.
anchor-name, position-anchor
๊ธฐ๋ณธ์ ์ผ๋ก popover ์๋ฆฌ๋จผํธ๋ ํ๋ฉด ์ค์์ ๊ณ ์ ๋์ด์๋ค.
๋๋กญ๋ค์ด ๊ธฐ๋ฅ์ ํ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ค๋ฉด ํธ๋ฆฌ๊ฑฐ ๋ฒํผ ๊ธฐ์ค์ผ๋ก ํ์ค๋ฒ๊ฐ ์์นํด์ผ ํ๋ค. ๊ทธ๋ฌ๋ ค๋ฉด css ์์ anchor-name, position-anchor ๊ฐ์ ๋ง์ถฐ์ค์ผ ํ๋ค. ์ด๊ฑด ๊ณ ์ ํ ๊ฐ์ผ๋ก ๋ง์ถฐ์ค์ผ ํ๋๊ฑฐ ๊ฐ๋ค.
.anchor {
anchor-name: --my-anchor;
}
.infobox {
position-anchor: --my-anchor;
}
์ต์ํ ์ด์ ๋๋ง ์ ์ฉํด์ฃผ๋ฉด ์์น๊ฐ ์ฐ๊ฒฐ๋๊ณ ๊ธฐ์ค์ ์ผ๋ก ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ์์ผ๋ก ์์น๋ฅผ ์ง์ ํด์ค์ผํ๋ค.
๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด์ผ ์์ธํ ๊ฐ๋ค์ ์ ์ ์์๊ฒ์ด๋ค. (์ค์ ์ด ์์ธ๋ก ๋ณต์กํ๋ค.)
์ฐธ๊ณ ๋งํฌ
https://developer.mozilla.org/en-US/docs/Web/CSS/anchor-name
https://developer.mozilla.org/en-US/docs/Web/CSS/position-anchor
์ฌ๋ฌ๊ฐ์ ์๋ฆฌ๋จผํธ
for ๋ฌธ์ผ๋ก ๋ค์์ ์ปดํฌ๋ํธ๋ฅผ ๋ณต์ ์์ผ ์ฌ์ฉํ๋ค๋ฉด id๋ anchor-name ๊ฐ๋ค์ด ์ค๋ณต๋์ด ์ ๋๋ก ๊ธฐ์ค์์น๊ฐ ์กํ์ง ์์ ์ข ๋ฆฌ์์น๋ฅผ ํ๊ฒ ๋์๋ค.
๋ฐ๋์ anchor-name = position-anchor ๊ฐ์ผ๋ก ์ ์ง์์ผ์ค์ผ ํ๊ธฐ ๋๋ฌธ์ id ๊ฐ์ผ๋ก ์ปค์คํฐ๋ง์ด์ฆ ํ ๊ฐ์ผ๋ก ๋ฃ๊ฑฐ๋ uid๋ฅผ ๋ง๋ค์ด์ ๊ฐ์ ์กฐ๋ฆฝํ์ฌ ์ฌ์ฉํด์ผ ํ๋ค.
๊ทธ๋ค์ง ์ข์๋ณด์ด๋ ํํ๋ ์๋์ง๋ง vue์ ๋๋ต์ ์ธ ์์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
<templete>
<nav class="dropdown">
<button
type="button"
:popovertarget="`dropdown-${props.id}`"
class="menu"
:style="[ `anchor-name: --dropdown-${props.id};` ]">
๋ฉ๋ด
</button>
<div
class="dropdown-body"
popover
:id="`dropdown-${props.id}`"
:style="[ `position-anchor: --dropdown-${props.id};` ]">
<button type="button">๋ฉ๋ด1</button>
<button type="button">๋ฉ๋ด2</button>
<button type="button">๋ฉ๋ด3</button>
</div>
</nav>
</templete>
<script setup>
const props = defineProps({
id: Number,
})
</script>
<style lang="scss" scoped>
.dropdown {
position: relative;
}
.dropdown-body {
position: absolute;
inset-block-start: anchor(end);
inset-inline-start: anchor(self-start);
margin: 0;
width: fit-content;
}
</style>