Оптимизация селектора CSS
Я снова трачу время на мелочи. Вопрос, который я задаю себе - и теперь ВЫ - это: что такое "лучший способ" для селекторов CSS/разметки HTML?
Я избегаю классов во что бы то ни стало, оставляя HTML чистым и красивым, или я добавляю классы, где бы я хотел что-то стиль?
Например, если я хочу стилизовать различные кнопки формы на моем веб-сайте, я иду
input[type="submit"] { /* styles */ }
или добавьте класс "form-button" для всех из них и сделайте
.form-button { /*styles */ }
В этом тривиальном примере можно было бы не слишком много думать об этом, но если я хочу по-другому стилизовать третье звено из семантического, а не презентационного списка, я мог бы сделать его
.navigation ul:nth-of-type(2) a:nth-of-type(3) { /* styles */ }
вместо того, чтобы просто указать, что одна ссылка класса "different-link" и использовать
.different-link { /* styles */ }
Я понимаю, что в 2013 году все вычислительные устройства и браузеры, которые они запускают, должны быть достаточно быстрыми, чтобы технически субоптимальные селектора CSS не должны были делать каких-либо различий для конечного пользователя.
Итак, в конце концов, на самом деле возникает вопрос: "Я помешал HTML (с классами) или я помешал CSS (с длинными ветвями)?"
Любые мнения по этому поводу?
Ответы
Ответ 1
Разделение проблем между HTML и CSS
Несмотря на то, что внешнее из HTML CSS следует рассматривать отдельно, оно фактически не в тех случаях, когда вы вставляете селекторов, специфичных для элемента HTML. В вашем случае, когда ваши селекторы относятся к фактическим элементам HTML, а их иерархия делает ваш CSS тесно связанным с вашим источником HTML. Это делает ваш CSS негибким и, вероятно, больше, чем он должен быть.
Следовательно, классы CSS. Всякий раз, когда вы используете классы, эти определения могут быть прикреплены к любому элементу HTML, если они определяют достаточно свойств. Это правда, хотя ваш HTML становится больше из-за дополнительных атрибутов, но семантика не изменяется.
Почему .form-button
лучше, чем input[type=submit]
, тогда?
Потому что вы можете изменить свой <input type=submit />
на <button type=submit>
, который является контейнером, и дает гораздо больше свободы дизайна дизайнерам пользовательского интерфейса. Если вы использовали CSS-классы, вы, вероятно, не изменили бы слишком много о его свойствах, но если бы вы использовали имена тегов, вам придется пересмотреть свой файл CSS и внести в него изменения.
Другой пример - с другими типами входов, то есть кнопкой "Отмена". Если он был визуально идентичен кнопке отправки, дизайнеры могут сказать, что Submit является основным действием, а Cancel является вторичным, поэтому он должен отображаться как простая ссылка. Использование классов приведет к меньшему обслуживанию снова.
Почему CSS только классов не является волшебной маркой?
Некоторые элементы могут иметь определенные свойства CSS, которых нет у других. Возьмите, например, (un) упорядоченные списки. В таких случаях имеет смысл написать тег-селектор для определения стиля CSS, который применяется к определенным элементам HTML. Но чтобы избежать выбора всех элементов одного типа на вашей странице, было предложено определить селектор CSS как комбинацию селектора на основе тегов и классов. Это делает так сказать ограничение селектора классов CSS, что имеет смысл в таких случаях.
Рекомендуется разделять общие свойства стиля только с помощью селектора на основе классов и добавлять специальные стили для тега + селектор на основе класса с ограничением как (синтаксис LESS/SCSS):
/* generic */
.navigation {
background-color: #999;
margin: 0;
.item {
display: inline-block;
padding: 10px;
}
}
/* specific to UL */
ul.navigation {
list-style: none;
}
Это дает вам максимальную свободу и улучшает ремонтопригодность до максимальной.
Вывод: предпочтительны селектор, основанный на классе : OOCSS
Да. Большую часть времени. Таким образом, вы сможете написать объектно-ориентированный CSS (статью о SmashingMag, Репозиторий GitHub) с меньшим дублированием кода и исключениями. Это улучшит вашу техническую поддержку CSS.
Важное примечание: Как и в случае с любым кодом, вы не должны слишком переустраивать свой CSS. Я показал вам, как вы можете предоставить гибкие определения стиля, но вы не должны всегда следовать этим правилам. Вы должны обеспечить достаточную гибкость в начале и рефакторинг по мере необходимости, пока вы идете. Но держать себя на стороне классов большую часть времени.
Ответ 2
Я вообще думаю о связи.
Если вы используете только теги и сложные селектора, вы тесно связываете свой CSS с HTML. Так что, если вы измените только крошечный бит разметки, вы наверняка в конечном итоге измените также CSS.
Это может быть хорошо для более простых сайтов, где у вас есть только одна или две страницы.
Для "сложных" сайтов с использованием классов, по моему мнению, обязательно.
Используя классы, вы можете отделить CSS от HTML. Я имею в виду, что если вы добавляете классы в основные элементы "вещи" (которые затем становятся модулем), вы можете изменять разметку, если вы держите одни и те же классы (очевидно, если вы меняете много, разметки, вам может потребоваться многое изменить и CSS. Для более простых изменений, таких как перенос элемента в div
или изменение h1
на h2
, вам не нужно будет менять CSS).
Кроме того, вам становится легче читать CSS, потому что когда вы читаете это:
.blog-posts > .blog-post > .blog-post-title
Вы знаете, что вы говорите о стиле заголовка сообщения в блоге, который лучше, чем
div > div > h1
(или любой другой аналогичный анонимный селектор).
Итак, если вы умело вписываетесь в классы, вы создаете модули, которые могут иметь более простые селектора, поскольку вам не нужно настраивать элементы из корневого элемента HTML, но из корня модуля элемент:
.blog-post-title {}
.blog-post-subtitle {}
.blog-post-body {}
.blog-post-tags {}
и т.д.
SMACSS, на мой взгляд, отличный способ организовать таблицы стилей, я предлагаю вам прочитать об этом. Как я писал ранее, если вы разрабатываете "простой" сайт, вам не нужна вся эта суета. Но для сложных сайтов использование многоразовых модулей - большой плюс.
Ответ 3
Ответ: зависит от того, что вы хотите.
Объяснение:
1) Возьмите этот селектор input[type="submit"]
, используя это, нацелитесь на все кнопки отправки на своем веб-сайте, вы можете использовать этот селектор, если хотите группировать/обобщать некоторые свойства ваших кнопок, например font-family
, font-weight
и т.д. Поэтому использовать это недостаточно, если вы хотите настроить таргетинг на определенную кнопку отправки.
2) Использование .form-button
будет нацелено на любой элемент с классом .form-button
, поэтому, чтобы сделать его более конкретным, вы можете использовать input[type=submit].form-button
, который ограничит класс, который будет использоваться только для кнопок отправки. Кроме того, вам нужно объявлять класс каждый раз, когда вам нужно стилизовать кнопку.
3) .navigation ul:nth-of-type(2) a:nth-of-type(3)
Вот что я говорю над конкретным селектором. Это просто ухудшит производительность. Мало того, это также вызовет серьезные проблемы с конкретностью. Вам нужно использовать это, где вы не можете изменить разметку. Вместо этого вызов элемента class
для элемента, который вы планируете настроить, будет намного проще, как вы указали в последней точке вашего вопроса.
Вывод:
input[type="submit"]
- Используйте это для группировки похожих свойств, которые будут использоваться всеми кнопками отправки на вашем веб-сайте.
.form-button
- используйте это для целевых кнопок, которые вы хотите иметь уникальные стили (дополнительные стили, которые вы хотите, помимо свойств, объявленных в input[type=submit]
)
.navigation ul:nth-of-type(2) a:nth-of-type(3)
- Я не вижу причин использовать это, если и до тех пор, пока у вас не останется другой возможности, но использовать это, так как это не обязательно. Опять же, использование этого или нет зависит от некоторых обстоятельств, поэтому нельзя сказать полностью игнорировать это.
.different-link
- Разумеется, лучше, чем использовать специализированные селекторные кнопки для уникальной стилизации ваших кнопок.
Ответ 4
Мой простой ответ на этот вопрос будет следующим: вы должны выбрать элемент по имени tagName не классу или идентификатору, если вы даете тот же макет на веб-сайте.
Вопросы не имеют никакого смысла, поскольку вы сами делаете много предположений и постоянно отвечаете на него, и мнения здесь не допускаются, вы должны были задать вопрос на http://programmers.stackexchange.com. Вы упомянули
Я понимаю, что в 2013 году все вычислительные устройства и браузеры, которые они запускают, должны быть достаточно быстрыми, чтобы технически субоптимальные селектора CSS не должны были делать каких-либо различий для конечного пользователя.
Тогда что может быть проблемой?
Единственное различие между ними состоит в том, что они будут группировать элементы с одним и тем же именем тега или с тем же классом или идентификатором. Они ничего не сделают.
Теперь вам нужно полностью написать код, потому что на многих страницах вам может понадобиться изменить стиль кнопок.
Псевдо
Использование псевдо-класса или селектора - хорошая идея, только если вы хотите стилизовать дочерние элементы одного элемента, так как кнопка отправки не имеет дочерних элементов, тогда этот селектор является неопределенным.
Прямой выбор элемента
input[type="submit"] { /* styles */ }
Этот метод является самым простым, но лучшим, таким образом вы создаете все кнопки ввода, не беспокоясь о своих классах и идентификаторах. Я сам предпочитаю это.
Использование идентификатора или класса
.form-button { /*styles */ }
Возможно, вы захотите его использовать, когда вы создаете кнопку, которая должна быть больше или меньше, скажем, отправить кнопку подтверждения. Что должно отличаться от других.
Ответ 5
Это определенно не все одно или другое.
Ваш первый пример стилизации submit input
с помощью селектора css на основе атрибута приведет к переопределению этого объявления для случаев, когда вам нужна нестандартная или разная кнопка. Поэтому, вероятно, лучше использовать в этом случае очень общую декларацию CSS, а затем использовать классы для добавления разных вкусов к вашим кнопкам в зависимости от варианта использования.
Посмотрите Bootstrap.
Я думаю, что полагаться на CSS-каскад не следует упускать из виду (на самом деле это очень полезно и мощно), но в моей работе нецелесообразно пытаться вообще полностью устранить классы.