๋ฐ˜์‘ํ˜•

@supports


@supports๋ฅผ ์ด์šฉํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŠน์ • CSS ์†์„ฑ์„ ์ง€์›ํ• ๋•Œ์™€, ์ง€์›ํ•˜์ง€ ์•Š์„ ๋•Œ์˜ ์Šคํƒ€์ผ์„ ๊ฐ๊ฐ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. @supports (์†์„ฑ๋ช…: ๊ฐ’) {...} ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์ง€์›ํ•˜์ง€ ์•Š์„ ๋• not ์—ฐ์‚ฐ์ž๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

/* ๋ธŒ๋ผ์šฐ์ €๊ฐ€ display: grid๋ฅผ ์ง€์›ํ•˜๋ฉด ์ ์šฉ */
@supports (display: grid) {
  div {
    display: grid;
  }
}

/* ๋ธŒ๋ผ์šฐ์ €๊ฐ€ display: grid๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฉด float ์ ์šฉ  */
@supports not (display: grid) {
  div {
    float: right;
  }
}

 

CSS ์Šคํƒ€์ผ ์†์„ฑ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ CSS ์„ ํƒ์ž(์…€๋ ‰ํ„ฐ)๋ฅผ ์ง€์›ํ•˜๋Š”์ง€๋„ ํŒ๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

/* ๋ธŒ๋ผ์šฐ์ €๊ฐ€ > ์ž์‹ ์…€๋ ‰ํ„ฐ๋ฅผ ์ง€์›ํ•  ๋•Œ */
@supports selector(A > B) {}

 

and, or ์—ฐ์‚ฐ์ž๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. and๋Š” ๋ชจ๋‘ ์ฐธ์ผ ๋•Œ, or์€ ํ•˜๋‚˜๋ผ๋„ ์ฐธ์ด๋ฉด ํ†ต๊ณผํ•œ๋‹ค.

/* ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ด„ํ˜ธ์•ˆ ์†์„ฑ์„ ๋ชจ๋‘ ์ง€์›ํ•  ๋•Œ(2๊ฐœ ์ด์ƒ๋„ ๊ฐ€๋Šฅ) */
@supports (display: table-cell) and (display: list-item) {}
@supports (display: table-cell) and (display: list-item) and (display:run-in) {}
/* ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ด„ํ˜ธ์•ˆ ์†์„ฑ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ง€์› ํ•  ๋•Œ */
@supports (transform-style: preserve) or (-moz-transform-style: preserve) {}

 

์†Œ๊ด„ํ˜ธ ()๋ฅผ ์ด์šฉํ•ด ์—ฐ์‚ฐ์ž ์ˆœ์„œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ์—์„  ํ‘œํ˜„์‹3๊ณผ ํ‘œํ˜„์‹4๋ฅผ ๋น„๊ตํ•˜๊ณ  → ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ‘œํ˜„์‹2์™€ ๋น„๊ตํ•˜๊ณ  → ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ‘œํ˜„์‹1๊ณผ ๋น„๊ตํ•œ๋‹ค. 

 

๊ด„ํ˜ธ๋ฅผ ์ด์šฉํ•ด ์—ฐ์‚ฐ์ž ์ˆœ์„œ๋ฅผ ์ •์˜ํ•œ ์˜ˆ์‹œ โ–ผ

@supports (ํ‘œํ˜„์‹1) or ((ํ‘œํ˜„์‹2) or ((ํ‘œํ˜„์‹3) or (ํ‘œํ˜„์‹4)))

 

CSS Scroll Snap โญ๏ธ


