interpolate-size

Определение и применение

Свойство interpolate-size разрешает плавный переход между числовым размером и размером, зависящим от содержимого. Например, блок может раскрыться от нулевой высоты до height: auto без подбора заведомо большого max-height.

Как задать длительность, задержку и скорость обычного CSS-перехода — в уроке «Переходные эффекты в CSS».

Попробуйте значения interpolate-size

Выберите режим и переключите флажок «Раскрыть». Блок меняет высоту между 0 и auto. При allow-keywords переход плавный, если браузер поддерживает свойство; без поддержки размер меняется сразу.

Значение свойства

interpolate-size: numeric-only

HTML и CSS примера
HTML
<div class="stage demo-target">
  <input id="toggle" class="toggle" type="checkbox" checked /><label
    for="toggle"
  >
    Раскрыть</label
  >
  <div class="panel">
    <p>
      Высота определяется содержимым. Здесь несколько строк текста, и заранее
      задавать их суммарную высоту не нужно.
    </p>
  </div>
</div>
CSS
* {
  box-sizing: border-box;
}
.stage {
  width: 100%;
  max-width: 340px;
  padding: 16px;
  background: white;
  color: #172c3d;
  font: 16px/1.5 system-ui;
}
.demo-target {
  interpolate-size: numeric-only;
}
.panel {
  height: 0;
  overflow: hidden;
  transition: height 1.2s;
  background: #b9d7eb;
}
.toggle:checked ~ .panel {
  height: auto;
}
.panel p {
  padding: 16px;
  margin: 0;
}
@media (prefers-reduced-motion: reduce) {
  .panel {
    transition: none;
  }
}

Поддержка браузерами

Спецификация: CSS values-5

Нет поддержки: Firefox, Safari, Firefox Android, Safari iOS, WebView iOS.

Отдельные значения (2) поддерживаются не везде — смотрите таблицу.

Показать браузеры
Совместимостьcss.properties.interpolate-size
ВозможностьКомпьютерыМобильные
ChromeEdgeFirefoxOperaSafariChrome AndroidFirefox for AndroidOpera AndroidSafari on iOSSamsung BrowserWebView AndroidWebView on iOS
interpolate-size✓129✓129×✓115×✓129×✓86×✓28.0✓129×
allow-keywords✓129✓129×✓115×✓129×✓86×✓28.0✓129×
numeric-only✓129✓129×✓115×✓129×✓86×✓28.0✓129×

поддерживаетсяс ограниченияминет поддержкинет данных≤31 — не позднее версии 31

CSS синтаксис:

CSS
interpolate-size: numeric-only | allow-keywords;

/* Глобальные значения */
interpolate-size: initial | inherit | unset | revert | revert-layer;

| разделяет варианты.

JavaScript синтаксис:

JavaScript
element.style.interpolateSize = "allow-keywords";

Начальное значение свойства

numeric-only.

Значения свойства

Значения interpolate-size
Значение Описание
numeric-only Не разрешает интерполяцию к внутренним размерам, заданным ключевыми словами. Переход между совместимыми числовыми размерами остаётся возможным. Начальное значение.
allow-keywords Разрешает интерполяцию между длиной или процентом и поддерживаемым внутренним размером. Одна из конечных величин должна быть числовой.
initial Устанавливает начальное значение свойства.
inherit Наследует вычисленное значение свойства у родительского элемента.
unset Для наследуемого свойства interpolate-size наследует вычисленное значение у родительского элемента.
revert Отменяет заданное в коде значение свойства для этого элемента: применяются пользовательские или стандартные стили браузера. Если они не задают значение, свойство наследуется или получает начальное значение по обычным правилам. Не возвращает значение из предыдущей строки CSS.
revert-layer Сбрасывает значение свойства для текущего слоя каскада @layer. Применяется значение из другого слоя по правилам каскада; если подходящего значения нет, возможен откат к стилям пользователя или браузера.

Разрешение не запускает анимацию

Кроме свойства нужны разные начальное и конечное значения размера и transition либо animation. Между auto и max-content это разрешение само по себе плавного перехода не создаёт: оба конца являются ключевыми словами.

Поддерживаемые внутренние размеры включают auto, min-content, max-content, fit-content; для flex-basis также используется content. Свойство наследуется, поэтому обычно его задают конкретному компоненту, чтобы не изменить поведение переходов во всём документе. Для вычислений с внутренними размерами существует функция calc-size().

Спецификация

CSS Box Sizing — interpolate-size.

Наследуется

Да.

Анимируемое

Нет. Свойство разрешает интерполяцию других свойств, но само не анимируется.

Примеры, попробуйте сами

Высота по содержимому

Включите флажок: текст раскроется до собственной высоты. В поддерживаемом браузере сравните allow-keywords и numeric-only. Добавьте ещё один абзац — конечную высоту подбирать не нужно.

base.css
CSS
body {
    margin: 1rem;
    font:
        16px/1.5 system-ui,
        sans-serif;
    color: #243342;
    background: #fff;
}
* {
    box-sizing: border-box;
}
.panel {
    background: #ecfccb;
}
.panel p {
    margin: 0;
    padding: 12px;
}
index.html
HTML
<!doctype html>
<html lang="ru">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Высота по содержимому</title>
  </head>
  <body>
    <div class="demo">
      <input id="open" type="checkbox" /><label for="open"> Показать заметку</label>
      <div class="panel">
        <p>Тони нашёл новую тропу.</p>
        <p>Она ведёт к озеру через сосновый лес.</p>
      </div>
    </div>
  </body>
</html>
style.css
CSS
.demo {
    interpolate-size: allow-keywords;
}
.panel {
    height: 0;
    overflow: hidden;
    transition: height 600ms;
}
#open:checked ~ .panel {
    height: auto;
}
@media (prefers-reduced-motion: reduce) {
    .panel {
        transition: none;
    }
}