Лучшая практика для именования классов CSS для использования с селекторами jQuery
При создании тяжелого веб-приложения, основанного на Javascript, какова наилучшая практика для именования классов CSS для сохранения кода стилей Javascript и стилей CSS и гибкости структуры пользовательского интерфейса?
Вариант 1: однозначно назовите каждый отдельный элемент.
Например,
// HTML
<div id="list">
<button class="list-delete" />
<div class="list-items">
<div class="item">
<button class="item-delete" />
<h1 class="item-name">Item 1</h1>
</div>
</div>
</div>
// CSS
.list-delete {
color: black;
}
.item-delete {
color: blue;
}
// Javascript
$(".list-delete").show();
$(".item-delete").hide();
Плюсы:
- Выбор элемента для стилизации или манипуляции с JS легко
Минусы:
- Имена элементов начинают становиться очень длинными и трудно отслеживать
- Изменение структуры HTML требует много переименования
Вариант 2: Семантически укажите каждый элемент и выберите элементы иерархически.
Например,
// HTML
<div id="list">
<button class="delete" />
<div class="items">
<div class="item">
<button class="delete" />
<h1 class="name">Item 1</h1>
</div>
</div>
</div>
// CSS
#list > .delete {
color: black;
}
#list > .items > .item > .delete {
color: blue;
}
// Javascript
$("#list > .delete").show();
$("#list > .items > .item > .delete").hide();
Плюсы:
- Именование более естественно, а имена короткие и понятные.
Минусы:
- Выбор элемента для стилизации или манипуляции неудобен
- Изменение структуры HTML требует изменения множества селекторов, поскольку имена привязаны к иерархической структуре.
Вариант 3... n: какой-то гибридный подход? Полностью другой подход вообще?
Помните о проблеме столкновения имен при добавлении дополнительных элементов в будущем, особенно когда у вас есть вложенные элементы. Кроме того, идеальное решение упростит изменение структуры HTML существующих элементов без лишних нарушений во всем мире.
Ответы
Ответ 1
Попытка разобраться с уникальными именами может хорошо работать для небольших проектов, но чем больше вы получите, тем больше вероятность, что у вас будут конфликты.
Вот почему мне нравится второй подход.
Однако, чтобы упростить его, вы можете использовать SASS, чтобы предварительно обработать ваши файлы css. Затем вы можете вложить такие вложения:
#list {
.delete {
}
.items {
.item {
}
}
}
И вы получите код, похожий на ваш второй пример, без необходимости писать все.
Как и для селекторов jQuery, их все равно нужно будет записывать долго, если вы хотите сделать это таким образом, но такие сложные селекторы часто считаются признаком плохого дизайна.
Ответ 2
Я бы рекомендовал быть максимально консервативным при добавлении классов и идентификаторов в ваш HTML. В большинстве случаев использование идентификаторов для основных разделов содержимого и использование селекторов меток будет работать так же, как и помещение классов на все. HTML в вашем примере можно более кратко переписать как:
<div id="list">
<button class="delete" />
<div class="items">
<div>
<button class="delete" />
<h1>Item 1</h1>
</div>
</div>
</div>
И тогда селектора jQuery будут:
$("#list > .delete").show();
$(".items .delete").hide();
(Вы можете использовать теги HTML5, которые являются более семантическими и, таким образом, еще меньше полагаются на классы, но я предполагаю, что это выходит за рамки вопроса.)
Ответ 3
Самое чистое решение - разделить все: HTML - CSS - JS.
Для этого вы должны использовать свой первый подход (индивидуальное наименование позволяет применять CSS-классы к любому HTML-элементу), но дополнительно вы добавляете специально названные классы для JS. Таким образом, вам не нужно бояться разбить JS, если они удаляют класс CSS и наоборот.
Хорошо читайте о том, как наилучшим образом реализовать такое соглашение об именах:
http://nicolasgallagher.com/about-html-semantics-front-end-architecture/
// HTML
<div id="list">
<button class="list-delete js-list-delete" />
<div class="list-items">
<div class="item">
<button class="item-delete js-item-delete" />
<h1 class="item-name">Item 1</h1>
</div>
</div>
</div>
// CSS
.list-delete {
color: black;
}
.item-delete {
color: blue;
}
// Javascript
$(".js-list-delete").show();
$(".js-item-delete").hide();
Ответ 4
Это зависит от структуры и размера вашей страницы.
Некоторые ситуации будут лучше работать с Вариантом 1, некоторые будут лучше с Вариантом 2.
Я обычно говорю "Что лучше для этого конкретного сценария"
Ответ 5
Вариант 1: Назовите каждый отдельный элемент однозначно.
Это почти невозможно и определенно не лучшая практика. Я думаю, что лучше, если вы можете использовать классы, которые имеют смысл, группируя соответствующие стили и свойства.
Вариант 2: Назовите каждый элемент семантически и выбирать элементы иерархически.
Я предпочитаю этот. По крайней мере, вы знаете поток и вещи.
Вариант 3... n: какой-то гибридный подход? совсем другой подход вообще?
Всегда есть гибридный подход и совершенно другой подход. Я думаю, что у каждого разработчика есть свой стиль кодирования. Если это семантически правильно и хорошо структурировано, это будет лучший подход.
Ответ 6
Это очень хороший вопрос. Я думаю, что ваш первый вариант (имя каждого отдельного элемента однозначно) является правильным, потому что:
- Классы элементов (не имена) не так долго,
- Акцент делается на группе в целом в любом случае, поэтому структура HTML группы не должна меняться очень часто, а
- Дефекты в структуре пользовательского интерфейса могут быть легко распознаны таким образом.
Тем не менее, я бы использовал немного другую разметку:
<div id="list">
<button class="delete" />
<div class="list-items">
<div class="list-item">
<button class="delete" />
<h1 class="list-item-name">Item 1</h1>
</div>
</div>
</div>