MYMONDAY.ai
서비스스튜디오도구데이터·포맷73CSS 생성기19색상·이미지10인코딩·보안10웹·SEO11개발·데브옵스10파일·내보내기18계산기6가이드

CSS 캐스케이드 레이어 빌더

레이어 스택을 만들고 순서를 바꾸며 어느 선언이 이기는지 확인한 뒤 @layer 순서 선언을 복사합니다.

  • 브라우저에서 처리
  • 가입 없음
  • 무료

도구 작업 공간

예제

레이어 스택

스택의 위쪽이 이깁니다. 핸들을 끌거나 화살표 버튼을 쓰세요.

우선순위 높음

  1. .card .btn적용됨
  2. main .btn.primary덮어써짐
  3. #app .btn덮어써짐
  4. #app .btn.primary덮어써짐

우선순위 낮음

최대 12개

어느 규칙이 이길까요?

모든 레이어가 같은 버튼의 배경색을 지정합니다

utilities 적용

우선순위 (강한 순)

  1. 1utilities.card .btn
  2. 2componentsmain .btn.primary
  3. 3base#app .btn
  4. 4reset#app .btn.primary

명시도와 상관없이 나중 레이어가 앞선 레이어를 이깁니다.

명시도는 같은 레이어 안의 규칙끼리만 비교하므로, 왼쪽에 적힌 선택자는 결과를 바꾸지 않습니다.

레이어 CSS

⌘/Ctrl + Enter로 복사
순서 + 블록
@layer reset, base, components, utilities;

@layer reset {
  /* reset styles */
}

@layer base {
  /* base styles */
}

@layer components {
  /* components styles */
}

@layer utilities {
  /* utilities styles */
}
레이어 수4
가장 낮은 우선순위reset
가장 높은 우선순위utilities

CSS 캐스케이드 레이어 빌더는 이름 있는 레이어 스택을 @layer 순서 선언문, 레이어별 빈 블록, 또는 @import ... layer() 줄로 바꿔 줍니다. 레이어를 위아래로 끌어 순서를 바꿉니다. 일반 선언에서 평면 이름은 스택의 맨 위가 가장 강하지만, 점으로 이은 하위 레이어는 부모 그룹의 고정된 자리와 하위 레이어보다 강한 부모 자체 선언을 반영해 일반 선언의 결과를 계산합니다.

캐스케이드 레이어를 쓰면 선택자 명시도를 올리거나 !important를 붙이지 않고도 어느 스타일 묶음이 이길지 정할 수 있습니다. reset, base, components, utilities 같은 구성에서는 클래스 하나짜리 유틸리티 규칙이 더 뒤의 레이어에 있다는 이유만으로 긴 컴포넌트 선택자를 이깁니다.

이름은 브라우저 안에서 처리되고 업로드되지 않습니다. 레이어 이름은 대문자와 framework.base 같은 점 표기 하위 레이어를 포함해 CSS 식별자라면 무엇이든 쓸 수 있습니다. 이름 없는 레이어는 만들지 않습니다.

사용 방법

  1. 스택 만들기

    예제에서 시작하거나 이름을 직접 고칩니다. 레이어는 12개까지 추가할 수 있습니다. 일반 선언의 평면 이름은 스택의 위쪽이 가장 강하고 아래쪽이 가장 약합니다. 점으로 이은 하위 레이어는 부모 그룹 안에 머무르므로 결과 패널에서 실제 순서를 확인하세요. 핸들을 끌거나 화살표 버튼으로 순서를 바꿉니다.

  2. 이름 규칙 지키기

    이름은 CSS 식별자여야 합니다. 영문자·숫자·하이픈·밑줄을 쓰고 숫자로 시작할 수 없습니다. 하위 레이어는 framework.base처럼 부모 이름 뒤에 점으로 잇습니다. 이름은 40자 이하이고 서로 달라야 합니다.

  3. 어느 규칙이 이기는지 보기

    모든 레이어가 같은 버튼의 배경색을 지정합니다. 레이어 밖 규칙을 켜거나 레이어에 !important를 붙이면 결과 패널에 이기는 규칙, 전체 우선순위, 그 이유가 나타납니다.

  4. 출력 복사하기

    순서 선언문과 블록, 순서 선언문만, @import 줄 중 형식을 골라 복사한 뒤 메인 스타일시트 맨 위에 붙여 넣습니다.

  5. 규칙을 레이어로 옮기기

    각 스타일 묶음을 해당 @layer 이름 { ... } 블록 안에 넣거나 외부 CSS를 직접 레이어로 가져옵니다.

