Встроенные стили против классов - PullRequest
32 голосов
/ 29 июня 2010

Я всегда знал, что для любого проекта я использую классы поверх встроенных стилей. Но есть ли какие-нибудь статьи / публикации / блоги, определяющие плюсы / минусы каждого? Я спорю об этом, и я не могу найти сообщение в блоге, которое я прочитал об этом давно.

Ответы [ 11 ]

31 голосов
/ 30 июня 2010

Прежде всего:

  • Если HTML создается или генерируется независимо от общего дизайна сайта (например, общего кода шаблона), то добавьте классы с разумным именем и идентификаторы, связанные исключительно с внешней таблицей стилей.(ы).Используйте достаточное количество элементов для произвольного манипулирования CSS.Например, см. CSS Zen Garden . Это относится ко ВСЕМ CMS, программам, сценариям и другому динамически генерируемому содержимому сайта. Вывод HTML не должен содержать абсолютно никаких стилей или макетов.Без исключений.

Предполагая, что вы имеете дело со статическим контентом, тогда:

  • Если есть какой-либо способ повторно использовать стиль, сделайте его классом иссылка на таблицу стилей.

  • Если нет способа когда-либо повторно использовать стиль (это единственная вещь, которая нигде больше не имеет смысла), тогда используйте блок <style>, которыйссылается на элемент # id.

  • Если атрибут CSS имеет смысл только в контексте окружающего HTML (например, некоторые варианты использования clear:), тогда я встраиваю стиль в элемент.

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

Однако, вместо того, чтобы подписываться на стилистическую догму, я считаю, что вы должны выбирать метод, основанный на ваших обстоятельствах, который максимально снижает общую нагрузку.Таблицы стилей добавляют уровень косвенности, который облегчает изменения на уровне сайта и помогает обеспечить согласованность.Но если у вас есть несколько десятков классов на каждой странице, которые используются только в одном месте, то вы фактически увеличиваете свою рабочую нагрузку, а не уменьшаете ее.

Другими словами, не делайте что-то глупое и запутанное простопотому что люди говорят вам, что это правильный способ сделать это .

24 голосов
/ 29 июня 2010

Есть простая причина. Смысл CSS заключается в том, чтобы отделить контент (HTML) от представления (CSS). Все дело в доступности и повторном использовании кода .

7 голосов
/ 30 июня 2010

Если бы выбор был, мое первое предпочтение будет иметь классы / другие селекторы.Тем не менее, существуют ситуации, когда встроенные стили - единственный путь.В других ситуациях, просто класс CSS сам по себе требует слишком много работы, и другие типы селекторов CSS имеют больше смысла.

Предположим, вам приходилось разбивать полосу по заданному списку или таблице.Вместо применения определенного класса к каждому альтернативному элементу или строке, вы можете просто использовать селекторы для выполнения работы.Это сделает код простым, но он не будет использовать классы CSS.На проиллюстрируем три способа :

Использование только класса

.alternate {
    background-color: #CCC;
}

<ul>
    <li>first</li>
    <li class="alternate">second</li>
    <li>third</li>
    <li class="alternate">fourth</li>
</ul>

Использование структурных селекторов класса +

.striped :nth-child(2n) {
    background-color: #CCC;
}

<ul class="striped">
    <li>first</li>
    <li>second</li>
    <li>third</li>
    <li>fourth</li>
</ul>

Использование встроенных стилей

<ul>
    <li>first</li>
    <li style="background-color: #CCC">second</li>
    <li>third</li>
    <li style="background-color: #CCC">fourth</li>
</ul>

Второй способ выглядит наиболее переносимым и инкапсулированным для меня.Чтобы добавить или удалить полосы из любого заданного элемента контейнера, просто добавьте или удалите класс striped.

Однако существуют случаи, когда встроенные стили не только имеют смысл, но и являются единственным выходом.Когда набор возможных значений огромен, глупо пытаться создавать классы заранее для каждого возможного состояния.Например, пользовательский интерфейс, который позволяет пользователю динамически размещать определенные элементы в любом месте экрана путем перетаскивания.Элемент должен быть расположен абсолютно или относительно с фактическими координатами, такими как:

<div style="position: absolute; top: 20px; left: 49px;">..</div>

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

.pos_20_49 {
    top: 20px;
    left: 49px;
}
.pos_20_50 {
    top: 20px;
    left: 50px;
}
// keep going for a million such classes if the container size is 1000x1000 px

<div class="pos_20_49">..</div>
5 голосов
/ 30 июня 2010

Используйте здравый смысл.

Все знают, что представление и контент в идеальном мире должны быть разделены.Все также знают, что это не очень хорошо работает большую часть времени.Мы все знаем, что вы должны использовать div, а не таблицы для макета, но мы также знаем, что при любых обстоятельствах, когда у вас нет полного контроля над контентом, он просто не работает должным образом.

Загрузка таблицы стилей 500 КБ для стилизации одного элемента, поскольку вы выбрали все возможные стили и вставили их в таблицу стилей, убьет вашу страницу, загрузив 500 таблиц стилей меньшего размера, чтобы оформить вашу страницу, потому что все они вам нужны, также убьют вашу страницу

Повторное использование прекрасно в концепции, но реальность такова, что это полезно только в определенных контекстах.Это в равной степени относится практически ко всем, где существует эта концепция.Если ваш проект делает то, что вы от него хотите, делает это в любом подходящем браузере, делает это эффективно и надежно, то все в порядке, реструктурировать CSS не так сложно, как в коде.

3 голосов
/ 29 июня 2010

Я не могу придумать никаких плюсов для встроенных стилей.

CSS - это Прогрессивное улучшение и не повторение (СУХОЙ) .

С помощью таблиц стилей изменить внешний вид становится так же просто, как изменить одну строку в HTML-коде.Сделать ошибку или клиенту не нравятся изменения?вернуться к старой таблице стилей.

Другие преимущества:

  1. Ваш сайт может автоматически настраиваться на различные носители, например, для распечатки и для портативных устройств.

  2. Исправленные в CSS исправления CSS для этого ужасного браузера, который не должен быть назван , становятся несложными.

  3. Ваши пользователи могут легко настроить сайт с помощью плагинов, таких как «Стильный».

  4. Вы можете с легкостью повторно использовать или обмениваться кодом с сайта на сайт.

2 голосов
/ 15 сентября 2011

Чтобы завершить эту тему, стоит упомянуть, что встроенные стили - единственный способ перейти в GMail при создании электронных писем HTML + CSS.

Для получения подробной информации см .: http://www.email -standards.org / clients / gmail /

2 голосов
/ 30 июня 2010

Я могу вспомнить только две ситуации, когда встроенные стили являются подходящими и / или разумными.

  1. Если встроенные стили применяются программно. Например, отображение и скрытие элементов с помощью JavaScript или применение специфичных для содержимого стилей при отображении страницы (см. # 2).

  2. Если встроенные стили завершают определение класса для одного элемента в случаях, когда идентификаторы не являются ни подходящими, ни разумными. Например, установка background-image элемента для одного изображения в галерее:

HTML

<div id="gallery">
    <div class="image" style="background-image:url(...)">...</div>
    <div class="image" style="background-image:url(...)">...</div>
    <div class="image" style="background-image:url(...)">...</div>
</div>

CSS

#gallery .image {
    background: none center center;
}
1 голос
/ 30 июня 2010

Встроенные стили , безусловно, путь.Просто посмотрите на http://www.csszengarden.com/ - это никогда не было бы возможно с классами и внешними таблицами стилей ...

или подождите ...

1 голос
/ 30 июня 2010

Предполагая, что вы используете внешние таблицы стилей, дополнительным преимуществом помимо упомянутых ранее является кэширование. Браузер будет загружать и кэшировать вашу таблицу стилей один раз, а затем использовать локальную копию каждый раз, когда на нее ссылаются. Это позволяет вашей разметке быть более компактной. Меньшая разметка для передачи и анализа означает более отзывчивое ощущение и лучшее восприятие для ваших пользователей.

0 голосов
/ 01 февраля 2019

С добавлением пользовательских свойств в CSS, теперь есть еще один вариант использования. Можно использовать встроенный стиль для установки пользовательских свойств.

Например, ниже я использую сетку CSS для выравнивания списков HTML и блоков Div и хочу иметь гибкость в HTML (так, как это обеспечивает BootStrap или любая другая инфраструктура), так как этот HTML динамически генерируется приложением.

CSS:

:root{
--grid-col : 12;
--grid-col-gap:1em; 
--grid-row-gap:1em;
--grid-col-span:1;
--grid-row-span:1;
--grid-cell-bg:lightgray;
}

.grid{
    display: grid;
    grid-template-columns: repeat(var(--grid-col), 1fr);
    column-gap: var(--grid-col-gap);
    row-gap: var(--grid-row-gap);
}

.grid-item{
    grid-column-end: span var(--grid-col-span);
    grid-row-end: span var(--grid-row-span);
    background: var(--grid-cell-bg);
}

HTML:

    <ul class="grid" style="--grid-col:4">
        <li class="grid-item">Item 1</li>
        <li class="grid-item">Item 2</li>
        <li class="grid-item">Item 3</li>
        <li class="grid-item">Item 4</li>
        <li class="grid-item">Item 5</li>
        <li class="grid-item">Item 6</li>
        <li class="grid-item">Item 7</li>
        <li class="grid-item">Item 8</li>
    </ul>

В приведенном выше HTML, чтобы изменить четыре столбца на 3, я изменяю пользовательское свойство, используя атрибут style:

    <ul class="grid" style="--grid-col:3">
        <li class="grid-item">Item 1</li>
        <li class="grid-item">Item 2</li>
        <li class="grid-item">Item 3</li>
        <li class="grid-item">Item 4</li>
        <li class="grid-item">Item 5</li>
        <li class="grid-item">Item 6</li>
        <li class="grid-item">Item 7</li>
        <li class="grid-item">Item 8</li>
    </ul>

Вы можете проверить расширенный пример в реальном времени на https://codepen.io/anon/pen/KJWoqw

...