Scroll Snap์„ ์ด์šฉํ•ด ์Šคํฌ๋กคํ•  ๋•Œ ํ•ญ์ƒ ์š”์†Œ ๋(ํ˜น์€ ์‹œ์ž‘/์ค‘๊ฐ„) ๋ถ€๋ถ„์— ๋ถ™๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค(์‚ฌ์šฉ์ž๊ฐ€ ํ„ฐ์น˜๋‚˜ ํœ  ์Šคํฌ๋กค์„ ๋งˆ์ณค์„ ๋•Œ์˜ ์˜คํ”„์…‹ ์„ค์ •). ์˜ˆ์ „์—” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•ด์•ผ ํ–ˆ์ง€๋งŒ ์ด์   CSS ์ฝ”๋“œ 2์ค„์ด๋ฉด ๊ฐ€๋Šฅํ•˜๋‹ค. ์Šคํฌ๋กค์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ๋ถ€๋ชจ ์š”์†Œ์—์„œ ์Šคํฌ๋กคํ•˜๋Š” ๋ฐฉํ–ฅ์˜ overflow ์†์„ฑ ๊ฐ’์ด auto ํ˜น์€ scroll์ด์–ด์•ผ ํ•œ๋‹ค.

.parents {
  overflo-y: scroll;
  scroll-snap-type: y mandatory; /* ๋ถ€๋ชจ ์š”์†Œ์— ์ ์šฉ(๊ฐ€๋กœ ์Šคํฌ๋กค์ด๋ฉด y๋ฅผ x๋กœ ๋ณ€๊ฒฝ) */
}
.children {
  scroll-snap-align: center; /* ์ž์‹ ์š”์†Œ์— ์ ์šฉ */
}

 

Scroll Snap ์ ์šฉ ์ „ / ์‚ฌ์šฉ์ž๊ฐ€ ์Šคํฌ๋กคํ•œ ๋งŒํผ ์›€์ง์ธ๋‹ค โ–ผ

 

Scroll Snap ์ ์šฉ ํ›„ / ์Šคํฌ๋กคํ•  ๋•Œ ํ•ญ์ƒ ์š”์†Œ์˜ ์œ—๋ถ€๋ถ„์œผ๋กœ ๋ถ™๋Š”๋‹ค(scroll-snap-align: start ๊ธฐ์ค€) โ–ผ

 

scroll-snap-type (๋ถ€๋ชจ ์š”์†Œ์— ์ ์šฉ)

snap-scroll-type: [none | x | y | block | inline | both] [mandatory | proximity]?

 

์Šค๋ƒ… ํฌ์ธํŠธ(์Šคํฌ๋กค ํ›„ ๋ถ™๋Š” ์ง€์ )๋ฅผ ์–ผ๋งˆ๋‚˜ ์—„๊ฒฉํ•˜๊ฒŒ ์ ์šฉํ• ์ง€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฒซ๋ฒˆ์งธ ๊ฐ’์—” ์ถ•(axis), ๋‘๋ฒˆ์งธ ๊ฐ’์—” ์—„๊ฒฉ๋„๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. x, y ๊ฐ™์€ ์ถ• ๊ฐ’๋งŒ ์ž…๋ ฅํ•˜๋ฉด ์—„๊ฒฉ๋„๋Š” ํ•ญ์ƒ proximity๊ฐ€ ๋˜๋ฏ€๋กœ ์ฃผ์˜.

scroll-snap-type: y mandatory; /* y ๋ฐฉํ–ฅ์œผ๋กœ ํ•ญ์ƒ ์Šค๋ƒ… */
scroll-snap-type: y proximity; /* y ๋ฐฉํ–ฅ์œผ๋กœ ์Šค๋ƒ… ํฌ์ธํŠธ์™€ ๊ทผ์ ‘ํ–ˆ์„ ๋•Œ๋งŒ ์Šค๋ƒ…(์‚ฌ์šฉ์ž ์Šคํฌ๋กค ์šฐ์„ ) */
scroll-snap-type: both mandatory; /* x/y ๋ฐฉํ–ฅ์œผ๋กœ ํ•ญ์ƒ ์Šค๋ƒ… */
scroll-nap-type: y; /* scroll-nap-type: y proximity์™€ ๋™์ผ */

 

