CSS 함수 및 믹스인 모듈

W3C 최초 공개 워킹 드래프트,

이 문서에 대한 추가 정보
이 버전:
https://www.w3.org/TR/2025/WD-css-mixins-1-20250515/
최신 공개 버전:
https://www.w3.org/TR/css-mixins-1/
에디터스 드래프트:
https://drafts.csswg.org/css-mixins/
히스토리:
https://www.w3.org/standards/history/css-mixins-1/
피드백:
CSSWG 이슈 저장소
에디터:
Miriam E. Suzanne (초청 전문가)
Tab Atkins-Bittner (Google)
이 명세에 대한 수정 제안:
GitHub 에디터

요약

이 모듈은 저자가 사용자 정의 함수를 정의할 수 있는 기능을 제공합니다. 이는 매개변수화된 사용자 정의 속성과 유사하게 동작합니다. 저자는 CSS 값과 조건부 규칙의 전체 기능을 활용할 수 있습니다. 또한 전체 속성 블록을 다른 규칙에 매개변수화된 대체로 삽입하는 CSS 규칙 믹스인에 대한 초기 형태의 아이디어도 정의합니다.

CSS는 구조화된 문서(HTML, XML 등)를 화면, 인쇄물 등에서 렌더링하는 방법을 서술하는 언어입니다.

이 문서의 상태

이 섹션은 발행 시점에 이 문서의 상태를 설명합니다. 최신 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 색인 https://www.w3.org/TR/에서 볼 수 있습니다.

이 문서는 CSS 작업 그룹권고안 트랙을 사용하여 최초 공개 워킹 드래프트로 발행한 것입니다. 최초 공개 워킹 드래프트로 발행되었다고 해서 W3C 및 회원의 지지를 의미하지는 않습니다.

이 문서는 초안이며, 언제든지 업데이트, 교체 또는 폐기될 수 있습니다. 진행 중인 작업 외에는 이 문서를 인용하는 것이 적절하지 않습니다.

피드백은 GitHub 이슈 등록(권장)에 남겨주세요. 등록 시 제목에 “css-mixins”을 포함해 주시기 바랍니다. 예시: “[css-mixins] …코멘트 요약…”. 모든 이슈와 코멘트는 아카이브에 남습니다. 또는 피드백은 (아카이브됨) 공개 메일링 리스트 www-style@w3.org로 보낼 수 있습니다.

이 문서는 2023년 11월 3일 W3C 프로세스 문서에 따라 관리됩니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹이 작성했습니다. W3C는 해당 그룹 산출물과 관련하여 제출된 특허 공개 목록을 공개하며, 해당 페이지에는 특허 공개 방법 안내도 포함되어 있습니다. 특정인이 실제로 특허를 알고 있고 그 특허가 필수 청구항을 포함한다고 판단되는 경우, W3C 특허 정책 6항에 따라 정보를 공개해야 합니다.

1. 소개

이 섹션은 규범적이지 않습니다.

참고: 현재 이 명세에서는 CSS 값 수준에서 동작하는 사용자 정의 함수만 정의합니다. 추후 스타일 규칙 수준에서 동작하는 "믹스인"도 정의될 예정입니다.

사용자 정의 속성은 저자가 한 곳에서 유용하고 때로는 복잡한 값을 정의하고 스타일시트 전반에 재사용할 수 있는 강력한 기능을 제공합니다. 이러한 값은 문서 전체 또는 미디어 쿼리나 기타 조건에 따라 달라질 수 있어 매우 유연하고 반응성이 높습니다.

하지만 그 값은 정의 시점에 고정되며, 이전 정의를 완전히 덮어쓰기 전에는 변경할 수 없습니다: --shadow: 2px 2px var(--shadow-color) 선언은 해당 요소에서 선언된 --shadow-color 값을 사용하고, 이후 자손 요소에서 --shadow-color를 변경해도 그 요소의 --shadow 값에는 영향을 주지 않습니다; --shadow가 정의된 위치의 그림자 색상을 계속 사용합니다. 이는 이처럼 복합 변수(composite variable)를 많이 사용하는 저자들에게 흔히 혼란을 야기합니다.

사용자 정의 함수사용자 정의 속성과 동일한 강력함을 제공하지만, 매개변수화가 가능합니다: 사용자 정의 속성 정의와 같은 유연성과 조건부 기능을 가지면서도, 다른 사용자 정의 속성(또는 명시적으로 인자)에서 사용 시점에 값을 가져옵니다. 예를 들어, --shadow 사용자 정의 속성 대신, --shadow() 사용자 정의 함수를 다음과 같이 정의할 수 있습니다:

@function --shadow(--shadow-color <color> : inherit) {
  /* --shadow-color 인자가 전달되지 않거나,
     <color>로 정상적으로 파싱되지 않으면,
     대신 해당 요소의 --shadow-color *속성*을 사용 */

  /* var(--shadow-color)는 --shadow-color 파라미터를 참조하며,
     사용자 정의 속성을 참조하는 것이 아니지만,
     여전히 보통처럼 폴백 값을 사용할 수 있음 */
  result: 2px 2px var(--shadow-color, black);
}

.foo {
  --shadow-color: blue;
  box-shadow: --shadow(); /* 파란 그림자 생성 */
  /* 또는 */
  box-shadow: --shadow(blue);
}

2. 사용자 정의 함수 정의

사용자 정의 함수는 고급 사용자 정의 속성으로 볼 수 있습니다. 단일 고정 값으로 대체되는 대신, 함수 파라미터 및 호출 시점의 사용자 정의 속성 값을 기반으로 대체 값을 계산합니다. 사용자 정의 속성var() 문법 대신, 사용자 정의 함수<dashed-function> 문법으로 호출되며, 추가 값을 인자로 전달할 수 있습니다.

값을 반전시키는 간단한 사용자 정의 함수는 다음과 같이 정의할 수 있습니다:
@function --negative(--value) {
  result: calc(-1 * var(--value));
}

그리고 이 함수는 선언에서 --negative()로 참조할 수 있습니다:

html {
  --gap: 1em;
  padding: --negative(var(--gap));
  /* 또는 값을 직접 전달할 수도 있음: */
  padding: --negative(1em);
}

<dashed-function>임의 치환 함수이며, var()와 유사합니다. 속성 값에 존재하면 파싱 시점에는 유효하다고 간주되며, 임의 치환이 발생한 후 계산값(computed-value) 시점에 평가 및 파싱됩니다.

2.1. @function 규칙

@function 규칙은 사용자 정의 함수를 정의하며, 이름, 파라미터 목록, 함수 본문, 그리고 선택적으로 반환 타입(문법 정의로 기술됨)을 포함합니다.

함수 파라미터는 이름(<custom-property-name>), 선택적으로 파라미터 타입(문법 정의로 기술됨), 그리고 선택적으로 기본값으로 구성됩니다.

<@function> = @function <function-token> <function-parameter>#? )
  [ returns <css-type> ]?
{
  <declaration-rule-list>
}

<function-parameter> = <custom-property-name> <css-type>? [ : <declaration-value> ]?
<css-type> = <syntax-component> | <type()>
<type()> = type( <syntax> )

2.1.1. 함수 서두

<function-token> 생성식은 <dashed-ident>처럼 반드시 두 개의 하이픈(U+002D HYPHEN-MINUS)으로 시작해야 하며, 그렇지 않으면 정의가 무효입니다.

생성된 사용자 정의 함수의 이름은 <function-token>의 이름으로, 선택적 함수 파라미터<function-parameter> 값으로 (기본값: 빈 집합), 선택적 반환 타입returns 키워드 뒤의 <css-type>으로 (기본값: type(*)) 지정됩니다.

<css-type>함수 파라미터 또는 반환 타입에서 단일 <syntax-component>로 기술될 수 있다면, type() 함수는 생략할 수 있습니다:
@function --foo(--a <length>) { /* ... */ }
@function --foo(--a <color>) { /* ... */ }
@function --foo(--a <length>+) { /* ... */ }

하지만, <syntax>와 같이 <syntax-combinator>가 필요한 경우에는 type() 함수로 감싸야 합니다:

@function --foo(--a type(<number> | <percentage>)) { /* ... */ }

@function 규칙의 이름은 트리 범위 이름입니다. 동일한 이름의 @function이 둘 이상 존재할 경우, 더 강한 계단식 레이어의 규칙이 우선하며, 같은 레이어 내에서는 나중에 정의된 규칙이 우선합니다.

함수 파라미터에 동일한 <custom-property-name>이 두 번 이상 포함되면, 해당 @function 규칙은 무효입니다.

2.1.2. 함수 본문

@function 규칙의 본문은 조건부 그룹 규칙(예: @media)을 허용합니다. 또한 다음 기술자를 허용합니다:

알 수 없는 기술자는 무효로 간주되어 무시되지만, @function 규칙 자체는 무효가 아닙니다.

2.2. result 기술자

이름: result
대상: @function
값: <declaration-value>?
초기값: n/a (본문 참조)

result 기술자는 함수를 평가할 때 사용자 정의 함수가 반환하는 결과를 정의합니다. var() 함수를 사용해 함수 파라미터, 지역 변수, 그리고 <dashed-function>을 통해 다른 사용자 정의 함수도 참조할 수 있습니다.

result 기술자 자체는 타입이 없지만, 해결된 값은 치환<dashed-function>의 타입 검사를 받습니다.

2.3. 인자 및 지역 변수

이 섹션은 비규범적입니다.

사용자 정의 함수함수 본문 내에서 var() 함수는 지역 변수(함수 본문에 정의된 사용자 정의 속성), 함수 인자(함수에 전달된 값 또는 기본값), 그리고 호출 위치(요소 또는 다른 사용자 정의 함수)에 정의된 사용자 정의 속성에 접근할 수 있습니다.

이 목록에서, 앞에 있는 것이 같은 이름일 경우 "이깁니다" — 만약 지역 변수 --foo가 있으면 var(--foo)는 그 지역 변수로 치환되고, 인자나 외부에서 정의된 사용자 속성으로 치환되지 않습니다. 다른 값들도 접근은 가능합니다: --foo 지역 변수를 initial로 설정하면 그 인자 값으로, inherit로 설정하면 호출 위치의 --foo 사용자 속성 값으로 처리됩니다.

사용자 정의 함수는 상위 호출 스택의 지역 변수함수 인자에도 접근할 수 있습니다:
@function --outer(--outer-arg) {
  --outer-local: 2;
  result: --inner();
}
@function --inner() returns <number> {
  result: calc(var(--outer-arg) + var(--outer-local));
}
div {
  z-index: --outer(1); /* 3 */
}

이와 유사하게, 사용자 정의 속성도 자동으로 사용할 수 있습니다:

@function --double-z() returns <number> {
  result: calc(var(--z) * 2);
}
div {
  --z: 3;
  z-index: --double-z(); /* 6 */
}

하지만 함수 인자사용자 정의 속성을 "가린다(shadow)", 그리고 지역 변수는 둘 다를 "가린다":

@function --add-a-b-c(--b, --c) {
  --c: 300;
  result: calc(var(--a) + var(--b) + var(--c));
  /* 호출 위치의 --a 사용자 정의 속성,
     함수 인자의 --b,
     그리고 지역 변수의 --c를 사용 */
}
div {
  --a: 1;
  --b: 2;
  --c: 3;
  z-index: --add-a-b-c(20, 30); /* 321 */
}

3. 사용자 정의 함수 사용

사용자 정의 속성의 값이 var()로 다른 속성 값에 치환될 수 있는 것처럼, 사용자 정의 함수의 평가 결과도 <dashed-function>으로 속성 값에 치환할 수 있습니다.

<dashed-function>은 함수 이름이 두 개의 하이픈(U+002D HYPHEN-MINUS)으로 시작하는 함수형 표기입니다. 그 인자 문법은 다음과 같습니다:

<dashed-function> = --*( <declaration-value>#? )

<dashed-function>var()가 허용되는 위치에서만 사용할 수 있습니다.

속성에 하나 이상의 <dashed-function>이 포함되어 있으면, 해당 속성의 전체 문법은 파싱 시점에 항상 유효하다고 간주됩니다. 계산값(computed-value) 시점에 모든 <dashed-function>치환되어야 하고, 그 후 속성의 문법과 검증됩니다.

참고: 사용자 정의 함수의 본문 내에서 var() 함수는, <dashed-function>이 사용된 요소에서와는 다르게 해석될 수 있습니다. § 3.1 사용자 정의 함수 평가 참고.

<dashed-function>은 어떤 컨텍스트에서 평가됩니다: 요소의 속성 값에서 (또는 @keyframes 등 결국 요소의 속성처럼 처리되는 기술자에서), 혹은 다른 사용자 정의 함수의 함수 본문에서 "가상의" 요소에 대해 기술자에서. 어느 경우든, 이것은 호출 컨텍스트를 제공하며, 여기에는 <dashed-function>이 포함된 속성/기술자 이름과, 그 속성/기술자가 적용되는 요소(또는 "가상의" 요소)가 포함됩니다.

호출 컨텍스트<dashed-function> 평가에 의해 중첩될 때, 호출 컨텍스트루트 요소는 호출 컨텍스트 스택의 최상위 실제 요소입니다.

dashed function 치환 dashed functionarguments 목록과 함께 수행하려면:
  1. functiondashed function의 이름으로 트리 범위 참조로 역참조합니다. 해당 이름이 존재하지 않으면 보장된-무효 값을 반환합니다.

  2. arg마다 arguments에서 임의 치환 함수를 치환한 뒤 arg를 그 결과로 대체합니다.

    참고: 일부(또는 모든) 인자가 보장된-무효 값이 될 수 있으며, 이 경우 기본값(있다면)이 사용됩니다.

  3. dashed function이 요소의 속성에서 치환되는 경우, calling context를 해당 요소와 속성으로 구성합니다.

    그 외에는 "가상의 요소"에서 다른 사용자 정의 함수를 평가할 때 기술자에서 치환됩니다. calling context를 해당 "가상의 요소"와 기술자로 구성합니다.

  4. 사용자 정의 함수 평가function, arguments, calling context로 수행하고, 결과 값의 동등 토큰 시퀀스를 반환합니다.

쉼표가 포함된 값을 인자로 전달할 때는, 중괄호 {}로 감싸면 하나의 인자로 전달할 수 있습니다:
@function --max-plus-x(--list, --x) {
  result: calc(max(var(--list)) + var(--x));
}
div {
  width: --max-plus-x({ 1px, 7px, 2px }, 3px); /* 10px */
}
다음에서 --foo()는 자기 자신과 순환(cycle)을 이룹니다:
@function --foo(--x) {
  result: --foo(10);
}

비슷하게, --bar()도 자기 자신과 순환되지만, --x 지역 변수가 result에서 결코 참조되지 않아도 마찬가지입니다:

@function --bar() {
  --x: --bar();
  result: 1;
}

하지만 --baz()는 아래 예시에서는 자기 자신과 순환되지 않습니다. result 선언을 @media 규칙 내에서 평가하지 않기 때문입니다:

@function --baz(--x) {
  @media (unknown-feature) {
    result: --baz(42);
  }
  result: 1;
}
아래 예에서 --baz() 함수는 순환에 걸리지 않습니다: var(--x)var(--y)가 함수 본문에 있어도, 각각 함수 인자지역 변수를 참조할 뿐입니다. 사용자 정의 속성 --x--y는 모두 --baz() 함수를 참조하지만, 괜찮습니다: 해당 사용자 정의 속성--baz() 함수 내에서 참조되지 않기 때문입니다.
@function --baz(--x) {
  --y: 10px;
  result: calc(var(--x) + var(--y));
}

div {
  --x: --baz(1px);
  --y: --baz(2px);
  width: var(--x);  /* 11px */
  height: var(--y); /* 12px */
}

3.1. 사용자 정의 함수 평가

사용자 정의 함수는 본질적으로 함수 본문을 스타일 규칙처럼 가상의 요소에 적용한다고 가정하고, 일반적인 스타일 해석을 수행한 뒤, 그 가상의 요소의 result 기술자 값을 반환함으로써 평가됩니다. 가상의 요소는 호출 컨텍스트의 자식처럼 모든 사용자 정의 속성 값을 "상속"하고, 함수 인자가 동일 이름의 "상속된" 사용자 속성 값을 덮어씁니다.

사용자 정의 함수 평가 custom function호출 컨텍스트 calling context와 CSS 값 목록 arguments로 평가하여 CSS 값을 반환하려면:
  1. substitution context를 «"function", custom function»로 하는 치환 컨텍스트로 설정합니다.

    참고: 트리-스코프로 인해, 동일 함수명이 스택에 여러 번 나타날 수 있으며 서로 다른 사용자 정의 함수를 참조할 수 있습니다. 그래서 사용자 정의 함수 그 자체가 치환 컨텍스트에 포함됩니다. 단순히 이름만이 아니라.

  2. 가드 substitution context로 이후 알고리즘을 진행합니다. substitution context순환적으로 표시되었다면, 보장된-무효 값을 반환합니다.

  3. arguments의 항목 수가 custom function함수 인자 수보다 많으면 보장된-무효 값을 반환합니다.

  4. registrations를 빈 사용자 정의 속성 등록 집합으로 설정합니다.

  5. 함수 인자마다 해당 이름으로, 인자 타입 문법, 상속 플래그 true, 초기값 없음으로 사용자 정의 속성 등록을 생성해 registrations에 추가합니다.

  6. custom function반환 타입이 있으면, 이름 "return"(일반 등록 명명 규칙 위반), 반환 타입 문법, 상속 플래그 false, 초기값 없음으로 사용자 정의 속성 등록을 생성해 registrations에 추가합니다.

  7. argument rule을 빈 스타일 규칙으로 설정합니다.

  8. 함수 인자에 대해:

    1. arg valuearguments의 해당 인자 값, 없으면 보장된-무효 값으로 설정합니다.

    2. default value를 인자의 기본값으로 설정합니다.

    3. 해당 이름과 first-valid(arg value, default value) 값을 갖는 사용자 정의 속성argument rule에 추가합니다.

  9. 함수 스타일 해석custom function, argument styles, registrations, calling context로 수행합니다. argument styles를 결과로 설정합니다.

  10. body rulecustom function함수 본문스타일 규칙으로 설정합니다.

  11. registrations의 각 사용자 정의 속성 등록에 대해, 초기값을 argument styles의 해당 값으로, 문법을 universal syntax definition으로 설정하고, argument styles의 속성 이름과 값을 갖는 사용자 정의 속성body rule에 맨 앞에 추가합니다.

  12. 함수 스타일 해석custom function, body rule, registrations, calling context로 수행합니다. body styles를 결과로 설정합니다.

  13. 만약 substitution context순환적 치환 컨텍스트로 표시되었다면, 보장된-무효 값을 반환합니다.

    참고: 중첩된 임의 치환 함수가 2단계 이후 어느 시점에 substitution context순환적으로 표시할 수도 있습니다. 예를 들어 result 해석 시.

  14. body stylesresult 속성 값을 반환합니다.

함수 스타일 해석을 수행하려면, custom function custom function, 스타일 규칙 rule, 사용자 정의 속성 등록 집합 registrations, 호출 컨텍스트 calling context가 주어졌을 때, 계산된 스타일 집합을 반환한다:
  1. "가상의 요소" el을 생성하고, elcalling context의 요소의 자식처럼 동작한다. el기능 없는 요소(featureless)이며, 사용자 정의 속성result 기술자만 적용된다.

  2. ruleel지정값(specified value) 단계까지 적용하되, 다음 변경사항을 적용한다:

  3. 모든 사용자 정의 속성elresult "속성"의 계산값(computed value)을 결정한다. CSS Properties and Values API 1 § 2.4 Computed Value-Time Behavior에 정의된 대로, 앞 단계의 변경사항과 아래 사항을 적용한다:

    • 사용자 정의 속성 참조(평소처럼 el의 값을 사용), 숫자/퍼센트(사용자 정의 속성 내에서는 미해결로 남음)를 제외하고, 일반적으로 스타일 대상 요소를 참조하는 값은 calling context루트 요소를 참조한다.

      참고: 예를 들어 속성 내 attr(), 또는 규칙 내 @container 쿼리 등.

  4. el의 스타일을 반환한다.

    참고: 이 스타일에서 사용자 정의 속성result 기술자만 사용된다.

4. 커스텀 함수의 실행 모델

CSS의 다른 부분과 마찬가지로, 커스텀 함수도 선언적 모델을 따릅니다.

지역 변수 기술자와 result 기술자는 어떤 순서로든 나타날 수 있으며, 여러 번 작성해도 됩니다. 이런 경우, 나중에 등장한 선언이 더 앞선 선언을 덮어씁니다.

@function --mypi() {
  result: 3;
  result: 3.14;
}

--mypiresult 기술자 값은 3.14입니다.

@function --circle-area(--r) {
  result: calc(pi * var(--r2));
  --r2: var(--r) * var(--r);
}

지역 변수 기술자는 참조보다 전에 나와도 되고 후에 나와도 됩니다.

4.1. 조건부 규칙

조건부 그룹 규칙@function 안에 나타나면 중첩 그룹 규칙이 되고, 추가적으로 @function 내에서 허용된 기술자만 중첩 그룹 규칙 내에 쓸 수 있습니다.

조건부 그룹 규칙@function 내에서 일반 규칙대로 처리되며, 조건이 true일 때 규칙 내용이 해당 위치에 있는 것처럼 동작하고, 그렇지 않으면 아무것도 없는 것처럼 동작합니다.

@function --suitable-font-size() {
  result: 16px;
  @media (width > 1000px) {
    result: 20px;
  }
}

result 기술자 값은 미디어 쿼리 조건이 true면 20px이고, 아니면 16px입니다.

실행 모델 때문에 @function 내에서는 "조기 반환"이 불가능하다는 점을 참고하세요:
@function --suitable-font-size() {
  @media (width > 1000px) {
    result: 20px;
  }
  result: 16px;
}

위 예시에서 result 기술자 값은 항상 16px입니다.

지역 변수도 조건부 규칙 내에서 사용할 수 있습니다:
@function --suitable-font-size() {
  --size: 16px;
  @media (width > 1000px) {
    --size: 20px;
  }
  result: var(--size);
}

5. CSSOM

5.1. CSSFunctionRule 인터페이스

CSSFunctionRule 인터페이스는 @function 규칙을 나타냅니다.

[Exposed=Window]
interface CSSFunctionRule : CSSGroupingRule {
  readonly attribute CSSOMString name;
  sequence<FunctionParameter> getParameters();
  readonly attribute CSSOMString returnType;
};
name, 타입 CSSOMString, 읽기 전용
커스텀 함수의 이름입니다.
returnType, 타입 CSSOMString, 읽기 전용
커스텀 함수문법 문자열로 표현된 반환 타입입니다. 커스텀 함수에 반환 타입이 없는 경우, "type(*)"을 반환합니다.
dictionary FunctionParameter {
  required CSSOMString name;
  required CSSOMString type;
  CSSOMString? defaultValue;
};
name
함수 인자의 이름입니다.
type
함수 인자타입으로, 문법 문자열로 표현되며, 인자에 타입이 없으면 "type(*)"입니다.
defaultValue
함수 인자의 기본값, 인자에 기본값이 없으면 `null`입니다.

@function 규칙 내에 선언을 직접 명시할 수 있지만, CSSOM에서는 그렇게 표현되지 않습니다. 대신 연속된 선언 구간이 CSSFunctionDeclarations 규칙으로 래핑된 것처럼 나타납니다.

참고: 이는 @function 규칙의 맨 앞 선언(즉, 다른 중첩 규칙 뒤에 오지 않은 선언)에도 적용됩니다.

@function --bar() {
  --x: 42;
  result: var(--y);
  @media (width > 1000px) {
    /* ... */
  }
  --y: var(--x);
}

위는 CSSOM에서 다음처럼 나타납니다:

@function --bar() {
  /* CSSFunctionDeclarations { */
    --x: 42;
    result: var(--y);
  /* } */
  @media (width > 1000px) {
    /* ... */
  }
  /* CSSFunctionDeclarations { */
    --y: var(--x);
  /* } */
}
CSSFunctionRule 직렬화 하려면, 다음을 이어붙여 반환한다:
  1. 문자열 "@function"과 단일 공백(U+0020).

  2. 함수 이름에 대해 serialize an identifier를 수행한 결과와 단일 왼쪽 괄호(U+0028).

  3. serialize a function parameter를 함수의 parameters 각각에 수행한 결과를 ", "(COMMA U+002C, 뒤에 단일 공백 U+0020)로 연결.

  4. 단일 오른쪽 괄호(U+0029).

  5. 함수에 반환 타입이 있고, 반환 타입universal syntax definition("*")이 아닌 경우:

    • 단일 공백(U+0020), "returns" 문자열, 단일 공백(U+0020).

    • serialize a CSS type을 해당 type에 수행한 결과와 단일 공백(U+0020).

  6. 단일 왼쪽 중괄호(U+007B), 단일 공백(U+0020).

  7. serialize a CSS rule을 cssRules의 각 규칙에 대해 수행한 결과(빈 문자열은 걸러냄)를 단일 공백(U+0020)으로 연결.

    참고: serialize a CSS rule은 빈 CSSFunctionDeclarations 규칙을 직렬화할 때 빈 문자열을 반환할 수 있습니다.

  8. 단일 공백(U+0020), 단일 오른쪽 중괄호(U+007D).

함수 인자 직렬화 하려면, 다음을 이어붙여 반환한다:
  1. serialize an identifier함수 인자의 이름에 대해 수행한 결과.

  2. 함수 인자타입이 있고, 타입universal syntax definition이 아니면:

  3. 함수 인자기본값이 있으면:

CSS 타입 직렬화 하려면, 다음을 이어붙여 반환한다:
  1. <css-type>이 단일 <syntax-component>로만 구성되어 있으면, 해당 문법 문자열을 반환.

  2. 그 외에는, 다음을 이어붙여 반환:

    • 문자열 "type(" (즉 "type"과 단일 왼쪽 괄호(U+0028)).

    • 해당 문법 문자열.

    • 문자열 ")" (즉 단일 오른쪽 괄호(U+0029)).

5.2. CSSFunctionDeclarations 인터페이스

CSSFunctionDeclarations 인터페이스는 선언@function 규칙 내에서 연속적으로 나타나는 부분을 나타냅니다.

[Exposed=Window]
interface CSSFunctionDescriptors : CSSStyleDeclaration {
  attribute [LegacyNullToEmptyString] CSSOMString result;
};

[Exposed=Window]
interface CSSFunctionDeclarations : CSSRule {
  [SameObject, PutForwards=cssText] readonly attribute CSSFunctionDescriptors style;
};
style 속성은 해당 규칙의 CSSFunctionDescriptors 객체를 반환해야 하며, 다음 속성을 가져야 합니다:
computed flag

설정 안 됨

readonly flag

설정 안 됨

declarations

해당 규칙에 선언된 선언들, 지정된 순서대로. 여기에는 지역 변수도 포함됩니다.

parent CSS rule

this

owner node

null

CSSFunctionDeclarations 규칙은 CSSNestedDeclarations와 같이, 직렬화될 때 선언 블록이 선언 블록직접 직렬화된 것처럼 나타납니다.

6. 프라이버시 고려사항

이 명세서에서 정의된 구조체들은 모두 CSS 내부에서만 정의되고 사용되며, 새로운 정보를 노출하지 않습니다.

7. 보안 고려사항

이 명세서에는 아직 제기된 이슈가 없습니다.

적합성

문서 규칙

적합성 요구 사항은 서술적 주장과 RFC 2119 용어를 조합하여 표현됩니다. “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL” 같은 핵심 단어들은 본 명세의 규범적 부분에서 RFC 2119에 정의된 대로 해석되어야 합니다. 다만 가독성을 위해, 이 단어들은 명세서에서 모두 대문자로 표기되지 않습니다.

이 명세서의 모든 텍스트는 명시적으로 비규범, 예시, 참고로 표시된 섹션을 제외하고는 모두 규범적입니다. [RFC2119]

이 명세서의 예시들은 “for example”이라는 문구로 시작하거나 class="example"로 구분되어 규범적 텍스트와 분리됩니다.

이것은 정보성 예시입니다.

정보성 참고는 “Note”라는 단어로 시작하며 class="note"로 규범적 텍스트와 구분됩니다.

참고, 이것은 정보성 참고입니다.

권고문은 규범적 섹션을 강조 스타일로 표시하며, <strong class="advisement">로 분리됩니다. 예시: UA는 반드시 접근 가능한 대안을 제공해야 합니다.

적합성 클래스

본 명세의 적합성은 세 가지 적합성 클래스로 정의됩니다:

스타일 시트
CSS 스타일 시트.
렌더러
UA가 스타일 시트의 의미를 해석하여 그것을 사용하는 문서를 렌더링함.
저작 도구
UA가 스타일 시트를 작성함.

스타일 시트가 본 명세에 적합하려면, 본 모듈에 정의된 구문을 사용하는 모든 선언문이 일반 CSS 문법 및 각 기능별 문법에 따라 유효해야 합니다.

렌더러가 본 명세에 적합하려면, 스타일 시트를 해당 명세에 따라 해석하는 것 외에도 본 명세서에서 정의한 모든 기능을 올바르게 구문 분석 및 렌더링해야 합니다. 단, UA가 장치의 한계로 인해 문서를 제대로 렌더링하지 못하는 경우에도 UA가 비적합하게 되는 것은 아닙니다. (예: UA는 흑백 모니터에서 색상을 렌더링할 필요는 없음.)

저작 도구가 본 명세에 적합하려면, 본 모듈의 일반 CSS 문법 및 각 기능별 문법에 맞는 문법적으로 올바른 스타일 시트를 작성하고, 이 모듈에서 설명한 스타일 시트의 모든 적합성 요구 사항을 충족해야 합니다.

부분 구현

저자가 미래 호환 파싱 규칙을 활용해 폴백 값을 지정할 수 있도록, CSS 렌더러는 반드시 지원 수준이 없는 at-규칙, 속성, 속성 값, 키워드, 기타 구문 구조를 무효로 간주하고 (적절히 무시) 처리해야 합니다. 특히, UA는 지원되지 않는 값만 선택적으로 무시하고 지원되는 값만 다중값 속성 선언에서 적용해서는 안 됩니다. 값 중 하나라도 무효(지원되지 않는 값은 반드시 무효)인 경우 CSS는 전체 선언을 무시해야 한다고 요구합니다.

불안정 및 독점 기능의 구현

향후 안정적인 CSS 기능과의 충돌을 피하기 위해, CSSWG는 모범 사례를 따라 불안정 기능 및 독점 확장을 구현할 것을 권장합니다.

비실험적 구현

명세가 Candidate Recommendation 단계에 도달하면, 비실험적 구현이 가능하며, 구현자는 명세에 따라 올바르게 구현되었음을 입증할 수 있는 모든 CR 수준 기능에 대해 접두어 없는 구현을 공개해야 합니다.

CSS의 구현 상호운용성 구축 및 유지를 위해, CSS 작업 그룹은 비실험적 CSS 렌더러가 접두어 없는 구현을 공개하기 전에 구현 보고서(필요하다면 해당 구현 보고서에 사용된 테스트케이스도 함께)를 W3C에 제출할 것을 요청합니다. W3C에 제출된 테스트케이스는 CSS 작업 그룹에서 검토 및 수정될 수 있습니다.

테스트케이스 및 구현 보고서 제출에 대한 자세한 정보는 CSS 작업 그룹 웹사이트 https://www.w3.org/Style/CSS/Test/에서 확인할 수 있습니다. 문의는 public-css-testsuite@w3.org 메일링 리스트로 보내세요.

색인

이 명세서에서 정의된 용어

참조로 정의된 용어

참고 문헌

규범적 참고 문헌

[CSS-ANIMATIONS-1]
David Baron; 외. CSS Animations Level 1. 2023년 3월 2일. WD. URL: https://www.w3.org/TR/css-animations-1/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 2022년 1월 13일. CR. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-CONDITIONAL-3]
Chris Lilley; David Baron; Elika Etemad. CSS Conditional Rules Module Level 3. 2024년 8월 15일. CRD. URL: https://www.w3.org/TR/css-conditional-3/
[CSS-NESTING-1]
Tab Atkins Jr.; Adam Argyle. CSS Nesting Module. 2023년 2월 14일. WD. URL: https://www.w3.org/TR/css-nesting-1/
[CSS-PROPERTIES-VALUES-API-1]
Tab Atkins Jr.; Alan Stearns; Greg Whitworth. CSS Properties and Values API Level 1. 2024년 3월 26일. WD. URL: https://www.w3.org/TR/css-properties-values-api-1/
[CSS-SCOPING-1]
Tab Atkins Jr.; Elika Etemad. CSS Scoping Module Level 1. 2014년 4월 3일. FPWD. URL: https://www.w3.org/TR/css-scoping-1/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 2021년 12월 24일. CRD. URL: https://www.w3.org/TR/css-syntax-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2024년 3월 12일. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-VALUES-5]
Tab Atkins Jr.; Elika Etemad; Miriam Suzanne. CSS Values and Units Module Level 5. 2024년 11월 11일. WD. URL: https://www.w3.org/TR/css-values-5/
[CSS-VARIABLES-1]
Tab Atkins Jr.. CSS Custom Properties for Cascading Variables Module Level 1. 2022년 6월 16일. CR. URL: https://www.w3.org/TR/css-variables-1/
[CSSOM-1]
Daniel Glazman; Emilio Cobos Álvarez. CSS Object Model (CSSOM). 2021년 8월 26일. WD. URL: https://www.w3.org/TR/cssom-1/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997년 3월. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 2022년 11월 11일. WD. URL: https://www.w3.org/TR/selectors-4/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

정보성 참고 문헌

[CSS-CONDITIONAL-5]
Chris Lilley; 외. CSS Conditional Rules Module Level 5. 2024년 11월 5일. WD. URL: https://www.w3.org/TR/css-conditional-5/

속성 색인

정의된 속성이 없습니다.

@function 기술자

이름 초기값
result <declaration-value>? n/a (본문 참조)

IDL 색인

[Exposed=Window]
interface CSSFunctionRule : CSSGroupingRule {
  readonly attribute CSSOMString name;
  sequence<FunctionParameter> getParameters();
  readonly attribute CSSOMString returnType;
};

dictionary FunctionParameter {
  required CSSOMString name;
  required CSSOMString type;
  CSSOMString? defaultValue;
};

[Exposed=Window]
interface CSSFunctionDescriptors : CSSStyleDeclaration {
  attribute [LegacyNullToEmptyString] CSSOMString result;
};

[Exposed=Window]
interface CSSFunctionDeclarations : CSSRule {
  [SameObject, PutForwards=cssText] readonly attribute CSSFunctionDescriptors style;
};