Pull to refresh

Comments 37

Edge со следующей версии должен поддерживать, а для IE и Opera Mini есть полифил, так что не все так плохо.
:-webkit-details-marker

Очень кроссбраузерно.


И как анимировать?

С анимацией есть свои тонкости. Но в общих чертах вы можете анимировать появление вложенного элемента. Например так:
details[open] .dropdown-menu {
  animation: slide .3s ease-in-out;
}

@keyframes slide {
  0%    {opacity: 0; transform:  translate(0, -10px); }
  100%  {opacity: 1; transform:  translate(0, 0);}
}



Очень кроссбраузерно

В лисе (70.0.1) работает.
В сафари тоже.

UFO just landed and posted this here
Спасибо. Подправил пример

Автор подлампичить успел, пруфов не будет.

Большая куча -webkit-штук в лисе-таки работает. Например, -webkit-background-clip: text в связке с -webkit-text-fill-color: transparent. Но этому конкретному псевдоэлементу (как и его товарищам по оформлению нативных контролов) не так повезло, да.

UFO just landed and posted this here

Префикс -moz фактически остался только у тех самых деталей реализации (для новых свойств все браузеры дружно отказались от префиксов в пользу флагов), но да, по-видимому всё решает баланс востребованности фичи и легкости реализации. Для стилизации скроллбаров ребята из Мозиллы не поленились написать с нуля целую новую спеку, лишь бы не перенимать ::-webkit-scrollbar и т.п.

Справедливости ради, префикс -webkit- во многих случаях давно перестал быть "вендорским", так что его наличие – еще не показатель некроссбраузерности (нестандартности – пожалуй, да). А с нативными контролами по части CSS-оформления вообще традиционно всё очень плохо, и без браузероспецифичных костылей можно будет обойтись очень нескоро...

Спасибо Вам, добрый человек, очень помогло! Я до сих пор очень многое из описанного делал по колхозному с помощью бустрапа((
Делал как-то дерево на details. Все работает нормально, но код невалидный — они не могут быть вложенными.
Ради любопытства зашел на validator.w3.org. Сделал 4 уровня вложенности. И тот не выдал ни одной ошибки.
Element details not allowed as child of element summary in this context.

Видимо, ваше дерево было проще моего.
UFO just landed and posted this here
Где же вы были месяц назад!
Спасибо большое за статью в любом случае)
  • Производительность хуже. Вы должны самостоятельно реализовывать функционал который уже встроен в браузеры. То есть лишние стили, лишние скрипты лишняя работа для браузера. В некоторых случаях браузеру сложнее пересчитать шаблон и перерисовать страницу. При использовании встроенного элемента браузер знает о его возможностях и может более эффективно отрисовать страницу.


  • Реализация не всегда настолько хороша. Скажем, вы задумывались о том, что контрол, по клику на который должен переключиться класс должен реагировать не только на клик мышкой, тап по экрану но и на клавиатуру? Задумывались о том, что он должен быть доступен при проходе табуляцией? Конечно, если для этого использовался <button> то всё более менее хорошо, но ведь очень часто используют какой-либо другой элемент, который только выглядит как кнопка, скажем


    <span class="btn">

    И это ужасно. Ведь, если не используете мышь, то вы никогда не сможете использовать этот контрол. При использовании встроенных элементов вам о таких вещах думать не нужно. Об этом позаботятся браузер и ОС.


  • Семантика и контекст. Если вы воспринимаете страницу не визуально (как это делают многие люди и абсолютно все боты и программы) то для вас крайне важно понимать контекст. Для вас <div> или <span> не говорят ничего. Даже <button> — это просто кнопка без привязки к чему либо. <details> же указывает на то, что это интерактивный элемент, у которого есть оглавление и при желании можно раскрыть детали. Конечно есть aria-атрибуты, но далеко не многие разработчики об этом задумываются. Даже мои примеры сделаны не лучшим образом с точки зрения семантики. На эту тему советую посмотреть доклад "Семантика для циников, Вадим Макеев"


Единственный плюс, который я увидел и он мне он лично нравится это взаимодействие со страницей при нажатии на таб или просмотра страницы с электронной книги.

Производительность хуже.

Давайте конкретнее. Производительность хуже если одновременно открывать и закрывать 1 000 000 html элементов? на обычных сайтах это будет незаметно.

То есть лишние стили, лишние скрипты лишняя работа для браузера.

То же самое я вижу и в вашем примере. Лишние стили чтобы взаимодействовать с иконкой.

details[open] summary:before {
  content: '\f146';
}

и опять же чем тогда данный CSS селектор будет отличатся от .details.open? :)