mandatory ์†์„ฑ์€ ์Šคํฌ๋กค ํ›„ ์š”์†Œ ์–ด๋””์— ์œ„์น˜ํ•˜๋“  ํ•ญ์ƒ ์Šค๋ƒ… ํฌ์ธํŠธ์— ๋ถ™๋Š”๋‹ค. proximity ์†์„ฑ์€ ์‚ฌ์šฉ์ž ์Šคํฌ๋กค์„ ์šฐ์„ ์‹œํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉฐ, ์Šคํฌ๋กค ํ›„ ์Šค๋ƒ… ํฌ์ธํŠธ์— ๊ทผ์ ‘ํ–ˆ์„ ๋•Œ๋งŒ ์Šค๋ƒ… ๋˜๊ณ  ๊ทธ ์™ธ ์ง€์ ์—์„  ์Šค๋ƒ… ๋˜์ง€ ์•Š๋Š”๋‹ค — scroll-snap-align ์†์„ฑ ๊ฐ’์— ๋”ฐ๋ผ ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅด๋‹ค.

 

scroll-nap-type: y proximity ์ ์šฉ ํ™”๋ฉด / ์Šค๋ƒ… ํฌ์ธํŠธ์— ๊ทผ์ ‘ํ–ˆ์„ ๋•Œ๋งŒ ์Šค๋ƒ… ๋œ๋‹ค โ–ผ

 

scroll-snap-align (์ž์‹ ์š”์†Œ์— ์ ์šฉ)

๐Ÿ’ก start, end ์†์„ฑ ํšจ๊ณผ๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ถ์„ ๋• container ๋†’์ด๋ฅผ children ๋ณด๋‹ค ํฌ๊ฒŒํ•˜๋ฉด ๋œ๋‹ค.

scroll-snap-align: none | start | end | center

 

์Šค๋ƒ… ์˜์—ญ(๋ถ€๋ชจ ์ปจํ…Œ์ด๋„ˆ)์—์„œ ์ž์‹ ์š”์†Œ๊ฐ€ ์–ด๋””์„œ ์Šค๋ƒ…๋ ์ง€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. none์€ ์Šค๋ƒ…ํ•˜์ง€ ์•Š๊ณ , start, end, center๋Š” ์ถ•์„ ๊ธฐ์ค€์œผ๋กœ ๋งจ ์•ž/๋’ค/์ค‘๊ฐ„ ์ง€์ ์œผ๋กœ ์Šค๋ƒ…๋œ๋‹ค.

 

scroll-snap-align: start — ์‹œ์ž‘ ์ง€์ (ํ™”์‚ดํ‘œ ๋ถ€๋ถ„)์œผ๋กœ ์Šค๋ƒ…๋œ๋‹ค โ–ผ

 

scroll-snap-align: end — ๋ ์ง€์ (ํ™”์‚ดํ‘œ ๋ถ€๋ถ„)์œผ๋กœ ์Šค๋ƒ…๋œ๋‹ค โ–ผ

 

scroll-snap-align: center — ์ค‘๊ฐ„ ์ง€์ (ํ™”์‚ดํ‘œ ๋ถ€๋ถ„)์œผ๋กœ ์Šค๋ƒ…๋œ๋‹ค โ–ผ

 

๊ทธ ์™ธ snap-scroll ์†์„ฑ

snap-padding : ์Šค๋ƒ…๋˜๋Š” ๊ณณ์— padding ์ ์šฉ. ๋ถ€๋ชจ ์š”์†Œ์— ์ •์˜ํ•˜๋ฉฐ, ๋ชจ๋“  ์ž์‹ ์š”์†Œ์— ์ ์šฉ๋œ๋‹ค.

scroll-padding: 2em; /* ๋ถ€๋ชจ ์š”์†Œ(overflow: scroll์ด ์žˆ๋Š” ๊ณณ) */

 

snap-margin : ์Šค๋ƒ…๋˜๋Š” ๊ณณ์— margin ์ ์šฉ. ์ž์‹ ์š”์†Œ์— ๊ฐœ๋ณ„ ์ง€์ •ํ•œ๋‹ค.

scroll-margin: 2em; /* ์ž์‹ ์š”์†Œ */

 

์ฝ”๋“œํŽœ ์˜ˆ์‹œ