작동 원리

레이어 순서가 명시도를 이기는 방식

CSS Cascading and Inheritance Level 5가 @layer를 도입했습니다. 일반 선언끼리 충돌하면 캐스케이드는 먼저 출처와 중요도를 비교하고, 그다음 레이어, 마지막으로 명시도를 비교합니다. 뒤쪽 레이어의 규칙은 선택자 명시도와 상관없이 앞쪽 레이어를 이기고, 명시도는 같은 레이어 안의 규칙끼리만 의미가 있습니다.

순서는 각 레이어 이름이 처음 나온 시점으로 정해집니다. @layer reset, base, components; 같은 선언문은 순서를 미리 확정하므로 이후 블록을 어떤 파일 순서로 써도 순위가 바뀌지 않습니다.

@layer reset, base, components, utilities;

@layer reset {
  /* reset styles */
}

레이어 밖 스타일과 !important

어떤 레이어에도 속하지 않은 스타일은 맨 마지막의 암묵적 레이어로 취급되어, 일반 선언에서는 이름 있는 모든 레이어를 이깁니다. !important 선언은 순서가 뒤집혀서 앞쪽 레이어의 important가 뒤쪽 레이어의 important를 이기고, 레이어 안의 important가 레이어 밖의 important를 이깁니다.

이 반전 덕분에 reset이나 외부 라이브러리 레이어가 중요한 선언을 이후 덮어쓰기로부터 지킬 수 있습니다.

선언 종류레이어끼리 이기는 쪽레이어 밖 스타일
일반가장 나중 레이어모든 레이어를 이김
!important가장 앞 레이어모든 레이어에 짐

이 도구가 받는 값

레이어 이름은 1개 이상 12개 이하의 고유한 값이어야 합니다. 각 이름은 점으로 이은 하나 이상의 CSS 식별자이고 40자 이하이므로 Base, _private, vendor.bootstrap은 유효하고 1st나 a..b는 유효하지 않습니다.

블록 형식은 각 이름을 @layer 이름 { /* 이름 styles */ }로 반복해서 적는데, 이는 같은 레이어를 다시 여는 것일 뿐 첫 선언문이 정한 순서를 바꾸지 않습니다. @import 형식은 레이어마다 @import url("이름.css") layer(이름); 한 줄을 쓰며 파일 이름에서는 점이 하이픈으로 바뀝니다.

실제 예시

고전적인 4단 레이어
입력
reset, base, components, utilities
출력
@layer reset, base, components, utilities;

@layer reset {
  /* reset styles */
}

@layer base {
  /* base styles */
}

@layer components {
  /* components styles */
}

@layer utilities {
  /* utilities styles */
}

도구를 처음 열었을 때의 기본 스택입니다. reset이 가장 낮고 utilities가 가장 높아서 스택 맨 위에 놓입니다.

대문자 이름과 하위 레이어
입력
Reset, framework.base
출력
@layer Reset, framework.base;

@layer Reset {
  /* Reset styles */
}

@layer framework.base {
  /* framework.base styles */
}

이 두 이름은 도구의 첫 버전에서는 거부되었습니다.

중복 이름은 거부
입력
base, base
출력
두 번째 레이어 이름 오류: 이미 같은 이름의 레이어가 있습니다.
숫자로 시작하는 이름은 거부
입력
1st, base
출력
첫 번째 레이어 이름 오류: 식별자로 입력해 주세요. 영문자·숫자·-·_를 쓰며 숫자로 시작할 수 없습니다. 하위 레이어는 framework.base처럼 점으로 잇습니다.

