Комментарии 31
<a id="my-task-card" href="#task=2"> <div id="my-task-card-title">Write CSS</div> </a> <a id="my-task-card" href="#task=3"> <div id="my-task-card-title">Write JS</div> </a>
http://frontender.info/css-performance-revisited-selectors-bloat-expensive-styles/
Разница чуть менее, чем никакая.
Какая производительность у селекторов по классам и селекторов по атрибутам? Есть разница?
Производительность по классам и по атрибутам примерно равна, но по классам быстрые на 10-20 мс, и то при условии, что сравнивается один класс и один атрибут.
В реалиях же селекция по классам часто не ограничивается одним классом, как и в случае с атрибутами, и в таком случае производительность по атрибутам будет более заметно проседать в скорости. Особенно учитывая современные объемы стилей, то такой подход будут виден абсолютно сразу.
Можно использовать бэм или не использовать его. Стили изолированно можно писать как угодно. JS к классам с префиксом js- или, в крайнем случае, к дата атрибутам.
Привязка к именам тегов — это не гибко, в случае статьи — невалидно.
Привязка к id — ограничение на использование один раз этого блока на странице
На самом деле никакого ограничения нет — вам наврали.
Тут тоже нет никаких ограничений.
То есть используете jQuery и вам надо писать не $('#my-task-card')
, а $('[id=my-task-card]')
.
id — должен быть уникальным по своей логике, зачем ее ломать? Ради каких целей?
Есть 2 набора свойств
1) .foo и .foo-mod
2 ).bar и bar-mod
Теперь появляется элемент совмещающий foo и bar.
Конфликт получается, если нужен только «foo foo-mod bar», но никак не «foo foo-mod bar bar-mod»
А еще можно использовать костыль .bar.bar-mod:not(.foo-mod), или как-то так.
Вариант с not очень уж костыльный, и совсем не расширяемый: добавление новых стилей не должно требовать модификации уже существующих, а not потребует дописывать новые стили в исключения каждый раз.
====
Я не очень хорош в объяснениях, тут достаточно неплохо описано мотивы длинного именования https://ru.bem.info/methodology/faq/#Зачем-писать-имя-блока-в-именах-модификаторов-и-элементов
.foo, .foobar {}
.bar, .foobar {}
.foobar {}
.bar.bar-mod, .foobar.bar-mod {}
Если использовать что-то в роде less то будет еще легче с переменными —
.foobar { background-color: @foo-color; border: @bar-border }
Ну а костыль not() на то и костыль что его можно использовать раз-другой и не поощрять такое поведение, если они начинают накапливаться — показатель, нужно уже перетасовать структуру классов.
В общем ИМХО надо по минимуму плодить длинные сущности (как в примере в статье) и использовать стандартизированные классы для «состояния».
.foobar опять требует от меня работы руками для написания .foobar.mod, а идея как раз в том, чтобы сочетать стили, а не писать их заново.
Это похоже на «Наследование VS Композиция» из ООП, вместо общего предка ".mod" предлагается реализовывать trait «mod» для каждой необходимой сущности
хотя это ничего и не ломает.
Ломает. JS у вас корректно работать не будет дальше первого айдишника.
CSS наших дней