See the Pen CSS Scroll Snap by ColorFilter (@colorfilter) on CodePen.

 

 

:is ๊ฐ€์ƒ ์„ ํƒ์ž(Pseudo Selector)


๐Ÿ’ก :is ๊ฐ€์ƒ ์„ ํƒ์ž๋Š” ๋งŽ์€ ์š”์†Œ๋ฅผ ์„ ํƒํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค. :is์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” :where๋„ ์žˆ๋‹ค. ๋‹ค๋ฅธ์ ์€ :where์˜ ๊ฐ€์ค‘์น˜(specificity)๋Š” 0์ด๊ณ ๏ผŒ:is๋Š” ์ธ์ž์— ๋ช…์‹œํ•œ ๊ฒƒ ์ค‘์—์„œ ๊ฐ€์žฅ ๋†’์€ ๊ฐ€์ค‘์น˜๊ฐ€ ์ ์šฉ๋œ๋‹ค — ์ฐธ๊ณ ๊ธ€

 

header, nav, form ํƒœ๊ทธ์˜ ํ›„์† ์š”์†Œ์ค‘ button ํƒœ๊ทธ๋ฅผ ์„ ํƒํ•  ๋•Œ ์•„๋ž˜์ฒ˜๋Ÿผ ์ž‘์„ฑํ•œ๋‹ค.

/* :is ๊ฐ€์ƒ ์„ ํƒ์ž ์‚ฌ์šฉ์ „ */
header button,
nav button,
form button {
  background-color: tomato;
}

 

:is ๊ฐ€์ƒ ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์š”์†Œ๋ฅผ ์„ ํƒํ•  ๋•Œ ๋ฐ˜๋ณต์ ์ธ ์ฝ”๋“œ๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

/* :is ๊ฐ€์ƒ ์„ ํƒ์ž ์‚ฌ์šฉ ํ›„ */
:is(header, nav, form) button {
  background-color: tomato;
}

 

:hover ๊ฐ™์€ ๊ฐ€์ƒ ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํŠนํžˆ ๋” ์œ ์šฉํ•˜๋‹ค.

/* :is ๊ฐ€์ƒ ์„ ํƒ์ž ์‚ฌ์šฉ์ „ */
.embed .save-button:hover,
.attachment .save-button:hover {
  opacity: 1;
}

/* :is ๊ฐ€์ƒ ์„ ํƒ์ž ์‚ฌ์šฉํ›„ */
:is(.embed, .attachment) .save-button:hover {
  opacity: 1;
}

 

Flexbox Gap


๐Ÿ’ก ๋Œ€๋ถ€๋ถ„ ๋ฉ”์ด์ € ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›

 

์ด๋ฏธ์ง€ ์ถœ์ฒ˜ - CSS Tricks

 

Flexbox์—์„œ ์ž์‹ item ์š”์†Œ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ์ง€์ •ํ•  ๋•Œ gap์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. gap ๋ฌธ๋ฒ•์„ ์ง€์›ํ•˜๊ธฐ ์ „์—” margin์„ ์ด์šฉํ•ด ์š”์†Œ ์‚ฌ์ด์˜ ๊ณต๊ฐ„์„ ์ถ”๊ฐ€ํ–ˆ์—ˆ๋‹ค. gap์€ ์ธ์ ‘ํ•œ ์š”์†Œ๊ฐ€ ์žˆ์„๋•Œ๋งŒ ๊ฐ„๊ฒฉ์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜์ง€ ์•Š๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ๋ถ€๋ชจ ์š”์†Œ(container)์— ์†์„ฑ์„ ์ ์šฉํ•˜๋ฉฐ, ์ผ๋ฐ˜/์ถ•์•ฝ ํ˜•ํƒœ์˜ ๋ฌธ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

gap: row-gap(์ƒํ•˜) column-gap(์ขŒ์šฐ)
row-gap: value(์ƒํ•˜)
column-gap: value(์ขŒ์šฐ)

 

.flex-container {
  display: flex;
  /* ...์ƒ๋žต */
  gap: 10px; /* ์ƒํ•˜์ขŒ์šฐ 10px ๊ฐ„๊ฒฉ */
  gap: 10px 20px; /* ์ƒํ•˜ 10px ์ขŒ์šฐ 20px ๊ฐ„๊ฒฉ */
  row-gap: 10px; /* ์ƒํ•˜ 10px ๊ฐ„๊ฒฉ */
  column-gap: 20px; /* ์ขŒ์šฐ 10px ๊ฐ„๊ฒฉ */
}

 

aspect-ratio (์ข…ํšก๋น„)


์—˜๋ฆฌ๋จผํŠธ(ํ˜น์€ ์ด๋ฏธ์ง€/์˜์ƒ ๋“ฑ)๋ฅผ ๋น„์œจ์— ๋งž์ถฐ ์ค„์ด๊ฑฐ๋‚˜ ๋Š˜๋ฆด ๋•Œ ์œ ์šฉํ•œ ์†์„ฑ. ์ด์ „๊นŒ์ง„ padding, calc ์†์„ฑ์„ ํ™œ์šฉํ•ด์„œ ๋น„์œจ์„ ์กฐ์ •ํ–ˆ์ง€๋งŒ, ์ด์   aspect-ratio๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋” ๊น”๋”ํ•˜๊ฒŒ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

aspect-ratio: auto | ratio

 

aspect-ratio: auto; /* ๊ธฐ๋ณธ๊ฐ’ */
aspect-ratio: 1 / 1; /* ๊ฐ€๋กœ/์„ธ๋กœ 1:1 ๋น„์œจ */
aspect-ratio: 2 / 1; /* ๊ฐ€๋กœ/์„ธ๋กœ 2:1 ๋น„์œจ */
aspect-ratio: 1 / 2; /* ๊ฐ€๋กœ/์„ธ๋กœ 1:2 ๋น„์œจ */
aspect-ratio: 16 / 9  /* ๊ฐ€๋กœ/์„ธ๋กœ 16:9 ๋น„์œจ → ์ผ๋ฐ˜์ ์ธ ๋น„๋””์˜ค ์ข…ํšก๋น„ */
aspect-ratio: auto 4 / 3; /* ์š”์†Œ๊ฐ€ ๋น„์œจ์„ ๊ฐ€์ง€๋ฉด auto, ๋น„์œจ์„ ๊ฐ€์ง€์ง€ ์•Š์œผ๋ฉด 4:3 ๋น„์œจ ์ ์šฉ */

 

๐Ÿ’ก ์—˜๋ฆฌ๋จผํŠธ์˜ ๋„ˆ๋น„(width), ๋†’์ด(height)๋ฅผ ๋ชจ๋‘ ์ง€์ •ํ–ˆ๋‹ค๋ฉด aspect-ratio ๋น„์œจ์„ ๋ช…์‹œํ•ด๋„ ๋ฌด์‹œ๋œ๋‹ค. ๋„ˆ๋น„ ํ˜น์€ ๋†’์ด๋งŒ ์ง€์ •ํ–ˆ์„ ๋• aspect-ratio ๋น„์œจ์ด ์ ์šฉ๋œ๋‹ค.

 

  • auto ์†์„ฑ๋งŒ ์คฌ์„ ๋•Œ : ์—˜๋ฆฌ๋จผํŠธ ๊ณ ์œ ์˜ ๋น„์œจ ๊ทธ๋Œ€๋กœ ์œ ์ง€.
  • auto ratio ์†์„ฑ์„ ํ•จ๊ป˜ ์คฌ์„ ๋•Œ : ์š”์†Œ๊ฐ€ ๊ณ ์œ ์˜ ๋น„์œจ์„ ๊ฐ€์ง„๋‹ค๋ฉด auto๊ฐ€ ์ ์šฉ๋˜๊ณ , ๊ณ ์œ ์˜ ๋น„์œจ์„ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค๋ฉด(๊ฐ€๋กœ ํ˜น์€ ์„ธ๋กœ ํฌ๊ธฐ๋งŒ ๊ฐ€์ง) ratio์— ๋ช…์‹œํ•œ ๋น„์œจ์ด ์ ์šฉ๋จ(์ฐธ๊ณ ๊ธ€)

 

ํ™œ์šฉ ์˜ˆ์‹œ

์•„๋ž˜ ์˜ˆ์‹œ์—์„œ <div>, <img> 2๊ฐœ ํƒœ๊ทธ ๋ชจ๋‘ preferably-square๋ผ๋Š” class๋ฅผ ๊ฐ–๊ณ  ๋„ˆ๋น„๋Š” 300px๋กœ ์ง€์ •๋˜์–ด ์žˆ๋‹ค. ์—ฌ๊ธฐ์— aspect-ratio๋ฅผ ์ ์šฉํ•˜๋ฉด 4:3(800x600) ๋น„์œจ์„ ๊ฐ€์ง„ <img>๋Š” auto ์†์„ฑ์ด ์ ์šฉ๋ผ์„œ ๋น„์œจ์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ณ , width๋งŒ ๊ฐ€์ง€๋Š” <div>๋Š” 1 / 1 ์†์„ฑ์ด ์ ์šฉ๋ผ์„œ 1:1 ๋น„์œจ์„ ๊ฐ–๊ฒŒ๋œ๋‹ค.

 

๋งŒ์•ฝ aspect-ratio: auto๋งŒ ๋ช…์‹œํ–ˆ๋‹ค๋ฉด, <div>๋Š” height ๊ฐ’์ด ์—†์œผ๋ฏ€๋กœ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง„๋‹ค.

<div class="preferably-square"></div>
<img
  class="preferably-square"
  src="https://source.unsplash.com/random/800x600?minimal"
  alt=""
/>
.preferably-square {
  width: 300px;
  aspect-ratio: auto 1 / 1;
}

 

์ขŒ `<div>` / ์šฐ `<img>` โ–ผ

See the Pen Two values for aspect-ratio property by ColorFilter (@colorfilter) on CodePen.

 

 

๋ฒˆ์™ธ — ์ด๋ฏธ์ง€ ํƒœ๊ทธ ๋น„์œจ ์กฐ์ • ๋ฐฉ๋ฒ•

์ฐธ๊ณ ๋กœ <img> ํƒœ๊ทธ๋Š” ์•„๋ž˜ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ด๋ฉด์„œ ๋น„์œจ์„ ์กฐ์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

โถ ๋„ˆ๋น„, ๋†’์ด ์ค‘ ํ•˜๋‚˜๋งŒ ํฌ๊ธฐ ์ œํ•œ

/* ๋„ˆ๋น„๋‚˜ ๋†’์ด ์ค‘ ํ•˜๋‚˜๋งŒ ํฌ๊ธฐ๋ฅผ ์ œํ•œํ•˜๋ฉด ๋‚˜๋จธ์ง€๋Š” ๋น„์œจ์— ๋งž๊ฒŒ ์ค„์–ด๋“ ๋‹ค */
img {
  width: 100px;
}

 

โท ๋„ˆ๋น„, ๋†’์ด ํฌ๊ธฐ๋ฅผ ๋ชจ๋‘ ์ œํ•œํ•˜๋ฉด์„œ ๋น„์œจ์„ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ - ๋ฐฉ๋ฒ•1

/* ๋„ˆ๋น„/๋†’์ด๋ฅผ auto๋กœ ์„ค์ •ํ•˜๊ณ , max-width, max-height ์†์„ฑ์œผ๋กœ ํฌ๊ธฐ ์ œํ•œ */
img {
  width: auto;
  height: auto;
  max-width: 100px;
  max-height: 100px;
}

 

โธ ๋„ˆ๋น„, ๋†’์ด ํฌ๊ธฐ๋ฅผ ๋ชจ๋‘ ์ œํ•œํ•˜๋ฉด์„œ ๋น„์œจ์„ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ - ๋ฐฉ๋ฒ•2

/* ์ด๋ฏธ์ง€๋ฅผ ๋ฐฐ๊ฒฝ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ , background-size: contain ์†์„ฑ์œผ๋กœ ๋น„์œจ ์œ ์ง€ */
img {
  width: 100px;
  height: 100px;
  background: url("url") no-repeat;
  background-size: contain;
}

 

position: sticky


position: sticky๋ฅผ ์ด์šฉํ•ด ์œ ์ € ์Šคํฌ๋กค์„ ๋”ฐ๋ผ๋‹ค๋‹ˆ๋Š” ๋“ฏํ•œ ๋Š๋‚Œ์˜ ์š”์†Œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค

 

CSS์—์„œ position์€ ์š”์†Œ์˜ ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์†์„ฑ์ด๋‹ค. ๊ทธ ์ค‘ sticky ์†์„ฑ์€ relative(static๊ณผ ๋™์ผํ•˜์ง€๋งŒ ์ขŒํ‘œ ํ”„๋กœํผํ‹ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅ) ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋‹ค๊ฐ€ ์Šคํฌ๋กค ํ›„ ํŠน์ • ์ง€์ (์ž„๊ณ„์ )๊นŒ์ง€ ๋„๋‹ฌํ•˜๋ฉด fixed(๋ธŒ๋ผ์šฐ์ € ๋ทฐํฌํŠธ ๊ธฐ์ค€์œผ๋กœ ์œ„์น˜ ์ด๋™) ์ฒ˜๋Ÿผ ์ž‘๋™ํ•œ๋‹ค.

 

sticky๋ฅผ ์ ์šฉํ•˜๊ณ  ์‹ถ์€ ์š”์†Œ์— position: sticky๋ฅผ ๋ช…์‹œํ•˜๊ณ , ์ตœ์†Œ 1๊ฐœ์˜ ์ขŒํ‘œ ํ”„๋กœํผํ‹ฐ(top, left ๋“ฑ)๋ฅผ ์ง€์ •ํ•ด์•ผ ์ž‘๋™ํ•œ๋‹ค. sticky๋Š” ๋ณดํ†ต ์ƒ๋‹จ์— ๋ถ™๋„๋ก ํ•  ๋•Œ ํ™œ์šฉํ•˜๋ฏ€๋กœ top: 0 ์ขŒํ‘œ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

 

  • sticky๊ฐ€ ์ •์˜๋œ ์š”์†Œ(sticky ๋ฐ•์Šค)๋Š” ๋ถ€๋ชจ ์š”์†Œ ์˜์—ญ ์•ˆ์—์„œ๋งŒ ์Šคํฌ๋กค์— ๋”ฐ๋ผ ์›€์ง์ธ๋‹ค
  • sticky๊ฐ€ ์ž‘๋™ํ•˜๋ ค๋ฉด ๋ถ€๋ชจ ์š”์†Œ๊ฐ€ ์Šคํฌ๋กคํ•  ์ˆ˜ ์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ๋†’์ด(height)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋•Œ๋ฌธ์— sticky๋ฅผ ์ง€์ •ํ•œ ์ž์‹ ์š”์†Œ์˜ ๋†’์ด๊ฐ€ ๋ถ€๋ชจ ์š”์†Œ๋ณด๋‹ค ํฌ๋ฉด sticky ํšจ๊ณผ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

<div id="container">
  <!-- scroll ๋ฐ•์Šค -->
  <section>
    <!-- sticky ๋ฐ•์Šค์˜ ๋ถ€๋ชจ -->
    <header>Sticky Box 1</header>
    <!-- sticky ๋ฐ•์Šค -->
  </section>
  <section>
    <header>Sticky Box 2</header>
  </section>
</div>

 

๊ฐ ์š”์†Œ์— ๋†’์ด๋„ ์ง€์ •ํ•ด์•ผ ํ•˜๋Š” ์  ์žŠ์ง€ ๋ง ๊ฒƒ(๊ทธ๋ž˜์•ผ ์Šคํฌ๋กค ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ) โ–ผ

/* scroll ๋ฐ•์Šค (overflow: auto|scroll ์†์„ฑ์ด ์žˆ๋Š” ๊ณณ) */
#container {
  height: 800px;
  overflow-y: scroll;
}