이름을 고칠 때까지 마지막으로 유효했던 CSS가 흐리게 남습니다.

레이어 하나도 가능
입력
reset, 순서만 형식
출력
@layer reset;

13번째 레이어는 레이어는 1~12개로 만들어 달라는 메시지와 함께 거부됩니다.

파일을 레이어로 가져오기
입력
reset, vendor.ui, @import 형식
출력
@layer reset, vendor.ui;
@import url("reset.css") layer(reset);
@import url("vendor-ui.css") layer(vendor.ui);

자주 하는 실수

  • 레이어 밖 CSS는 모든 레이어를 이깁니다

    레이어로 감싸지 않은 옛 스타일은 일반 선언에서 새 레이어를 모두 이깁니다. 레이어 규칙이 무시되는 것처럼 보이는 가장 흔한 이유입니다.

  • 순서는 처음 언급된 시점으로 정해집니다

    순서 선언문이 로드되기 전에 컴포넌트 파일이 components를 먼저 언급하면 그 레이어가 의도보다 앞 순위가 됩니다. 순서 선언문을 다른 CSS보다 먼저 두세요.

  • !important는 순위를 뒤집습니다

    important 선언에서는 레이어 순서가 반대로 적용되어, !important가 붙은 reset이 유틸리티를 막을 수 있습니다. 반전을 노리는 경우가 아니면 레이어 안에서 !important를 피하세요.

  • 레이어는 선택자를 격리하지 않습니다

    레이어는 충돌 해결에만 영향을 줍니다. 선택자는 여전히 어디에서나 일치하므로 컴포넌트로 스타일 범위를 제한해 주지는 않습니다. 그 용도에는 @scope 도구를 보세요.

  • 외부 CSS는 import 레이어가 필요합니다

    일반 <link>로 불러온 라이브러리 스타일시트는 레이어 밖이라 내 레이어를 이깁니다. 내 규칙보다 앞에서 @import url(lib.css) layer(vendor);로 레이어에 넣으세요.

자주 묻는 질문

CSS 캐스케이드 레이어란 무엇인가요?

@layer로 선언한 이름 있는 규칙 묶음으로, 캐스케이드가 선택자 명시도를 비교하기 전에 레이어 위치로 먼저 순서를 매깁니다. reset, 라이브러리, 컴포넌트, 유틸리티 사이의 우선순위를 조정하는 방법입니다.

첫 번째와 마지막 중 어느 레이어가 이기나요?

일반 선언에서는 마지막으로 선언된 레이어가 이깁니다. !important 선언에서는 처음 선언된 레이어가 이깁니다. 레이어 밖 스타일은 일반 규칙에서 모든 레이어를 이깁니다.

캐스케이드 레이어가 명시도를 대체하나요?

아니요. 같은 레이어 안의 충돌은 여전히 명시도가 정합니다. 레이어는 어느 묶음을 먼저 비교할지만 바꾸므로 명시도가 낮은 유틸리티가 명시도가 높은 컴포넌트 선택자를 이길 수 있습니다.

레이어는 몇 개가 적당한가요?

대부분의 프로젝트는 reset, base, components, utilities 같은 세 개에서 다섯 개면 충분하고 필요하면 앞에 vendor 레이어를 둡니다. 이 도구는 1~12개를 허용합니다.

중첩 레이어나 이름 없는 레이어도 쓸 수 있나요?

중첩 레이어는 됩니다. framework.base처럼 점으로 하위 레이어 이름을 지으면 순서 선언문, 블록, @import 줄에 그대로 쓰입니다. 이름 없는 레이어는 나중에 규칙을 더하려고 다시 참조할 수 없기 때문에 만들지 않습니다.

브라우저에서 캐스케이드 레이어가 지원되나요?

네, @layer는 2022년 초부터 현재의 Chrome, Edge, Firefox, Safari에서 지원됩니다. 그 이전 브라우저는 블록 전체를 건너뛰어 레이어 안 스타일이 적용되지 않으니 방문자 환경을 확인하세요.

마지막 업데이트: