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

CSS @scope 생성기

스코프 루트와 선택적 경계를 입력하면 컴포넌트 스타일을 넣을 @scope 블록이 완성됩니다.

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

도구 작업 공간

예제

스코프가 시작되는 요소입니다. 예: .card

스코프가 끝나는 지점입니다. 예: .card__footer. 비우면 하한 경계가 없습니다

어떤 요소까지 닿을까요?

샘플 페이지를 입력한 선택자로 실제 매칭한 결과입니다
  • 스코프 루트
  • 스코프 안
  • 경계에서 제외됨
  • 스코프 밖

@scope 규칙

⌘/Ctrl + Enter로 복사
CSS
@scope (.card) to (.card__footer) {
  :scope {
    /* the .card element itself */
  }
  a {
    /* only links below the root, outside the limit */
  }
}
스코프 루트0
스타일 적용 요소0
제외된 요소0

CSS @scope 생성기는 @scope 규칙의 머리 부분을 써 줍니다. 괄호 안의 스코프 루트와, 선택 사항인 to 뒤의 스코프 경계(limit)입니다. 출력은 컴포넌트 스타일을 넣을 자리표시 주석 또는 시작용 규칙이 있는 블록이라 선택자를 짧게 쓰면서도 스타일이 새어 나가지 않게 할 수 있습니다.

@scope는 카드, 댓글 스레드, 목차 같은 컴포넌트 스타일에 쓰도록 만들어졌습니다. 긴 BEM 이름 대신 @scope (.card) 안에서 img만 써도 .card 아래의 이미지에만 적용됩니다. .card__footer 같은 경계를 주면 그 푸터 하위 트리 직전에서 스타일이 멈춥니다.

입력한 내용은 브라우저 안에서 검사됩니다. 각 선택자는 비어 있지 않고, 120자 이하이고, 중괄호·세미콜론·줄바꿈이 없고, 괄호와 따옴표가 닫혀 있어야 합니다. 그다음 쉼표로 나눈 부분마다 지금 쓰는 브라우저의 선택자 파서로 확인하고, 결과 아래의 샘플 페이지도 같은 선택자로 색을 입히므로 스코프가 실제로 어디까지 닿는지 볼 수 있습니다.

사용 방법

  1. 스코프 루트 입력하기

    스코프가 시작되는 요소의 선택자를 .card나 [data-theme='dark']처럼 입력합니다. 필수입니다.

  2. 필요하면 스코프 경계 추가하기

    스코프가 끝나야 하는 지점의 선택자를 .card__footer처럼 입력합니다. 비워 두면 모든 자손을 포함하는 경계 없는 스코프가 됩니다.

  3. 규칙과 샘플 페이지 확인하기

    결과에 규칙이 나타나고, 그 아래 샘플 페이지가 입력한 선택자로 칠해집니다. 청록은 스코프 루트, 라임은 스코프가 닿는 요소, 빗금 분홍은 경계에서 잘려 나간 요소입니다. 입력이 올바르지 않으면 마지막으로 유효했던 규칙이 흐리게 남습니다.

  4. 블록 복사하기

    @scope 규칙을 복사해 스타일시트에 붙여 넣습니다. 자리표시 주석만 있는 빈 블록이 필요하면 시작용 규칙을 끄세요.

  5. 안쪽에는 짧은 선택자 쓰기

    시작용 규칙이나 자리표시 주석을 h2 { ... }나 :scope > img { ... } 같은 규칙으로 채웁니다. 이 선택자들은 루트를 기준으로 매칭됩니다.

작동 원리

루트, 경계, 도넛 스코프

@scope 규칙은 CSS Cascading and Inheritance Level 6에 정의되어 있습니다. 스코프에는 첫 번째 선택자에 일치하는 요소인 루트와 선택적인 경계가 있습니다. 경계 선택자에 일치하는 요소와 그 안쪽 전부가 제외되어 도넛 모양이 되고, 스타일은 구멍 바깥쪽에만 적용됩니다.

블록 안의 선택자는 스코프 루트를 기준으로 상대적으로 해석됩니다. 단독 img는 :where(:scope) img처럼 동작해서 루트에 대한 명시도를 더하지 않습니다. 스코프 규칙 안에서 :scope는 루트 요소 자신을 가리킵니다.

@scope (.card) to (.card__footer) {
  /* Scoped component styles */
}

캐스케이드의 스코프 근접도

캐스케이드에서 @scope는 명시도 다음, 소스 순서 앞에 스코프 근접도(scope proximity)라는 단계를 더합니다. 명시도가 같은 두 스코프 규칙이 같은 요소에 일치하면 DOM 트리에서 루트가 더 가까운 쪽이 이깁니다. 밝은 스코프 안에 어두운 스코프를 중첩하는 식의 테마를 선택자 가중치를 올리지 않고도 구현할 수 있습니다.

도구가 검증하는 것

두 입력 모두 120자 이하여야 하고 {, }, ;, 줄바꿈을 포함할 수 없으며 괄호와 따옴표가 짝이 맞아야 합니다. 경계는 비워도 되지만 루트는 비울 수 없습니다. 쉼표로 나눈 각 부분은 CSS.supports("selector(...)")로 확인하므로 figure, .embed는 유효한 경계이고 ..card는 거부됩니다. 점이 빠진 card는 <card> 요소를 뜻하는 올바른 타입 선택자라 통과하지만, 샘플 페이지에서 아무 요소에도 닿지 않는 것을 볼 수 있습니다.

