-
CSS Cascading 잘하기CSS 2021. 2. 2. 01:33
커스텀 프로퍼티 소개
브라우저가 -webkit- 또는 -moz-와 같은 공급 업체 접두사를 사용하여 새 속성을 정의한 것과 같은 방식으로 -- 접두사를 사용하여 자체 사용자 지정 속성을 정의 할 수 있습니다.
Sass 또는 JavaScript의 변수와 마찬가지로 값의 이름을 지정하고 저장하고 검색하는 데 사용할 수 있지만 CSS의 다른 속성과 마찬가지로 DOM과 함께 계단식으로 상속되고 상속됩니다.
html { --brand-color: rebeccapurple; }
캡처 된 값에 액세스하기 위해 var () 함수를 사용합니다.
두 부분으로 구성되어 있습니다.
먼저 사용자 지정 속성의 이름과 속성이 정의되지 않은 경우 대체 항목입니다.
button { background: var(--brand-color, deeppink); }
이것은 이전 브라우저에 대한 지원 대체가 아닙니다.
브라우저가 사용자 정의 속성을 이해하지 못하는 경우 전체 var () 선언을 무시합니다.
대신 이것은 대체 글꼴 패밀리를 사용할 수 없을 때 정의하는 글꼴 스택과 유사하게 정의되지 않은 변수를 처리하는 기본 제공 방법입니다. 대체를 제공하지 않으면 기본값이 설정되지 않습니다.
"Stack" 소개
button { /* try Consolas, then Menlo, then Monaco, and finally monospace */ font-family: Consolas, Menlo, Monaco, monospace; /* try --state, then --button-color, then --brand-color, and finally deeppink */ background: var(--state, var(--button-color, var(--brand-color, deeppink))); }
스택 속성에 대한 중첩 구문이 부피가 커 보인다면 Sass와 같은 전처리기를 사용하여 더 간결하게 만들 수 있습니다.
html { /* The fallback value is "Helvetica, Arial, sans-serif" */ font-family: var(--my-font, Helvetica, Arial, sans-serif); }
"Scope" 정의
/* all links */ a { color: slateblue; } /* only links inside a section */ section a { color: rebeccapurple; } /* only links inside an article */ article a { color: deeppink; }
light 테마와 .dark 테마가 있다고 가정 해 보겠습니다.
루트 요소에서 이러한 클래스를 사용하여 페이지 전체 기본값을 정의 할 수 있지만 다양한 방식으로 중첩 된 특정 구성 요소에 적용 할 수도 있습니다. 이를 근접성이라고 합니다.
.dark { background: black; color: white; } .light { background: white; color: black; } .dark button { background: plum; color: black; } .light button { background: rebeccapurple; color: white; }
일부 버튼은 .light 및 .dark 조상과 함께 두 컨텍스트 모두에 있습니다.
이 경우에 우리가 원하는 것은 가장 가까운 테마가 (상속 근접 동작)을 대신하는 것이지만 대신 우리가 얻는 것은 첫 번째 (캐스케이드 동작)를 재정의하는 두 번째 선택기입니다.
두 선택자의 특이성이 동일하므로 소스 순서가 승자를 결정합니다.
사용자 지정속성 및 근접성
button { background: var(--btn-color, rebeccapurple); color: var(--btn-contrast, white); }
이제 컨텍스트를 기반으로 이러한 값을 설정할 수 있으며 근접성과 상속을 기반으로 적절한 조상으로 범위를 지정할 것입니다.
.dark { --btn-color: plum; --btn-contrast: black; } .light { --btn-color: rebeccapurple; --btn-contrast: white; }
See the Pen 3 - Scope: Child Elements by Miriam Suzanne (@mirisuzanne) on CodePen.
컴포넌트 소유권
때로는 근접성이 범위를 정의하기에 충분하지 않습니다. JavaScript 프레임 워크가 "범위가 지정된 스타일"을 생성 할 때 특정 개체 요소 소유권을 설정합니다. "탭 레이아웃"구성 요소는 탭 자체를 소유하지만 각 탭 뒤에있는 콘텐츠는 소유하지 않습니다.
이것은 BEM 규칙이 복잡한 .block__element 클래스 이름에서 캡처하려고 시도하는 것이기도합니다.
html { --background--global: white; --color--global: black; --btn-color--global: rebeccapurple; --btn-contrast--global: white; }
이 기본 글로벌 테마는 이제 우리가 참조하려는 모든 곳에서 사용할 수 있습니다. 전경색과 배경색을 적용하는 데이터 테마 속성으로이를 수행합니다. 전역 값이 기본 폴백을 제공하기를 원하지만 특정 테마로 재정의하는 옵션도 원합니다. 이것이 바로 "스택"이 들어오는 곳입니다.
[data-theme] { /* If there's no component value, use the global value */ background: var(--background--component, var(--background--global)); color: var(--color--component, var(--color--global)); }
이제 *-component 속성을 전역 속성의 역으로 설정하여 반전된 구성 요소를 정의 할 수 있습니다.
[data-theme='invert'] { --background--component: var(--color--global); --color--component: var(--background--global); }
html { --background--global: white; --color--global: black; --btn-color--global: rebeccapurple; --btn-contrast--global: white; } [data-theme] { --background--component: initial; --color--component: initial; --btn-color: initial; --btn-contrast: initial; background: var(--background--component, var(--background--global)); color: var(--color--component, var(--color--global)); } [data-theme='invert'] { --background--component: var(--color--global); --color--component: var(--background--global); --btn-color: plum; --btn-contrast: var(--color--global); } button { background: var(--btn-color, var(--btn-color--global)); color: var(--btn-contrast, var(--btn-contrast--global)); }
전역속성을 사용하여 각각 초기화 후에 스타일을 입혀보았습니다.
origins 정의
사용자 정의 속성 "스택"을 만들 때 매우 유사한 동작을 구축합니다.
기존 오리진을 사용자 지정 속성 스택으로 나타내려면 다음과 같습니다.
.origins-as-custom-properties { color: var(--browser-important, var(--user-important, var(--author-important, var(--author, var(--user, var(--browser)))))); }
button { background: var(--btn-state, var(--btn-type, var(--btn-default))); }
button { --btn-default: rebeccapurple; background: var(--btn-state, var(--btn-type, var(--btn-default))); color: white; } :disabled { --btn-state: dimgray; } .danger { --btn-type: maroon; }
출처 : css-tricks.com/using-custom-property-stacks-to-tame-the-cascade/
'CSS' 카테고리의 다른 글
스크롤 최상단으로 이동 css vs js (0) 2021.02.07 SVG 라이브러리 (RoughNotation) 선긋기, 하이라이트 (0) 2021.02.06 [Modern CSS] 3탄 CSS만으로 반응형 풀사이즈 이미지 크기 만들기 (0) 2021.01.31 [css/scss] 그리드로 육각형 레이아웃 만들기 (0) 2021.01.31 [Greensock] GreenSock ScrollTrigger 플러그인 (0) 2021.01.30