:where() CSS pseudo selector
Published at 2024. 5. 19.
7 min read
Table of Contents
๋ค์ด๊ฐ๊ธฐ ์ ์
๋ค์์ ์งง์ HTML, CSS code ๋ฅผ ๋ณด๊ณ ๋ ๋๋ง ๊ฒฐ๊ณผ๋ฅผ ์์ธกํด๋ณด์. MDN์์ ๊ฐ์ ธ์จ ์์ ๋ค.
<ol>
<li>Saturn</li>
<li>
<ul>
<li>Mimas</li>
<li>Enceladus</li>
<li>
<ol>
<li>Voyager</li>
<li>Cassini</li>
</ol>
</li>
<li>Tethys</li>
</ul>
</li>
<li>Uranus</li>
<li>
<ol>
<li>Titania</li>
<li>Oberon</li>
</ol>
</li>
</ol>
ol {
list-style-type: upper-alpha;
color: darkblue;
}
:where(ol, ul, ul:unsupported) :where(ol, ul) {
color: green;
}
:where(ol, ul) :where(ol, ul) ol {
list-style-type: lower-greek;
color: chocolate;
}
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
๋งค์ฐ ๊ฐ๋จํด ๋ณด์ด๋ ์์ ์ง๋ง, :where()
์ ์ฒ์ ๋ง์ฃผํ๋ค๋ฉด ํผ๋์ค๋ฌ์ธ ์ ์๋ค.
์์ ๋ฅผ ์ดํดํ๊ธฐ ์ํด MDN์ ์ค๋ช
๋ถํฐ ๋ค์ฌ๋ค๋ณด์.
:where()
๋ง์น SQL query ๋ฌธ์ ์ฐ์ด๋ WHERE
๊ฐ์ ๋๋์ ์ค๋ค. MDN์ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ํ์๋ค.
The
:where()
CSS pseudo-class function takes a selector list as its argument, and selects any element that can be selected by one of the selectors in that list. The difference between:where()
and:is()
is that:where()
always has 0 specificity, whereas:is()
takes on the specificity of the most specific selector in its arguments.
:where()
๊ณผ :is()
์ ์ฐจ์ด์ ์ ๊ดํ ์ธ๊ธ, CSS specificity ์ ๊ดํ ์ธ๊ธ์ด ๋์ ๋๋ค.
์ฐ์ , :where()
selector ์ ์ญํ ์ ํด๋น selector ์ ์ธ์๋ก ์ฃผ์ด์ง selector list ๋ค ์ค์ ํ๋๋ผ๋ ๋ง๋๊ฒ ์์ผ๋ฉด ๊ทธ๊ฒ์ ์ ํํ๋ ๊ฒ์ด๋ค.
์ค๋ช
๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ ์ ์์ผ๋ ๋ด๊ฐ ์ค์ ๋ก Open Props
์ style์ override ํด์ผ ํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ ธ์ ๋ดค๋ค.
/* Open Props ์ visited anchor tag ์ ๋ํ default style */
:where(a):where([href]):where(:visited) {
color: var(--brand);
text-decoration-color: var(--brand);
}
/* ์์ selector ๋์ ๋ค์์ฒ๋ผ ์์ฑํด๋ ๋์ผํ๋ค */
a[href]:visited {
color: var(--brand);
text-decoration-color: var(--brand);
}
MDN์ ์ค๋ช
์ฒ๋ผ :where()
selector ๋ ์ธ์๋ก ์ฃผ์ด์ง selector list ์ค์ ํ๋๋ผ๋ ์ผ์นํ๋ฉด ๊ทธ ์์๋ฅผ ์ ํํ๋ค.
์์ ์์ ์์๋ a
ํ๊ทธ์ด๋ฉด์ href
attribute ๊ฐ ์กด์ฌํ๊ณ :visited
pseudo class ๋ฅผ ๋ง์กฑํ๋ ์์๋ฅผ ์ ํํ๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ ์ฌ์ด์๋ ์์ ์ ํ์ ๋ฐฉ์ ์ด์ธ์ ์ด๋ค ์ฐจ์ด๊ฐ ์๋ ๊ฒ์ผ๊น?
๋ด๊ฐ ์๊ฐํ๊ธฐ์ ํต์ฌ์ CSS specificity ์ ์๋ค. :where()
pseudo selector ๋ specificity ๊ฐ 0
์ด๋ค.
์ฆ, :where(a):where([href]):where(:visited) ๋ผ๋ selector ์ specificity ๋ 0์ผ๋ก ๊ณ์ฐ์ด ๋๋ค๋ ๊ฒ์ด๋ค.
Specificity ๊ฐ 0์ด๋ผ๋ ๊ฒ์, ํด๋น selector ๋ฅผ ๋ค๋ฅธ selector ๋ก ์ฝ๊ฒ ๋ฎ์ด์ธ ์(override) ์๋ค๋ ๋ป์ด๋ค.
๊ทธ๋์ ์ถ์ธก์ปจ๋, Open Props
์์๋ ๋ณธ์ธ๋ค์ ๋์์ธ ์์คํ
์ ๊ฐ์ ธ๋ค ์ฐ๋ ๊ฐ๋ฐ์๋ค์ด !important
๋ฅผ ์ฐ์ง ์๊ณ ๋ ์์ฝ๊ฒ default style ์ ์์ ํ ์ ์๋๋ก :where()
์ ํค๋นํ๊ฒ ์ฌ์ฉํ ๊ฒ์ด ์๋๊ฐ ์ถ๋ค.
MDN ์์ ์ดํด
๊ทธ๋ผ ๋ค์ MDN ์์ ๋ก ๋์์์ ๋ ๋๋ง ๊ฒฐ๊ณผ๋ฌผ์ ์ดํดํด๋ณด์.
CSS ๋ฅผ ํ ๋ถ๋ถ์ฉ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค. ์ค๋ช ์ ํธ์๋ฅผ ์ํด ๊ฐ CSS selector ์ ๋ฒํธ๋ฅผ ๋ถ์๋ค.
/* 1๋ฒ */
/* ol tag selector => specificity ๋ (0, 0, 1) */
ol {
list-style-type: upper-alpha;
color: darkblue;
}
/* 2๋ฒ */
/* ol, ul, ul:unsupported ๋ด๋ถ์ ์กด์ฌํ๋ ๋ชจ๋ ol, ul tag ๋ฅผ ๊ฐ๋ฆฌํค๋ selector => specificity ๋ (0, 0, 0) */
/* (ol ol), (ol ul), (ul ol), (ul ul) ์ผ์ด์ค๋ฅผ ๋ชจ๋ ์์ฐ๋ฅธ๋ค */
/* ul:unsupported ๋ ๋ค์ ์น์
์์ ๋ค๋ฃฌ๋ค */
:where(ol, ul, ul:unsupported) :where(ol, ul) {
color: green;
}
/* 3๋ฒ */
/* ol, ul ์์ ol, ul ์์ ol tag ๋ฅผ ๊ฐ๋ฆฌํค๋ selector => specificity ๋ (0, 0, 1) */
/* (ol ol ol), (ol ul ol), (ul ol ol), (ul ul ol) ์ผ์ด์ค๋ฅผ ๋ชจ๋ ์์ฐ๋ฅธ๋ค */
:where(ol, ul) :where(ol, ul) ol {
list-style-type: lower-greek;
color: chocolate;
}
์ด์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ณด๋ฉด์ ํ ๋ถ๋ถ์ฉ ์ดํดํด๋ณด์.
- 1๋ฒ selector ์ ์ํด
Saturn
,Uranus
,Titania
,Oberon
์ font color ๋darkblue
๊ฐ ๋๋ค. - 2๋ฒ selector ์ ์ํด
Mimas
,Enceladus
,Tethys
์ font color ๋green
์ด ๋๋ค. - 3๋ฒ selector ์ ์ํด
Voyager
,Cassini
์ font color ๋chocolate
์ด ๋๋ค.
1๋ฒ selector ์ ์ถฉ๋์ด ์๊ธฐ์ง๋ง 1๋ฒ, 3๋ฒ selector ์ specificity ๋ชจ๋(0, 0, 1)
์ด๋ฏ๋ก ๋ ๋์ค์ ์ ์ธ๋ 3๋ฒ selector ์ ์คํ์ผ๋ก ๋ฎ์ด์์์ง๋ค.
์ค์ ๋ก 3๋ฒ selector ๋ฅผ 1๋ฒ selector ๋ณด๋ค ๋จผ์ ์ ์ธํ์ฌ ํ ์คํธ ํด๋ณด๋ฉดVoyager
,Cassini
์ font color ๊ฐ darkblue ๊ฐ ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Forgiving Selector Parsing
:where()
pseudo selector ์ ๊ดํด ์์๋ณด๋ฉด์ ์ถ๊ฐ์ ์ผ๋ก ์๊ฒ๋ ๋ถ๋ถ์ด ์๋๋ฐ, Forgiving Selector Parsing ์ด๋ผ๋ ๊ฐ๋
์ด๋ค.
์ด ๊ฐ๋
์ :where()
๊ณผ :is()
pseudo selector ์๋ง ์กด์ฌํ๋ ๊ฐ๋
์ด๋ค.
์ด๋ ค์ธ ๊ฒ์ ์๋ค.
:where()
๊ณผ :is()
์ ์ธ์๋ก selector list ๋ฅผ ์ ๋ฌํด์คฌ์ ๋, ์ ํจํ์ง ์์(invalid) selector ๊ฐ ์์ฌ์๋๋ผ๋ ์ ๋๋ก ๋์ํ๋ค๋ ๋ป์ด๋ค.
/* ์๋์ฒ๋ผ ์์ฑํ๋ฉด ':unsupported' pseudo class ๋ฅผ ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ์์๋ ์ ์ฒด selector ๊ฐ ๋จนํต์ด ๋๋ค. */
/* ์ฆ, :valid ์ ๋ํ selector ๋ ๊ฐ์ด ๋ฌด์๋๋ค */
:valid,
:unsupported {
/* โฆ */
}
/* ํ์ง๋ง ์๋์ฒ๋ผ ์์ฑํ๋ฉด ':unsupported' pseudo class ๋ฅผ ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ๋ผ๋ ':valid' ์ ๋ํ selector ๋ ๋์ํ๋ค */
:where(:valid, :unsupported) {
/* โฆ */
}