입력필수비고
스코프 루트예120자 이하의 선택자 문자열
스코프 경계아니요to (경계)가 추가됨, 비우면 경계 없음
허용되지 않는 문자-{ } ; 와 줄바꿈
선택자 문법-쉼표로 나눈 각 부분이 브라우저에서 파싱되어야 함

실제 예시

푸터에서 멈추는 카드
입력
루트 `.card`, 경계 `.card__footer`, 시작용 규칙 켬
출력
@scope (.card) to (.card__footer) {
  :scope {
    /* the .card element itself */
  }
  a {
    /* only links below the root, outside the limit */
  }
}

도구를 처음 열었을 때의 기본 상태입니다. 샘플 페이지에서는 두 카드가 모두 루트이고 제목과 본문에 스타일이 적용되며, 푸터와 그 안의 링크는 제외됩니다.

경계 없는 기사 스코프
입력
루트 `.article`, 경계 비움, 시작용 규칙 끔
출력
@scope (.article) {
  /* Scoped component styles */
}
속성 루트와 선택자 목록 경계
입력
루트 `[data-theme='dark']`, 경계 `figure, .embed`, 시작용 규칙 끔
출력
@scope ([data-theme='dark']) to (figure, .embed) {
  /* Scoped component styles */
}

어두운 테마가 안에 중첩된 figure와 embed의 색까지 바꾸지 않아야 할 때 유용합니다.

중괄호는 거부
입력
루트 `.card{}`, 경계 비움
출력
루트 칸 오류: 중괄호·세미콜론·줄바꿈을 지워 주세요. 선택자는 규칙 블록이 아니라 괄호 안에 들어갑니다.

루트가 비어 있어도 거부되며 선택자를 입력해 달라는 메시지가 나옵니다.

닫히지 않은 대괄호
입력
루트 `.card[`, 경계 비움
출력
루트 칸 오류: 괄호나 대괄호, 따옴표가 닫히지 않았습니다.

선택자를 고칠 때까지 마지막으로 유효했던 규칙이 흐리게 남습니다.

자주 하는 실수

  • 브라우저 지원은 확인이 필요합니다

    Chrome과 Safari는 각각 2023년과 2024년 초부터 @scope를 지원했고 Firefox는 비교적 최근에 추가했습니다. 대체 수단 없이 쓰기 전에 최신 호환성 표를 확인하세요.

  • 경계는 그 요소 자체를 제외합니다

    경계 선택자에 일치하는 요소와 그 자손은 스코프의 스타일을 받지 않습니다. 자손만 빠진다고 생각했다가 경계 요소 자체의 스타일이 사라져서 당황하는 경우가 많습니다.

  • 스코프가 바깥 스타일을 막아 주지는 않습니다

    @scope는 내 규칙이 루트 밖으로 나가지 못하게 할 뿐, 전역 스타일이나 상속 속성이 안으로 들어오는 것은 막지 않습니다. 스타일시트 전체의 우선순위 정리에는 캐스케이드 레이어를 쓰세요.

  • 유효 여부는 브라우저에 따라 달라집니다

    지금 쓰는 브라우저의 선택자 파서로 확인하므로, 최신 엔진만 이해하는 선택자는 여기서 오류로 표시되어도 다른 곳에서는 동작할 수 있습니다. 점이 빠진 것은 오류가 아닙니다. card는 올바른 타입 선택자일 뿐이고 대부분의 페이지에서 아무것에도 일치하지 않습니다.

  • :scope를 루트로 쓰는 경우

    생성기는 :scope를 루트로 받아 @scope (:scope)를 써 주지만, 일반 스타일시트에서는 의미 있는 스코프 루트가 없습니다. 실제 선택자를 쓰세요.

자주 묻는 질문

CSS @scope는 무슨 일을 하나요?

규칙 묶음을 스코프 루트의 하위 트리로 제한하고, 원하면 아래쪽 경계에서 멈추게 합니다. 안쪽 선택자는 그 루트 기준으로 쓰기 때문에 BEM 방식 이름보다 짧고 명시도가 낮은 선택자로 충분합니다.

@scope와 Shadow DOM은 어떻게 다른가요?

Shadow DOM은 별도의 트리로 양방향 격리를 하지만, @scope는 일반 DOM에서 내 규칙이 적용되는 범위만 제한합니다. 바깥 스타일은 여전히 스코프 안의 요소에 닿을 수 있습니다.

@scope (.a) to (.b)는 무슨 뜻인가요?

.a의 자손에게 스타일을 적용하되 .b 요소와 그 안쪽은 제외한다는 뜻입니다. .b 아래 영역이 도려내진다고 해서 도넛 스코프라고 부릅니다.

스코프 근접도는 어떻게 작동하나요?

명시도 다음으로, DOM 트리에서 요소와 루트가 가장 가까운 스코프의 선언이 이깁니다. 그다음에야 소스 순서가 결정합니다.

루트나 경계에 선택자 목록을 쓸 수 있나요?

네. 두 칸 모두 쉼표로 이은 선택자를 받고 각 부분을 따로 검사하므로 figure, .embed가 동작합니다. 도구가 괄호를 이미 붙여 주니 따로 감싸지 마세요.

출력이 완성된 스타일시트인가요?

아니요. :scope 규칙과 하위 요소 예시 규칙이 들어 있는 @scope 블록이고, 시작용 규칙을 끄면 자리표시 주석만 있는 빈 블록입니다. 그 안에 직접 선언을 추가하세요.

마지막 업데이트: