CSS:has(.parent ์ ํ๊ธฐ)๐ช
State of CSS survey 2021์ ํต๊ณ์ ๋ฐ๋ฅด๋ฉด ๋ ๋ฒ์งธ๋ก ๊ธฐ๋๋๋ CSS ๊ธฐ๋ฅ์ธ'๋ถ๋ชจ ์ ํ๊ธฐ'(Parent selectors)๋has ์ ํ๊ธฐ๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ฉฐ ๋ธ๋ผ์ฐ์ ์ง์์ ๋ฐ์๋ค!
์ฌ๋ผ ์์๋จ์ ์ธ์ฉํด ํธ์ํฐ์ ์ ์๋ชฌ์ค์ ๋ง์ ์ธ์ฉํ๋ค.
:has() is essentially the long-awaited parent selector in CSS ๐
Donโt say Safari is always last. Sometimes we are first.
๊ทธ๋ฌ๋ ์ด๋ฒ'Safari first'๋ฅผ ์ถํํ๊ธฐ ์ ์ 2022๋ ์ด์ ํ๋ถ๋ชจ ์ ํ๊ธฐ๋ฅผ ํ ์คํธํ ๋ธ๋ผ์ฐ์ ๊ฐ ์์ ์๋ ์์ต๋๋ค.์ฌํ๋ฆฌ๋ ํ์ฌ ์ ๋ฐ์ดํธ ์ค์ ๋๋ค.CSS์์ ๋ ์ด์ ์ฌ๋ผ์ง์ง ์์
ํ์ฌ CSS์๋ ๋ถ๋ชจ ์ ํ๊ธฐ๊ฐ ๋ ์ด์ ๋ถ์กฑํ์ง ์์ต๋๋ค. Firefox์ Chromium์ด ๋นจ๋ฆฌ ๋ฐ๋ผ๊ฐ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ถ๋ชจ ์ ํ๊ธฐ๋ ๋ฌด์์ ์ ํํฉ๋๊น?
๋ถ๋ชจ ์ ํ๊ธฐ์์ ๋ถ๋ชจ ์์๋ฅผ ์ ํํ์๊ฒ ์ต๋๊น?๊ทธ๋ค์ ์ค์ ๋ก๋ ์กฐ๋ถ๋ชจ์ ์ผ์นํ๋ ์กฐ์์ ์ ํํ ๊ฒ์ด๋ค.
๋๋ ์ ์ผํ๊ฒ:has()
๊ฐ'์ด๋ฆฐ์ด ์ ํ๊ธฐ'๋ผ๊ณ ์๊ฐํ๋ ์ฌ๋์ด ์๋๋ค. ๊ทธ๋์ ๋๋ ๊ทธ๋ค์'has ์ ํ๊ธฐ'๋ผ๊ณ ๋ถ๋ฌ์ ์คํด๋ฅผ ํผํด์ผ ํ๋๊ฐ?
๋์๊ฒ ์์ด์ ์ด๊ฒ์ ๋ฃ๊ธฐ์ ์ ๋นํ ๋ฌ์ฌ์ด๋ค.
์์caniuse.com/css-has:For example,
a:has(>img)
selects all<a>
elements that contain an<img>
child.
The:has()
CSS pseudo-class is documented well on MDN .์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ
์ด ๊ณํ์ ์ค์ํ๋ ๋ฐ ์ด๋ ๊ฒ ๋ง์ ์๊ฐ์ด ๊ฑธ๋ ธ๋๋ฐ, ์ฃผ์ ์์ธ์ ๋น์ผ ๊ณ์ฐ์ ๊ฑฑ์ ํ๊ธฐ ๋๋ฌธ์ด๋ค.๋ฌธ์์ ์ค์๊ฐ์ผ๋ก ์ ์ฉ๋ ๋ ๋ถ๋ชจ ์ ํ๊ธฐ๋ ์ฌ์ดํธ์ ์๋์ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
Chris Coyier cited Jonathan Snook (back in 2010) "๋์ ์ผ๋ก ์์๋ฅผ ์ถ๊ฐํ๊ณ ํ์ด์ง์์ ์์๋ฅผ ์ญ์ ํ๋ฉด ๋ฌธ์ ์ ์ฒด๊ฐ ๋ค์ ๋ํ๋ ์ ์์ต๋๋ค(์ฃผ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ๋ฌธ์ ).
์ฐ๋ฆฌ๊ฐ ์ง์ ์ผ๋ก ๋ถ๋ชจ ์ ํ๊ธฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์์ํ์ ๋, ์๋ง๋ ์ฐ๋ฆฌ๋ ๊ฐ๋ณํ ์กฐ์ฌ์ค๋ฝ๊ฒ ์ฐ๋ฆฌ์ ์ฑ๋ฅ์ ํ๊ฐํด์ผ ํ ๊ฒ์ด๋ค.์ฑ๋ฅ ๋ฌธ์ ๋ฐฉ์ง:
์ ๋ฐ์ดํธ: ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ ์ ์์ต๋๋ค.Eric Meyer๋ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ํํผํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์ธํ๊ฒ ์ค๋ช ํ๋ nerdy์ ๊ดํ ๊ฐ์ฐ์ ์ธ๊ธํ๋ค.
์ดํ์ ๋๋ ์ํฌ ์์ง์ ์ ๋ต์ด ์ด๋ ์ ๋์ ๊ตญ์ ์ฅ๊ธฐ ์์ง์ ํจ์จ๊ณผ ์ ์ฌํ๋ค๊ณ ๋งํ๊ณ ์ถ๋ค. ๊ทธ๊ฒ์ ๋ชจ๋ ๊ฐ๋ฅํ ์กฐํฉ ๋์์ ๋ชจ๋ ๊ฐ๋ฅํ ๊ฒฐ๊ณผ๋ฅผ ์์ธกํ์ง ์๊ณ ์๊ด์๋ ๋์์ ์ ์ํ๊ฒ ๋ฌด์ํ๋ ๋ฐฉ๋ฒ์ ์์์ผ ํ๋ค.
CSS์ ๊ฒฝ์ฐ ๊น๋นก์ ์์ง์ด ๊ด๋ จ๋์ง ์์ ์์๋ฅผ ๋ฐ๋ณตํ๊ฑฐ๋ ๋ฌดํจํํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.์คํ์ผ์ ์ ์ฉํ ํ ์๊ด์๋ ์ฌ๊ณ์ฐ์ ์ค์ด๊ธฐ ์ํด ์์ง์ ์ฌ๊ณ์ฐ ๊ธฐ๊ฐ์ ์คํ์ผ์ด:has()
์ํ ๋ณ๊ฒฝ์ ์ํฅ์ ๋ฐ์๋์ง ํ์ํ ์ ์๋ค.
ํ์ง๋ง ์ด๋ณ์ฐ๋ ๋ถ์ ํ๊ธฐ๋ฅผ ์คํํ๋ ๋ฌธ์ ์ ํด๊ฒฐ ๋ฐฉ์์ ์ธ๋ถ ์ฌํญ์ ์ค๋ช ํด ๋ฌ๋ผ๊ณ ํ๋ค.
๊ทธ์ ํด์์๋ ๋ณต์กํ ์ฉ๋ก๊ฐ ํฌํจ๋์ด ์๋ค. ์๋ฅผ ๋ค๋ฉด,.a:has(.b ~ .c)
ํน์.a:is(:has(b), :has(c))
์ ๋ง!๋๋ ์ฌ์ง์ด ์ด๊ฒ์ด ์ ํจํ CSS์ผ์ง๋ ๋ชจ๋ฅธ๋ค.
์์ํ ๊ณต๋ถ๋ฅผ ๋ฉ์ถ์ง ๋ง๋ผ!์ฝ๋ ์ฌ์ฌ์์ ์ด๋ฐ ์ฝ๋๋ฅผ ๋ณด์ฌ์ฃผ์ง ๋ง์ธ์.์ดํดํ๊ธฐ ์ฝ๊ณ ์ ์งํ๊ธฐ ์ฌ์ด ์ธ๊ฐ ๋๋ก ์ฌ๊ตฌ์ฑํด ๋ฌ๋ผ๊ณ ํ ์ง๋ ๋ชฐ๋ผ!์ค์ ์ฉ๋ก
๋ณด์๋ค์ํผ ๋ง์ ์ฌ๋๋ค์ดhas์ ํ๊ธฐ๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ๋์์ธํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. ํ์ด์ ๋น์ !
๋ค์์ ํ์ค ์ธ๊ณ์ ์์ด๋ค. ๋๋ ์ด์ ์ ์ด๋ฏธ ๋ณต์๋ Shopware ํ ๋ง๋ฅผ ๋ณต์ํด์ผ ํ๋ค. ๊ฒ๋ค๊ฐ ์ด๊ฒ์ ๋งค์ฐ ๊ธด๊ธํ๊ธฐ ๋๋ฌธ์ ์ ์ด๋ ๋ ธ์ ๋์ ์ด ๋ถ๋ถ์ ๊นจ๋ํ ์ฝ๋๊ฐ ์๋ค.
์ฌ๊ธฐ!important
๋ฅผ ์ฌ์ฉํ๋ฉด CMS์์ ์์ฑ๋ ํ๊ทธ์์ ์ค์๋ก ์๋ชป๋ ์์๋ฅผ ์ฐพ์ ์ํ์ ์ค์ผ ์ ์์ต๋๋ค.์ ํ๊ธฐ๊ฐ ๋๋ฌด ๊ธธ์ด์ ์คํฌ๋กค์ ํด์ผ๋ง ๋ชจ๋ ๋ด์ฉ์ ๋ณผ ์ ์์ต๋๋ค./* override template heading style */ body.is-act-index .cms-sections .col-12 .cms-element-alignment.align-self-start {
:has()
๋ฅผ ์ฌ์ฉํ๋ฉด ์ต์ํ ๋ณต๊ตฌ๊ฐ ๋์ฑ ๋ช ํํด์ง๋๋ค.์ฐ๋ฆฌ๋ ๋จ์ง ์ฝ์ ์ ์๋๋ก ์ฝ๋๋ฅผ ์์ฑํ์ ์๋ ์๋ค.ํ์ง๋ง ๋ธ๋ผ์ฐ์ ์ง์์ ํ๋ณดํด์ผ ํฉ๋๋ค./* override template heading style */ body.is-act-index .cms-element-alignment:has(> h1) {
Polyfill:has() ์ ํ๊ธฐ๋ ์ด๋ป๊ฒ ์ฌ์ฉํฉ๋๊น?
์ต๊ทผ CSS ๊ตฌ๋ฌธ์์ ๋ถ๋ชจ ์ ํ๊ธฐ๋ฅผ ์ฐํํ ์ ์์ผ๋ฏ๋ก ์ด๋ฅผ ์ ์กํ ์ ์์ต๋๋ค.PostCSS ๋๋ SASS๋ฅผ ๊ธฐ๋ํ์ง ๋ง์ธ์!์ด๋ฒ์๋ ๊ธฐ์กด ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฑ์ฐ๋ ค๋ฉด JavaScript๊ฐ ํ์ํฉ๋๋ค.
"๊ธฐ๋ณธ์ ์ผ๋ก ์์ํ jQuery์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์:has ์ ํ๊ธฐ๊ฐ ์์ต๋๋ค"Eric Ponto wrote in 2015 already. jQuery ๊ธฐ๋ฐpolyfill:Polyfill({ selectors: [":has"] }).doMatched(rules => { rules.each(rule => { // just pass it into jQuery since it supports `:has` $(rule.getSelectors()).css(rule.getDeclaration()) }); });
ํด์ฆ: ์ด๋ป๊ฒ jQuery๋ฅผ ์ฌ์ฉํ์ง ์์ ์ํฉ์์ ๋ค๊ฐํ์ ์ฑ์๋๊น?
ํ ์คํธ์ ์ฐธ๊ฐํ์ฌ ํด๊ฒฐ ๋ฐฉ์์ ์ ์ถํ์ธ์!ํด๊ฒฐ ๋ฐฉ์์ ์๊ณ ์๋ค๋ฉด StackOverflow question if there is a vanilla JS equivalent of jQuery .has()์ ๋ต์์ผ๋ก ๋ฐํํ ์๋ ์์ต๋๋ค.// TODO: add a parent selector polyfill without using jQuery
querySelectorAllWithHas
Josh Larson's polyfill-css-has ์ ๊ณตhas
(๋งํฌ ๊ฐ์ฌํฉ๋๋ค!)
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ด๋ฏธ ๋ถ๋ชจ ์ ํ๊ธฐ๊ฐ ์๋ ์ํฉ์์ ์ด๋ ๊ฒ ์ค๋ซ๋์ ์ด์๋ค. ์๋ง๋ ์ฐ๋ฆฌ๋ ๋ ์ด์ ๊ฑฑ์ ํ์ง ์๊ณ CSS ์ธ์ด์ ๋ค์ ์ ๊ทธ๋ ์ด๋๋ฅผ ๊ณ์ ์งํํ ๊ฒ์ด๋ค.CSS์ ๋ค์ ๋จ๊ณ๋ ๋ฌด์์ ๋๊น?
2022๋ CSS๋ ์ด๋ค ์ด์ ์ ์ ๊ณตํฉ๋๊น?
๋ํ ๋ ๋ง์ ์ ์ฉํ ๊ธฐ๋ฅ์ด ๊ฐ๋ฐ ์ค์ด๋ค. ์๋ฅผ ๋ค์ดCSS Container Queries ์ฐ๋ฆฌ๋ Chrome๊ณผ Edge์์ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค. ๋ฐฉ๋ฒ์ ๊ธฐ๋ฅ ํ์ง๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ๊ฒ๋ค์ ํ์ฑํํ๋ ๊ฒ์ด๋ค.
๋ณธ๊ณ ๋ 2022๋ ๋ถํฐ ์ด๋ฌํ ๊ธฐ๋ฅ์ ๋ฐฐ์ฐ๊ณ ์ฌ์ฉํ ์ ์๋ ์๋ก์ด CSS ๊ธฐ๋ฅ์ ์๊ฐํ๋ ์์ ์๋ฆฌ์ฆ์ ์ผ๋ถ๋ถ์ด๋ค.
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(CSS:has(.parent ์ ํ๊ธฐ)๐ช), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/ingosteinke/css-hasparent-selectors-287cํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค