GODRICH
#css애니메이션#버튼#로딩#전환효과#스크롤#대시보드#실전ui#디자인트렌드

css 브라우저 호환 9종 — 실제로 쓰는 폴백 트릭 모음

아홉 개의 css 브라우저 호환 트릭 중 하나는 주소창이 접히고 펼쳐질 때마다 전체 화면 높이 값이 다시 계산되고, 하나는 입력 필드에 포커스를 줘도 화면이 확대되지 않게 잠그고, 하나는 목록을 끝까지 당겨도 뒤 배경은 같이 흔들리지 않도록 막습니다.

아홉 항목 모두 사용자 에이전트를 확인하지 않고, 표준 기능이 있는지 먼저 물어 그 답에 따라 다른 규칙을 켭니다. 위에서부터 스크롤 막대·배경 흐림·동적 높이·입력 확대·간격 배치·지원 분기·끝단 당김·글자 보정·날짜 입력 순으로 다뤄, 값 하나가 CSS 선언 자체를 가르는 01·02·05·07·08 을 지나 실행 시점 판정으로 갈라지는 06 을 거쳐, 자바스크립트 계산이 폴백을 대신하는 03·04·09 로 넘어갑니다. 트리거는 항목마다 다른데 01 은 스크롤과 클릭, 02·06 은 클릭 하나, 03·05 는 클릭과 키보드, 04 는 포커스, 07 은 휠, 08 은 포인터, 09 는 값 변경입니다.

자동 재생 · 눌러서 해당 항목으로 · 전부 한 zip

아홉 개의 해부 — 어떤 CSS가 환경 차이를 메우는가

아홉 항목은 전부 값 하나가 지원 여부를 가르는 css 호환성 트릭이라, 어떤 CSS 선언이 그 값을 만드는지부터 봅니다.

항목 누적면적 강도 평균 움직인 프레임
01 커스텀 스크롤바 7.6% 111.3 21/23
02 배경 흐림 폴백 7.3% 46.8 8/23
03 동적 뷰포트 높이 6.0% 167.8 14/23
04 입력창 확대 잠금 5.5% 115.4 8/23
05 가로 배치 간격 폴백 2.8% 145.9 20/23
06 기능 지원 분기 21.5% 79.1 10/23
07 끝단 당김 잠금 9.7% 106.9 19/23
08 글자 렌더링 보정 3.6% 196.5 23/23
09 날짜 입력 커스텀 3.5% 131.6 18/23

누적면적은 06 기능 지원 분기가 21.5%로 가장 크고, 05 가로 배치 간격 폴백이 2.8%로 가장 작습니다(09 날짜 입력 커스텀도 3.5%로 그다음으로 작습니다). 강도 평균은 08 글자 렌더링 보정이 196.5로 가장 높고 02 배경 흐림 폴백이 46.8로 가장 낮으며, 움직인 프레임도 08 이 23/23으로 매 프레임 움직인 유일한 항목이고 02·04 가 8/23으로 가장 적습니다.

항상 선언해 두고 표준이 덮어쓰는 01·02·05·07·08

01·02·05·07·08 은 폴백 규칙을 조건 없이 먼저 선언해 두고, 표준 기능이 있는지 물어 답이 맞을 때만 같은 선택자에 개선 규칙을 덧씌웁니다. 시뮬레이션 토글은 사용자 에이전트가 아니라 이 표준 선언 자체를 강제로 꺼서, 폴백 경로가 그대로 드러나게 합니다.

실행 시점에 여러 기능을 검사하는 06

06 은 CSS 선언이 아니라 자바스크립트가 실행 중에 여러 기능의 지원 여부를 하나씩 물어, 그 결과를 점검표 화면으로 그립니다.

계산으로 폴백을 대신하는 03·04·09

03 은 주소창 상태를 커스텀 속성으로 다시 재고, 04 는 실제 계산된 글자 크기를 읽어 확대 비율을 구하며, 09 는 표준 함수가 있는지 알아본 뒤 없으면 포커스 잠금으로 대신합니다. 셋 다 CSS 조건문이 아니라 자바스크립트 분기로 지원 여부를 가릅니다.

패턴별 코드

01커스텀 스크롤바 — 두께·색·모서리를 직접 정하는 스크롤 막대

목록이 넘칠 때 나타나는 스크롤 막대의 두께와 색, 모서리 둥근 정도를 배경과 어울리게 직접 지정해 사이드 패널 목록이나 코드 미리보기 창에 씁니다. 두께·색 속성을 표준으로 선언해 두고, 시뮬레이션 토글을 누르면 그 선언만 꺼서 기본 막대로 돌아가는 모습을 비교할 수 있습니다.

@supports (scrollbar-width: thin) {
  .itemList:not(.force-fallback) {
    scrollbar-width: thin;
    scrollbar-color: $subject-blue-light transparent;
  }
}

// 시뮬레이션 토글 — 실제 UA 감지가 아니라 표준 속성을 강제로 꺼서 옛 폴백 경로가 눈에 보이게 한다
.force-fallback .itemList {
  scrollbar-width: auto;
  scrollbar-color: unset;
}
커스텀 스크롤바 — 두께·색·모서리를 직접 정하는 스크롤 막대
새 창에서 열기

01 · 커스텀 스크롤바 — 두께·색·모서리를 직접 정하는 스크롤 막대 — 측정 누적면적 7.615% · 움직인 프레임 21/23GODRICH 원작 · zip 에 SCSS·React 포함 · 비밀번호 보기

scrollbar-widthscrollbar-color::-webkit-scrollbar

02배경 흐림 폴백 — 흐림이 안 먹는 환경에서 반투명 배경으로 대신 채우는 카드

흐림 필터가 적용되지 않는 환경을 감지하면 카드 배경이 반투명 단색으로 대신 채워져 뒤 내용이 비치지 않으며, 모달 오버레이 카드나 알림 배너 배경에 씁니다. 반투명 배경은 항상 선언해 두고, 흐림 지원 여부를 물어 맞을 때만 흐림 규칙을 덧씌웁니다.

.card {
  position: relative;
  z-index: 2;
  width: 160px;
  padding: $sp-3 $sp-4;
  border-radius: $r-card;
  opacity: 0;
  transform: scale(.86);
  transition: transform $dur-base $ease-elastic, opacity $dur-quick $ease-out;

  // 폴백: 흐림이 없을 때 반투명 단색으로 채운다 — 항상 선언, @supports 가 지원판에서 덮어쓴다
  background: rgba($subject-ink, var(--fallback-alpha, .6));
}

@supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) {
  .wrap:not(.force-fallback) .card {
    background: rgba($subject-ink, .28);
    backdrop-filter: blur(10px);
    -webkit-backdrop-filter: blur(10px);
  }
}
배경 흐림 폴백 — 흐림이 안 먹는 환경에서 반투명 배경으로 대신 채우는 카드
새 창에서 열기

02 · 배경 흐림 폴백 — 흐림이 안 먹는 환경에서 반투명 배경으로 대신 채우는 카드 — 측정 누적면적 7.263% · 움직인 프레임 8/23GODRICH 원작 · zip 에 SCSS·React 포함 · 비밀번호 보기

backdrop-filter-webkit-backdrop-filter@supports

03동적 뷰포트 높이 — 주소창 크기에 맞춰 다시 재는 전체 화면 높이

주소창이 접히고 펼쳐질 때마다 전체 화면 높이 값이 다시 계산되어 하단 버튼이 화면 밖으로 밀려나지 않으며, 전체 화면 랜딩 섹션이나 하단 고정 액션 버튼에 씁니다. 동적 높이판만 주소창 상태를 커스텀 속성으로 다시 재고, 정해진 지연 뒤에 값을 적용해 재계산 지연까지 눈으로 비교할 수 있습니다.

  var BAR_OPEN_PX = 34; // 주소창이 펼쳐졌을 때 화면에서 차지하는 높이
  var timer = null;
  var collapsed = false;

  function human() { if (isDemo) { wrap.classList.remove('is-demo'); isDemo = false; } }

  function recalc() {
    var barH = collapsed ? 0 : BAR_OPEN_PX;
    // 동적 뷰포트판만 다시 잰다 — 100vh 고정판은 실제로 재계산을 안 하는 버그를 그대로 보여준다
    screenDvh.style.setProperty('--bar-h', barH + 'px');
    anchorDvh.classList.add('is-settled');
  }

  function scheduleRecalc() {
    anchorDvh.classList.remove('is-settled');
    if (timer) clearTimeout(timer);
    timer = setTimeout(recalc, VH_RECALC_DEBOUNCE_MS);
  }
동적 뷰포트 높이 — 주소창 크기에 맞춰 다시 재는 전체 화면 높이
새 창에서 열기

03 · 동적 뷰포트 높이 — 주소창 크기에 맞춰 다시 재는 전체 화면 높이 — 측정 누적면적 5.978% · 움직인 프레임 14/23GODRICH 원작 · zip 에 SCSS·React 포함 · 비밀번호 보기

100vhdvh--bar-h

04입력창 확대 잠금 — 포커스를 줘도 화면이 확대되지 않는 입력 필드

입력 필드를 눌러 포커스를 줘도 글자 크기 기준값이 문턱을 넘겨 화면 전체가 확대되지 않고 그대로 유지되며, 모바일 검색창이나 로그인 폼 입력 필드에 씁니다. 실제 계산된 글자 크기를 읽어 기준값과 비교한 비율만큼 되돌려, 확대가 걸리기 전 크기로 맞춥니다.

  function zoomScaleFor(el) {
    var css = getComputedStyle(el);
    var current = parseFloat(css.fontSize) || LOCK_FONT_PX;
    return Math.max(1, LOCK_FONT_PX / current);
  }

  function applyFocusZoom(el, on) {
    if (on) {
      var rect = el.getBoundingClientRect();
      var originX = rect.width / 2;
      var originY = rect.height / 2;
      el.style.transformOrigin = originX + 'px ' + originY + 'px';
      el.style.transform = 'scale(' + zoomScaleFor(el) + ')';
    } else {
      el.style.transform = 'scale(1)';
    }
  }
입력창 확대 잠금 — 포커스를 줘도 화면이 확대되지 않는 입력 필드
새 창에서 열기

04 · 입력창 확대 잠금 — 포커스를 줘도 화면이 확대되지 않는 입력 필드 — 측정 누적면적 5.458% · 움직인 프레임 8/23GODRICH 원작 · zip 에 SCSS·React 포함 · 비밀번호 보기

LOCK_FONT_PXfont-sizezoomScaleFor

05가로 배치 간격 폴백 — 간격 속성이 안 먹으면 여백으로 대신 벌리는 배치

간격 속성을 지원하지 않는 환경을 감지하면 각 항목에 개별 여백을 매겨 같은 간격을 흉내 내며, 태그 목록 배치나 버튼 그룹 정렬에 씁니다. 여백 규칙을 항상 선언해 두고, 간격 속성 지원 여부를 물어 맞을 때만 여백을 지우고 간격 규칙으로 바꿉니다.

.chipRow {
  display: flex;
  flex-wrap: wrap;
  width: 100%;
  min-height: 34px;
  margin: 0;
  padding: 0;
  list-style: none;

  // 폴백: gap 을 모르는 환경 — 마지막 칩만 빼고 오른쪽 여백을 준다. 항상 선언, 아래 @supports 가 지원판에서 덮는다
  > .chip:not(:last-child) { margin-right: $sp-2; }
}

@supports (gap: 1rem) {
  .wrap:not(.force-fallback) .chipRow {
    gap: $sp-2;

    > .chip:not(:last-child) { margin-right: 0; }
  }
}
가로 배치 간격 폴백 — 간격 속성이 안 먹으면 여백으로 대신 벌리는 배치
새 창에서 열기

05 · 가로 배치 간격 폴백 — 간격 속성이 안 먹으면 여백으로 대신 벌리는 배치 — 측정 누적면적 2.822% · 움직인 프레임 20/23GODRICH 원작 · zip 에 SCSS·React 포함 · 비밀번호 보기

gap@supportsmargin-right

06기능 지원 분기 — 지원 여부를 먼저 물어 다른 규칙을 켜는 조건 배치

특정 기능의 지원 여부를 먼저 검사해, 지원되면 새 규칙을 켜고 아니면 이전 규칙을 그대로 둔 채 화면이 갈라지며, 그리드 레이아웃을 점진적으로 개선하거나 신규 색 함수를 도입한 카드에 씁니다. 다섯 가지 기능을 하나씩 물어 그 결과를 점검표로 그립니다.

  var FEATURES = [
    { label: '플렉스 gap', test: function () { return CSS.supports('gap', '1px'); } },
    { label: '가로세로비', test: function () { return CSS.supports('aspect-ratio', '1 / 1'); } },
    { label: '배경 흐림', test: function () { return CSS.supports('backdrop-filter', 'blur(1px)'); } },
    { label: '부모 선택자', test: function () { return CSS.supports('selector(:has(a))'); } },
    { label: '컨테이너 쿼리', test: function () { return CSS.supports('container-type', 'inline-size'); } }
  ];
기능 지원 분기 — 지원 여부를 먼저 물어 다른 규칙을 켜는 조건 배치
새 창에서 열기

06 · 기능 지원 분기 — 지원 여부를 먼저 물어 다른 규칙을 켜는 조건 배치 — 측정 누적면적 21.491% · 움직인 프레임 10/23GODRICH 원작 · zip 에 SCSS·React 포함 · 비밀번호 보기

CSS.supportsaspect-ratiocontainer-type

07끝단 당김 잠금 — 목록 끝에서 배경까지 같이 튕기지 않게 막는 스크롤

목록을 끝까지 당겨도 뒤 배경 화면은 같이 흔들리지 않고 당김은 목록 안에서만 멈추며, 무한 스크롤 피드나 모달 안 목록 스크롤에 씁니다. 표준 속성을 항상 켜 두고, 시뮬레이션 토글로 그 속성만 강제로 꺼서 자바스크립트 당김 잠금만으로 버티는 모습도 볼 수 있습니다.

.panel {
  margin: 0;
  padding: $sp-2;
  list-style: none;
  width: 100%;
  height: 130px;
  overflow-y: auto;
  border-radius: $r-card;
  background: rgba($subject-cream, .08);

  // 폴백: 표준 속성을 모르는 환경에서도 JS 당김 잠금이 경계를 막는다 — 항상 동작, 아래 @supports 는 보조일 뿐
  overscroll-behavior: auto;
}

@supports (overscroll-behavior: contain) {
  .wrap:not(.force-fallback) .panel {
    overscroll-behavior: contain;
  }
}

// 시뮬레이션: 표준 속성이 있어도 강제로 꺼서(auto) 체이닝이 새는 환경을 흉내 — JS 당김 잠금만으로 막히는지 보여준다
.force-fallback .panel {
  overscroll-behavior: auto;
}
끝단 당김 잠금 — 목록 끝에서 배경까지 같이 튕기지 않게 막는 스크롤
새 창에서 열기

07 · 끝단 당김 잠금 — 목록 끝에서 배경까지 같이 튕기지 않게 막는 스크롤 — 측정 누적면적 9.72% · 움직인 프레임 19/23GODRICH 원작 · zip 에 SCSS·React 포함 · 비밀번호 보기

overscroll-behavior@supportswheel

08글자 렌더링 보정 — 환경마다 다르게 보이는 글자 두께를 맞추는 보정

렌더링 방식에 따라 다르게 보일 수 있는 글자 획 두께를 보정 속성으로 가늘고 매끄럽게 맞추며, 얇은 굵기의 본문 타이포나 밝은 배경 위 옅은 글자색에 씁니다. 굵기·자간 보정을 항상 선언해 두고, 벤더 접두 보정 속성을 지원하는 환경에서만 덧씌웁니다.

// 폴백: 벤더 스무딩을 몰라도 굵기·자간만으로 또렷하게 보정한다 — 항상 선언, 아래 @supports 는 보조
.textLayer.is-fixed {
  font-weight: 600;
  letter-spacing: .01em;
  text-shadow: none;
  clip-path: inset(0 calc(100% - var(--split)) 0 0);
  transition: clip-path $dur-instant $ease-out;
}

@supports (-webkit-font-smoothing: antialiased) or (font-smoothing: antialiased) {
  .wrap:not(.force-fallback) .textLayer.is-fixed {
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
  }
}
글자 렌더링 보정 — 환경마다 다르게 보이는 글자 두께를 맞추는 보정
새 창에서 열기

08 · 글자 렌더링 보정 — 환경마다 다르게 보이는 글자 두께를 맞추는 보정 — 측정 누적면적 3.592% · 움직인 프레임 23/23GODRICH 원작 · zip 에 SCSS·React 포함 · 비밀번호 보기

-webkit-font-smoothing-moz-osx-font-smoothing@supports

09날짜 입력 커스텀 — 기본 달력 아이콘과 필드 배경을 다시 그린 날짜 선택

기본으로 제공되는 달력 아이콘과 필드 배경 색을 다시 그려 다른 입력 필드와 톤을 맞추며, 예약 폼 날짜 선택이나 생년월일 입력 필드에 씁니다. 표준 달력 열기 함수가 있는지 확인한 뒤, 없으면 입력 필드에 초점을 주는 방식으로 대신합니다.

.dateInput {
  border: none;
  border-radius: $r-control;
  background: $subject-cream;
  color: $subject-ink;
  padding: $sp-1 $sp-2;
  font-size: 12px;
  color-scheme: light;

  // 폴백: 표준 픽커 아이콘을 모르는 환경도 입력 자체는 그대로 쓸 수 있다 — 배경만 살짝 맞춘다
  &::-webkit-calendar-picker-indicator {
    border-radius: $r-xs;
    padding: $sp-1;
    cursor: pointer;
  }

  &:focus-visible { outline: 2px solid $subject-blue-light; outline-offset: 2px; }
}
날짜 입력 커스텀 — 기본 달력 아이콘과 필드 배경을 다시 그린 날짜 선택
새 창에서 열기

09 · 날짜 입력 커스텀 — 기본 달력 아이콘과 필드 배경을 다시 그린 날짜 선택 — 측정 누적면적 3.485% · 움직인 프레임 18/23GODRICH 원작 · zip 에 SCSS·React 포함 · 비밀번호 보기

showPickercolor-scheme::-webkit-calendar-picker-indicator

값이 폴백을 바꾸는 곳 — 지원 여부·수치·순서 기준

값 하나가 문턱을 넘기면 폴백과 개선판 중 어느 쪽이 화면에 남을지가 갈립니다. 항목마다 그 기준이 되는 자리는 다음과 같습니다.

지원 여부·수치를 쥔 값들

  • 02 는 반투명 진하기 값(기본 0.6)이 흐림이 없는 환경에서 카드 배경을 채우는 농도를 정합니다.
  • 03 은 재계산 지연 값(기본 150ms)과 주소창이 펼쳐졌을 때 차지하는 높이 값(34px)이 함께 화면 높이를 정합니다.
  • 04 는 확대가 걸리지 않는 기준 글자 크기 값(16px)이 문턱입니다.
  • 05 는 수치가 아니라 간격 속성 지원 여부 하나가 여백 규칙과 간격 규칙을 가릅니다.
  • 06 은 다섯 기능 각각의 지원 여부가 점검표 각 줄을 가릅니다.
  • 07 은 경계에서 더 당길 수 있는 최대치 값(24px)이 잠금이 풀리는 지점입니다.
  • 08 은 css 벤더 프리픽스의 지원 여부가 굵기 보정 위에 무엇을 덧씌울지를 가릅니다.
  • 09 는 표준 달력 열기 함수의 존재 여부가 자동 열기와 포커스 대체를 가릅니다.

순서도 값이다

02·05·07·08 은 폴백 선언을 먼저 조건 없이 적어 두고 지원 판정 규칙을 그 뒤에 이어야, 지원 판정이 나중에 실행돼도 항상 유효한 값 위에 규칙이 덧씌워집니다. 순서를 반대로 적어 지원 판정 규칙이 먼저 오면 폴백 선언이 나중에 덮어써, 지원하는 환경에서도 개선판이 사라집니다. 이 조건 판정 자체의 표준 규격은 CSS 조건부 규칙 명세를 따릅니다.

이웃 가지 — 폴백과 맞닿은 다른 편

흐림 폴백의 반투명 배경 채우기는 CSS 글래스모피즘 리퀴드 글래스 효과 9종의 흐림 표현과 맞닿지만, 이 편의 02 는 그 흐림이 없는 환경만 다룹니다. 날짜 입력의 표준 함수 확인은 날짜 선택 UI 9종 — 팝오버로 열고 접는 아홉 가지 방식의 팝오버 달력과 이어지고, 이 편의 09 는 그 앞단인 기본 입력 커스텀만 다룹니다. 동적 높이 재계산은 스크롤 인디케이터 9종 — 어디까지 읽었는지 보여주는와 계산 축이 같지만, 이 편의 03 은 스크롤 위치가 아니라 뷰포트 높이 값을 다룬다는 점이 갈립니다.

어디서 깨지는가 — 오래된 환경, 순서 실수, reduced-motion

실제로 깨지는 지점은 두 가지입니다. 지원하지 않는 환경에서는 폴백이 그대로 남아야 정상인데, 규칙 순서를 반대로 적으면 지원 판정 규칙이 먼저 실행된 뒤 조건 없는 폴백 선언이 나중에 덮어써 지원하는 환경에서도 개선판이 사라집니다. 또 하나는 시뮬레이션 토글을 사용자 에이전트 감지로 착각하는 경우인데, 아홉 항목 모두 실제 감지가 아니라 표준 선언을 강제로 껐다 켜는 버튼일 뿐이라 지원 여부 자체를 속이지는 못합니다.

아홉 항목의 html·scss·js 전체는 kda6g7zx 압축 비밀번호로 받아 상수를 직접 바꿔 가며 이 순서를 눈으로 확인할 수 있습니다.

reduced-motion 이 남기는 것

reduce 설정이 켜지면 아홉 항목 모두 자동 시연이 멈추고 처음 렌더된 모습 그대로 남으며, 01 은 추가로 목표 값을 즉시 대입해 서서히 따라붙는 보정 없이 한 번에 자리를 잡습니다. 사람이 직접 누르는 조작은 reduce 여부와 무관하게 그대로 동작합니다. CSS 쪽에도 항목마다 reduced-motion 블록이 있어 전환을 끊습니다.

오래된 환경에서 보이는 모습

오래된 환경이라고 해서 기능이 아예 없다는 신호가 따로 오지는 않습니다 — 그저 폴백으로 선언해 둔 규칙이 그대로 남아, 스크롤 막대가 기본 굵기로 보이거나 카드 배경이 흐림 없이 단색으로 채워지는 정도로 그칩니다. 화면이 깨지는 것이 아니라 개선판보다 밋밋한 모습으로 대체되는 것이라, 그 폴백 자체를 항상 쓸 수 있는 상태로 만들어 두는 것이 아홉 항목이 공유하는 원칙입니다. 09 처럼 자바스크립트 분기로 대신하는 항목도 마찬가지로, 표준 함수가 없을 때 대체 동작이 조용히 이어받습니다.

변형 세 가지와 접근성

변형 값 느낌
폴백 배경 진하게 02 FALLBACK_BG_ALPHA 0.6 → 0.85 FALLBACK_BG_ALPHA 를 0.85 로 올리면 흐림 효과가 없는 환경에서 카드 배경이 더 진하게 채워진다
뷰포트 재계산 더 빠르게 03 VH_RECALC_DEBOUNCE_MS 150 → 50 VH_RECALC_DEBOUNCE_MS 를 50ms 로 낮추면 주소창이 움직인 뒤 높이 값이 더 빨리 다시 계산된다
당김 잠금 범위 늘리기 07 OVERSCROLL_LOCK_PX 24 → 48 OVERSCROLL_LOCK_PX 를 48px 로 늘리면 목록을 더 세게 당겨야 잠금이 풀린다

시뮬레이션 토글은 아홉 항목 모두 눌림 상태를 알리는 실제 button 이라 Enter·Space 로 그대로 조작되고, 08 의 보정 슬라이더는 현재 값을 함께 읽어 주며, 09 의 장식용 링은 스크린 리더에서 숨겨져 있습니다. reduce 환경에서는 앞서 본 대로 자동 시연이 멈추고 처음 모습 그대로 남되, 버튼 조작 자체는 그대로 살아 있습니다.

FAQ

아홉 개의 css 스니펫을 그대로 복사해서 써도 되나요?

네, 각 항목의 코드는 데모 소스에서 그대로 뽑은 것이라 복사해서 바로 써도 됩니다. 다만 폴백 선언을 지원 판정 규칙보다 먼저 적어 두는 순서만 지키면 어떤 프로젝트에 붙여도 같은 우선순위로 동작합니다.

지원하지 않는 환경인지는 어떻게 확인하나요?

이 데모의 시뮬레이션 토글은 실제 환경을 감지하는 것이 아니라 표준 선언을 강제로 껐다 켜는 버튼입니다. 실제 프로젝트에서는 @supports 나 기능 지원 검사 함수로 먼저 물은 뒤, 그 답에 따라 갈라지는 규칙을 그대로 옮기면 됩니다.

아홉 항목 중 어디부터 적용해야 하나요?

값이 CSS 선언 하나를 가르는 01·02·05·07·08 부터 시작하는 편이 수월합니다. 자바스크립트 계산이 필요한 03·04·09, 실행 시점에 여러 기능을 검사하는 06 은 그 다음에 붙여도 늦지 않습니다.

압축 비밀번호를 입력하세요

비밀번호는 이 글 본문 안에 있습니다. 읽다 보면 나옵니다.