НачалоОсновыКомпонентыТексты

Разделитель панелей

Splitter делит область на панели, размер которых меняют, перетаскивая ручку между ними или с клавиатуры.

Стабильный Figma
ОбзорИспользованиеAPIДоступность

Folders

Messages

<tk-splitter style="block-size: 160px">
  <tk-splitter-panel size="30" min="15" max="60"><p>Folders</p></tk-splitter-panel>
  <tk-splitter-handle label="Resize folders"></tk-splitter-handle>
  <tk-splitter-panel><p>Messages</p></tk-splitter-panel>
</tk-splitter>

Анатомия

Часть Что это
tk-splitter группа; раскладывает панели по одной оси и хранит их размеры
tk-splitter-panel одна панель; вмещает что угодно и обрезает то, что не помещается
tk-splitter-handle линия между двумя панелями с зоной захвата 12px; одна остановка Tab

Панели и ручки — прямые потомки группы, по порядку: панель, ручка, панель и так далее. Ручка меняет размер только двух соседних панелей.

Направление и вложенность

orientation="horizontal" (по умолчанию) ставит панели рядом. orientation="vertical" ставит их друг под другом. Для раскладки в обе стороны вложите группу в панель.

Files

Editor

Console

<tk-splitter style="block-size: 240px">
  <tk-splitter-panel size="25" min="15"><p>Files</p></tk-splitter-panel>
  <tk-splitter-handle label="Resize files"></tk-splitter-handle>
  <tk-splitter-panel><tk-splitter orientation="vertical" style="block-size: 100%">
    <tk-splitter-panel size="70"><p>Editor</p></tk-splitter-panel>
    <tk-splitter-handle label="Resize console"></tk-splitter-handle>
    <tk-splitter-panel min="10"><p>Console</p></tk-splitter-panel>
  </tk-splitter></tk-splitter-panel>
</tk-splitter>

Размер группе задаёте вы, например block-size или дорожкой grid; панели делят его между собой.

Размеры

Размеры задаются в процентах от группы.

  • size: начальная доля панели. Панели без неё поровну делят остаток. Дальше splitter сам хранит размеры, пока их перетаскивают.
  • min и max: доля, меньше или больше которой панель не станет. Перетаскивание останавливается, когда любой из соседей упирается в предел, и пределы держатся при изменении размера окна. По умолчанию min равен 0, поэтому задайте нижний предел там, где содержимое должно оставаться пригодным.
  • Двойной щелчок по ручке возвращает её двум панелям начальное деление.

Сохранение раскладки

После каждого изменения, сделанного человеком, группа вызывает tk-resize с detail.sizes. Текущие размеры читайте из sizes, а восстанавливайте через setSizes(): он удерживает каждую панель в её пределах и не вызывает tk-resize.

const splitter = document.querySelector('tk-splitter');
splitter.addEventListener('tk-resize', debounce(() => {
  localStorage.setItem('layout', JSON.stringify(splitter.sizes));
}, 200));
const saved = localStorage.getItem('layout');
if (saved) splitter.setSizes(JSON.parse(saved));

Состояния

Fixed sidebar

Content

<tk-splitter style="block-size: 120px">
  <tk-splitter-panel size="30"><p>Fixed sidebar</p></tk-splitter-panel>
  <tk-splitter-handle label="Resize sidebar" disabled></tk-splitter-handle>
  <tk-splitter-panel><p>Content</p></tk-splitter-panel>
</tk-splitter>

При наведении и перетаскивании на линии появляется акцентная полоса 2px. При фокусе с клавиатуры вокруг зоны захвата появляется рамка.

  • disabled: фиксирует обе панели. Ручка становится простой линией, её нельзя перетащить и на неё нельзя перейти фокусом.