๋ถ‰์€๊ฑฐ์œ„ ๋…ธํŠธ / GoOSe Note

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>