Задумывались о том, что он должен быть доступен при проходе табуляцией?

Семантика и контекст.

В обоих случая согласен. Есть важна семантика то данный тег отлично вписывается.

Говоря про производительность я говорю вот про что.
Возьмём для примера простой код:


<div class="details">
  <span class="summary">Details</span>
  <p class="hidden">Lorem ipsum dolor sit amet consectetur adipisicing elit. Optio temporibus aliquam at tempora repellat consectetur eos voluptate facilis tempore obcaecati laborum animi sunt, rem quis. Dolore, ipsa. Tempora, soluta quaerat!</p>
</div>

document.querySelector('.summary').onclick = () => 
  document.querySelector('.details > p').classList.toggle('hidden')

Браузер должен:


  1. Скачать несколько байт JavaScript кода.
  2. Спарсить его.
  3. Скомпилировать.
  4. Найти элемент .summary в дом дереве.
  5. Повесить на него обработчик событий.
  6. Держать его в памяти.
  7. По клику найти в дом дереве целевой элемент .details.
  8. Изменить в нем набор классов.
  9. Пересчитать для этого элемента стили.
  10. Пересчитать стили для всей страницы.
  11. Заново отрисовать страницу.


В случае использования встроенных элементов, браузеру нужно всего-то


  1. Пересчитать для этого элемента стили.
  2. Пересчитать стили для всей страницы.
  3. Заново отрисовать страницу.

Я понимаю, что разница мизерная. Но Великое берёт начало с малого.

Еще добавлю свои пять копеек. Допустим, на вашем ресурсе пользователям доступна кастомная верстка с возможностью добавлять «спойлеры». Вы предоставляете контент по API в виде html, чтобы ускорить отображение (пусть даже с какой-то конфигурацией). Теперь у вас есть выбор — либо использовать checkbox для того чтобы открывать/закрывать содержимое, либо вешать listener на документ, чтобы подгружаемые по xhr спойлеры сразу работали. Притом если по какой-то причине исполнение js прервется до навешивания этого слушателя, то спойлеры вообще не будут работать.

Ну и, понятное дело, что если вы используете какой-нибудь react или vue — в вашу сторону за такие «навешивания» будут коситься.

Нативное решение для достаточно популярного элемента интерфейса — это всегда лучше чем пусть и проверенные временем костыли.
Спасибо за обозрение тега. (по сути если очень надо без JS, этого же эффекта раскрывашки можно добиться через input type=«checkbox» + label, но так действительно проще, ) И у меня вопрос. А как держать внутреннее содержимое summary по дефолту открытым?

Как я и написал — просто добавить атрибут open


<!-- Содержимое по-умолчанию видимо -->
<details open> ... </details>

При переключении этот атрибут добавляется/удаляется.

Интересно и очень круто. Если не пользоваться bs конечно

Вы можете делать так как я в своих примерах: брать от бутстрапа только стили, а JS добавлять собственный и только там где нужно.

Kozack, не знаете, а автопрефиксеры вообще нормально работают с details?

Что вы имеете в виду? С точки зрения CSS это абсолютно стандартный html тег.

Я имею в виду вещи типа ::-webkit-details-marker – поддерживаются ли они автопрефиксером для разных браузеров, скорее всего они для разных браузеров имеют разную семантику.

Как выяснили выше в комментах, "для разных браузеров" они и не нужны, только для Chrome и Safari. В Firefox треугольник у summary – обычный маркер списка, и убирается штатно через list-style: none или display: block (вместо дефолтного list-item).


К сожалению, оформление встроенных браузерных контролов ("виджетов", как их называют в спеке) – всё еще одна из самых больных тем в верстке. Но есть надежда, что в обозримое время это изменится...

Sign up to leave a comment.

Articles