/* sticky ๋ฐ•์Šค์˜ ๋ถ€๋ชจ */
section {
  height: 400px;
}

/* sticky ๋ฐ•์Šค (sticky ์†์„ฑ์„ ์ ์šฉํ•œ ์š”์†Œ) */
header {
  height: 50px;
  top: 0;
  position: sticky;
}

 

sticky ๋ฐ•์Šค ํŠน์ง•

๐Ÿ’ก ์•„๋ž˜ ๋‚ด์šฉ์€ ๋ ˆ์ง„ ์ฝ”๋ฏน์Šค ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ ๊ธ€ ์ฐธ๊ณ 

 

  • ์šฉ์–ด ์„ค๋ช…
    • fixed ๋ฐ•์Šค: position: fixed ์†์„ฑ์„ ์ ์šฉํ•œ ๋ฐ•์Šค
    • sticky ๋ฐ•์Šค: position: sticky ์†์„ฑ์„ ์ ์šฉํ•œ ๋ฐ•์Šค
    • scroll ๋ฐ•์Šค: overflow: auto|scroll ์†์„ฑ์„ ์ ์šฉํ•œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์กฐ์ƒ ๋ฐ•์Šค.
  • fixed ๋ฐ•์Šค๋Š” ๋ทฐํฌํŠธ์— ๊ณ ์ •๋˜์ง€๋งŒ, sticky ๋ฐ•์Šค๋Š” scroll ๋ฐ•์Šค์— ๊ณ ์ •๋จ(scroll ๋ฐ•์Šค๊ฐ€ offset ๊ธฐ์ค€)
  • ๋ทฐํฌํŠธ๋Š” 1๊ฐœ๋ฐ–์— ์—†์ง€๋งŒ, scroll ๋ฐ•์Šค๋Š” ๋ฌธ์„œ ์•ˆ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ ์ƒ์„ฑ ๊ฐ€๋Šฅ
  • scroll ๋ฐ•์Šค์— sticky ๋ฐ•์Šค๊ฐ€ ๊ณ ์ •๋˜๋Š” ์ž„๊ณ„์ ์€ ์Šคํฌ๋กค ์œ„์น˜๊ฐ€ ๊ฒฐ์ •ํ•จ. sticky ๋ฐ•์Šค ๋ฐ ๋ถ€๋ชจ ๋ฐ•์Šค์˜ ์œ„์น˜/ํฌ๊ธฐ๋„ ์ž„๊ณ„์ ์— ์˜ํ–ฅ์„ ๋ฏธ์นจ
  • sticky ๋ฐ•์Šค์˜ ๋ถ€๋ชจ ๋ฐ•์Šค๊ฐ€ scroll ๋ฐ•์Šค๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด, sticky ๋ฐ•์Šค๋Š” ๋‹ค์‹œ ์ผ๋ฐ˜์ ์ธ ํ๋ฆ„์„ ๋”ฐ๋ฆ„ — relative ์ฒ˜๋Ÿผ ๋™์ž‘
  • sticky ๋ฐ•์Šค์™€ scroll ๋ฐ•์Šค ์‚ฌ์ด์— overflow: hidden ์†์„ฑ์„ ๊ฐ€์ง„ ๋ฐ•์Šค๊ฐ€ ์žˆ์œผ๋ฉด, sticky ๋ฐ•์Šค๋Š” ์ผ๋ฐ˜์ ์ธ ํ๋ฆ„์„ ๋”ฐ๋ฆ„ — relative ์ฒ˜๋Ÿผ ๋™์ž‘

 

์ฝ”๋“œํŽœ ์˜ˆ์‹œ

See the Pen Position Sticky by ColorFilter (@colorfilter) on CodePen.

 

 

๋ ˆํผ๋Ÿฐ์Šค


 


๊ธ€ ์ˆ˜์ •์‚ฌํ•ญ์€ ๋…ธ์…˜ ํŽ˜์ด์ง€์— ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”
๋ฐ˜์‘ํ˜•