Как писать css в html коде
Перейти к содержимому

Как писать css в html коде

  • автор:

TailwindCSS – очередной фреймворк или новый шаг эволюции?

Лид-изображение

Очевидно, я бы не стал писать эту статью, если бы считал, что TailwindCSS – просто очередной фреймворк. Я считаю, что он кардинально отличается от всех других фреймворков и создает отдельную парадигму web-стилизации. И при этом выполняет все поставленные перед ним задачи, делая это лучше и удобнее других.

Тех, кто еще не знаком с TailwindCSS, я постараюсь завербовать в ряды его поклонников. Тех, кто против него, я постараюсь заставить в этом усомниться и пересмотреть своё мнение.

Я также хотел узнать ваше мнение по этому поводу. TailwindCSS – это шаг вперед, назад или просто топтание на месте? Свой ответ вы можете оставить в опросе в конце статьи. А если вам есть, что добавить по теме, пожалуйста, сделайте это в комментариях.

Кто не в курсе, TailwindCSS – это CSS-библиотека, которая упрощает стилизацию HTML, тем же путем, как это делает Bootstrap, – добавляя огромное количество разнообразных классов. Но, в отличие от Bootstrap, который добавляет уже готовые к употреблению компоненты, такие как кнопки, алерты и навбары, классы TailwindCSS нацелены на конкретное свойство. В TailwindCSS нет заранее написанной кнопки, её ты должен сделать сам.

По факту, вы пишете свой CSS как HTML-классы в формате похожем на популярный плагин Emmet. Ерунда? Как бы не так. Всё дело как всегда в деталях и окружении.

Я прекрасно понимаю людей, которые морщатся при виде такого формата записи. И я понимаю почему. Но мне кажется, что это просто плохая привычка из «программистского детства».

Мы попробуем избавиться от неё и понять все плюсы работы с TailwindCSS. Для этого сначала перечислим все минусы, которые якобы свойственны таким CSS-фреймворкам. А затем разберемся, есть ли они в TailwindCSS.

Проблемы

  1. Как бы много ни было классов, мы всё равно ограничены данным нам набором. Мы загоняем своё оформление в придуманные за нас рамки, что приводит к тому, что все сайты, написанные на TailwindCSS похожи друг на друга.
  2. У нас будет куча лишних стилей, которые мы не используем.
  3. Если нам нужно сделать две одинаковых кнопки, нам придется еще раз писать те же самые классы в другом месте.
  4. Засорять HTML стилями – это строго против правил. Всех верстальщиков «с пелёнок» учат не писать стили inline, а TailwindCSS нарушает эту аксиому.

Если я что-то пропустил, жду ваши предложения в комментариях. Обязательно добавим и обсудим.

Проблемы описаны в порядке сложности их решения. Мы пойдем по порядку, начнем с самых простых проблем и закончим самыми фундаментальными. Итак.

1. TailwindCSS – это не Bootstrap

Вроде бы небольшое отличие TailwindCSS от всех других CSS-фреймворков, во главе которых Bootstrap, а именно классы как свойства, а не классы как компоненты, меняет примерно всё. И если внешне TailwindCSS на них похож, по своей сути, он нечто совсем другое – новый подход к написанию CSS.

Если вы считаете, что TailwindCSS лишает сайты оригинальности, значит вы эту разницу пока не видите. Во-первых, претензия к одинаковости касается именно Bootstrap и подобных фреймворков с классами как компонентами. Во-вторых, даже там при желании всё можно кастомизировать до неузнаваемости, переписав классы под свои нужды и разбавив с классами из чистого CSS.

В чем основная сила Bootstrap – он хорошо подходит для proof of concept. Быстро нарисовать более-менее красивый интерфейс, когда нужно показать функционал, – это Bootstrap. Нам не столь важен внешний вид, главное, чтобы быстро и глаза не резало (например, в админпанели), – это тоже Bootstrap.

TailwindCSS в таких случаях не подходит по определению. У вас нет готовых компонентов, вам всё нужно писать с нуля (TailwindUI не в счет).

Конечно, TailwindCSS изначально тоже вас ограничивает. Например, есть margin со значением 2.5rem , есть 3rem , но нет 2.75rem . Ограничение. Однако оно легко решается настройками в файле tailwind.config.js , где вы можете добавить любые значения, нужные вам в проекте.

Вы можете добавлять, удалять и переписывать любые классы. Если вдруг вас не устраивает цвет bg-red-500 , вы можете его изменить одной строчкой кода. В других фреймворках вам бы пришлось менять компоненты. Подробнее о кастомизации читайте в документации.

2. Никаких лишних стилей

Проблема с переизбытком лишних классов также решается с помощью tailwind.config.js . Если раньше вам нужно было добавлять PurgeCSS или другую библиотеку для удаления лишних классов, теперь TailwindCSS сделает это за вас. Всё, что вам нужно сделать, – указать папку, где хранятся ваши файлы с разметкой. TailwindCSS сам пройдется по ним, найдет все использованные классы, их оставит, а остальные удалит.

Если какие-то классы добавляются через JavaScript, укажите их в whitelist, TailwindCSS также их сохранит. Подробнее в документации.

3. Переиспользуемость

Если писать CSS в inline-стиле, для одинаковых или почти одинаковых кнопок каждый раз придется писать почти один и тот же код. Как эту проблему можно решить в TailwindCSS? It depends.

Если вы пишете код без фронтенд-фреймворка, ваш выбор очевиден – это директива @apply .

У вас есть кнопка

И тут вам нужно использовать её где-то еще. Можно просто скопировать эту кнопку и вставить HTML-код в другое место. А можно открыть main.css файл и скопировать TailwindCSS-классы туда в отдельный CSS-класс.

@tailwind base; @tailwind components; .btn < @apply bg-blue-500 text-white font-bold py-2 px-4 rounded; >@tailwind utilities;

Теперь мы можем просто добавить btn как обычный CSS-класс в HTML и переиспользовать сколько угодно раз. При этом мы можем как-угодно кастомизировать нашу кнопку, просто добавляя TailwindCSS-классы.

 

Кнопки

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

Если же модифицированная кнопка используется не в одном месте, а в множестве, можно сделать модификатор. TailwindCSS вас в этом не ограничивает, но и не заставляет. При желании можно создать отдельный класс, и уже писать btn btn-red . Подробнее в документации.

Если вы используете любой фронтенд-фреймворк, у вас вообще нет данной проблемы. Вам не нужна директива @apply . Вы просто делаете отдельный компонент для любого повторяющегося кода. Легко и удобно.

Для примера воспользуемся самым простым из возможных вариантов – Alpine.js.

 

Даже если вы не планировали использовать фреймворк, 7 килобайт, которые вы потратите на Alpine.js, быстро окупятся. Подробнее об Alpine.js в других моих статьях.

А если вы вместо Alpine.js используете полноценный компонентный фреймворк (React, Vue и др.), это становится еще проще. Вы просто добавляете , где внутри скрыта вся логика.

4. Писать стили в HTML – это не плохо

Как ни крути, последнюю проблему невозможно решить. Потому что здесь это основная фича. Менять нужно не фреймворк, менять нужно отношение к нему.

Большую часть истории Web писать стили в HTML-коде было моветоном. Использовать тег style было жутко неудобно, всё превращалось в жуткую колбасу, которую было невозможно разобрать. К тому же, некоторый новый функционал, например media-запросы (в TailwindCSS они есть как приставки sm: , md: ), в нем просто не поддерживались. Отформатированный CSS был элементарно удобнее.

Когда появился Bootstrap, весь предыдущий негативный опыт отразился на отношении сообщества к такому подходу. И он сохранился до сих пор, хотя объективных причин для этого нет.

При правильной реализации, описывать стилизацию вместе с разметкой оказывается невероятно удобно. Удобно видеть HTML-элемент и сразу понимать, как он стилизован. Удобно писать верстку, не перескакивая из файла в файл. Если вы писали на Vue или на Svelte, вы знаете, о чем это я.

Заключение

Так какое же место занимает TailwindCSS в истории CSS?

Он удобнее ванильного CSS и не создает проблем со вложенностью и коллизией имен классов.

Он отлично работает со всеми препроцессорами. Поэтому, если вам нужно построить базу стилей с переменными, прогнать цикл и т.п., TailwindCSS этому никак не мешает.

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

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

Мне нравится формат работы со стилями, который мне предлагает этот фреймворк. Но каждый должен попробовать и решить это для себя самого. Мне рекомендовали TailwindCSS со словами: «Попробуй, потом не захочешь делать по другому». Я попробовал, и теперь мне не хочется делать по другому. Попробуйте и вы.

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

DevTools

Выбираем элемент, в панели нажимаем .cls , пишем классы, а затем просто копируем их к себе в верстку.

UPD: Для тех, кто еще сомневается, пару ссылок на дорожку про атомарный CSS:

  • В защиту методологии Utility-First CSS
  • In defense of Functional CSS (en)

Как писать css в html коде

Задаёт стили прямо в HTML-коде страницы.

Время чтения: меньше 5 мин

Открыть/закрыть навигацию по статье
Контрибьюторы:

  • Алёна Батицкая ,
  • Светлана Коробцева

Обновлено 13 декабря 2021

Кратко

Скопировать ссылку «Кратко» Скопировано

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

Пример

Скопировать ссылку «Пример» Скопировано

      p  color: red; >    

This is my paragraph.

DOCTYPE html> html> head> style> p color: red; > style> head> body> p>This is my paragraph.p> body> html>

Как пишется

Скопировать ссылку «Как пишется» Скопировано

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

    /* Стили */   head> style> /* Стили */ style> head>      

Атрибуты

Скопировать ссылку «Атрибуты» Скопировано

  • media — укажите этот атрибут, чтобы один и тот же элемент на странице отображался по-разному на разных устройствах: например, телефоне или проекторе. К примеру, хочется, чтобы основной текст выглядел крупнее на проекторе, чем при просмотре на экране компьютера. Для этого добавь атрибут media со значением «projection» и пропиши размер шрифта, например, font — size : 120 % ; . Вот какие есть варианты устройств, можно указать несколько через запятую:
    • all — все устройства;
    • braille — устройства, основанные на системе Брайля, которая создана для слепых людей;
    • handheld — смартфоны и другие устройства с узким экраном;
    • print — принтер;
    • screen — стандартный экран компьютера — это значение по умолчанию;
    • speech — речевые синтезаторы, а также программы для воспроизведения текста вслух и речевые браузеры;
    • projection — проектор;
    • tty — телетайпы, терминалы, портативные устройства с ограниченными возможностями экрана;
    • tv — телевизор.

    Ещё примеры

    Скопировать ссылку «Ещё примеры» Скопировано

    Попробуем сделать основной заголовок на странице ещё крупнее, зададим шрифты без засечек и чёрный цвет:

          Кулинаный блог Марфы  h1  font-size: 30px; font-family: "Roboto", sans-serif; color: #000000; >    

    Как испечь настоящие круассаны?

    DOCTYPE html> html> head> meta charset="utf-8"> title>Кулинаный блог Марфыtitle> style> h1 font-size: 30px; font-family: "Roboto", sans-serif; color: #000000; > style> head> body> h1>Как испечь настоящие круассаны?h1> body> html>

    А в этом примере цвет и фон текста в абзаце будет меняться в зависимости от ширины экрана:

          p  background-color: white; color: #663613; >    p  background-color: #FF8630; color: black; >    

    Чтобы испечь настоящие круассаны.

    DOCTYPE html> html> head> style> p background-color: white; color: #663613; > style> style media="all and (max-width: 500px)"> p background-color: #FF8630; color: black; > style> head> body> p>Чтобы испечь настоящие круассаны. p> body> html>

    На практике

    Скопировать ссылку «На практике» Скопировано

    Дока Дог советует

    Скопировать ссылку «Дока Дог советует» Скопировано

    �� Лайфхак: чтобы быстрее загружался сайт, особенно на телефоне или при медленном интернете, нужно тот код, который отвечает за отображение верхней части сайта, вставлять в в формате / * Наш C S S — код * / < / style>.

    То есть туда можно встроить шапку сайта, верхние баннеры, заголовки — то, что отображается сразу при открытии. А всё, что ниже можно потом подгрузить через JavaScript после загрузки всей страницы. Так мы сразу показываем пользователю контент, он начинает его читать, а тем временем догружается нижняя часть сайта.

    Больше информации о таком подходе можно найти по запросу «критический CSS».

    Алёна Батицкая советует

    Скопировать ссылку «Алёна Батицкая советует» Скопировано

    �� Многие начинающие разработчики грешат тем, что прописывают стили прямо внутри HTML-разметки при помощи тега . Так делать не нужно.

    Один из принципов вёрстки: разделение содержимого и оформления. Содержимое это разметка страницы, а оформление, соответственно, CSS-стили.

    Не редки ситуации, когда после вёрстки сайт натягивается на систему управления — CMS. Из HTML-разметки создаются шаблоны, для подтягивания данных из панели администратора используется PHP.

    Как итог после таких манипуляций менять HTML будет достаточно проблематично и потребует дополнительных знаний. А вот доступ к стилям, если они вынесены в отдельный файл, у тебя останется. Таким образом можно будет полностью преобразить сайт, не меняя при этом разметки.

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

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

    Хотя удобнее делать то же самое в инструментах разработчика самого браузера ��

    �� На самом деле тег можно размещать вообще в любом месте страницы, не обязательно в и это будет работать! Но делать так не стоит ��

    Правила оформления HTML-кода

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

    1.2 Теги и атрибуты записываются в нижнем регистре

    Символы нижнего регистра не привлекают к себе большого внимания, и вам легче будет найти нужный.

    1.3 Отдельные логические блоки отбиваются пустой строкой

    Это облегчает работу с кодом и визуально создает структуру документа.

    1.4 Используйте только двойные кавычки

    При написании значений атрибутов используйте только двойные кавычки.

    1.5 Не ставим пробелов перед и после символа =

    Поскольку правая часть непосредственно относится к левой, то атрибут и его значение должны быть написаны без пробелов.

    1.6 Между атрибутами один пробел

    Не используем переносов строк между атрибутами, только один пробел. Перенос строк принят в css-документах, но не в html-разметке. Пишите все атрибуты элемента в строку.

    1.7 Одиночные теги без закрывающего слэша

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

    2. Валидность

    Html-документ должен проходить проверку на валидность. Для проверки используйте валидатор.

    3. !DOCTYPE

    Первой строчкой в HTML-документе должен идти актуальный doctype . Это необходимо чтобы браузер верно отображал страницу. Это обеспечит единообразное отображение во всех современных браузерах.

    4. Кодировка

    Кодировка символов в html-документе всегда должна быть указана явно. Это обеспечит верное отображение текста. Кодировка utf-8 подходит всегда, за редким исключением.

    5. Подключение стилей

    Файлы со стилями подключаются внутри тега при помощи . Атрибут type для тега указывать не нужно, так как значение text/css устанавливается по умолчанию.

    Хорошо: стилевой файл подключён в секции head Плохо: стилевой файл подключён в секции body

    6. Подключение скриптов

    Скрипты при загрузке блокируют отображение содержимого страницы. По этой причине следует подключать их в самом конце html-документа.

    При подключении скриптов в теге атрибут type указывать не нужно, так как значение text/javascript устанавливается по умолчанию.

    Хорошо: скрипт подключается перед Плохо: скрипт подключается в секции

    7. Атрибуты и их порядок

    У HTML-элементов атрибут class пишется первым. Единообразное написание помогает легче считывать код и по классам быстрее разбираться в назначении блоков.

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

    8. Логические атрибуты

    Для логических атрибутов (например, checked , disabled , required ) значение не указывается, а сами атрибуты указываются последними и в единообразной последовательности во всём документе.

    9. Подписи input

    Для улучшения опыта пользователя, при нажатии на подпись поля, само поле должно активироваться. Для этого поле формы связывается с описанием при помощи идентификатора и атрибута for тега .

    Хорошо: элемент формы radio связан с подписью через id и for Хорошо: элемент формы radio и подпись обёрнуты в label Плохо: подпись не связана с элементом формы

    10. Атрибут языка

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

    Давайте писать HTML-код, как профессионалы

    Подпишись на наш телеграм-канал TechRocks WEB-разработка?

    Перевод статьи «Let’s write HTML like a pro».

    HTML-код

    HTML напоминает ребенка, с которым никто не играет, потому что JavaScript и CSS отвлекают внимание на себя. Сегодня мы рассмотрим несколько вещей, способных помочь вернуть этого «ребенка» в центр внимания.

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

    DOCTYPE

    Начнем с самого верха вашего index.html. Обязательно декларируйте DOCTYPE. Это активирует стандартный режим во всех браузерах и уведомляет их о том, как следует интерпретировать этот документ. Имейте в виду, что DOCTYPE не является элементом HTML.

    В HTML5 это выглядит следующим образом:

    Примечание: если вы используете фреймворк, эта часть будет заполнена без вашего участия. В противном случае я настоятельно рекомендую использовать сниппеты вроде Emmet, доступные в VS Code.

    Хотите узнать побольше о других типах документов? Можете почитать об этом здесь.

    Опциональные теги

    Некоторые теги в HTML5 опциональны, главным образом потому, что элемент присутствует неявным образом. Это может показаться странным, но вы вполне можете пропустить тег , и страница все равно прекрасно отобразится.

      Hello  

    Welcome to this example.

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

       Hello  

    Welcome to this example.

    Этот код невалиден, потому что комментарий оказывается вне тега .

    Закрывающие теги

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

     
    exampleexample

    example

    Все приведенные в этом примере теги валидны. Но есть и исключения из правила, предписывающего закрывать теги.

    В следующих элементах самозакрывающиеся теги валидны, но не обязательны:

    Примечание: обычные теги не могут быть самозакрывающимися.

    Это неправильное написание.

    Charset

    Заранее определяйте кодировку своего документа. Хороший тон — поместить эту информацию в самом верху, внутри элемента .

     This is a super duper cool title, right ��? 

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

      This is a super duper cool title, right ��? 

    Язык

    Еще одна причина не пропускать опциональные теги — использование атрибутов. Не отказываясь от тега , вы можете (и это рекомендуется) определить язык вашей веб-страницы. Это очень важно с точки зрения доступности и поиска.

    Тег title

    Никогда не пропускайте тег . Это очень ухудшает доступность. Кроме того, я бы не пользовался сайтом, где не используется этот тег. Если открыть страницу такого сайта, то 2 минуты и 20 вкладок спустя вы ее уже не найдете (вкладке будет нечего вам показать).

    Тег base

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

    Если в вашем приложении установлен базовый URL, как в примере выше, то href=»#internal» будет интерпретироваться как href=»http://www.example.com/#internal«.

    Но при этом href=»example.org» будет интерпретироваться как href=»http://www.example.com/example.org«.

    Description

    Этот мета тег очень полезен, хотя и не является неотъемлемой частью лучших подходов. Он имеет огромное значение для поисковиков, когда они исследуют ваш сайт.

    Семантические теги

    Хотя вы можете обойтись одними div-ами, это еще не значит, что так нужно делать. Семантический HTML наполняет вашу страницу смыслом. Такие теги как p, section, h, main, nav являются семантическими. Если вы используете тег

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

    Разбирать все семантические элементы разметки мы здесь не будем, но почитать о них вы можете здесь.

    Не используйте hr для форматирования


    это не элемент форматирования, так что прекращайте использовать его с этой целью. В HTML5 этот тег представляет тематический разрыв вашего контента. Правильное использование


    может выглядеть следующим образом:

    Абзац о щенках.

    Абзац о любимой еде щенков.

    Абзац о породах щенков.


    Абзац о том, почему я брею голову.

    Будьте осторожны, используя атрибут title

    Атрибут title это мощный инструмент. С его помощью создается всплывающая подсказка, способная пояснить действие или назначение элемента на странице. При этом не следует забывать, что этот атрибут и, например, атрибут alt для изображений не являются взаимозаменяемыми.

    Из спецификации HTML5 следует, что в настоящее время использование атрибута title не поощряется. Для появления всплывающей подсказки нужно навести на элемент указатель мыши, а это недоступное действие для тех, кто пользуется только клавиатурой или современными телефонами и планшетами.

    О правильном использовании этого атрибута можно почитать здесь.

    Одинарные и парные кавычки

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

    super funny meme
    super funny meme

    Опускайте булевы значения

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

    Опускайте атрибут type

    Не нужно добавлять атрибут type в теги script и style. В некоторых сервисах, например, в W3C Validator, вы получите ошибку валидации при проверке вашего кода.

    Проверяйте вашу разметку

    Используйте для проверки разметки специальные сервисы, к примеру, тот же валидатор от W3C. Это позволит вам быть уверенным, что ваша разметка валидна.

    Скажите «нет» встроенным стилям

    В HTML-файле пишется контент. То, как он выглядит, это уже представление. Оставьте представление CSS и не используйте встроенные стили. Это поможет как разработчикам, которые будут работать с кодом в дальнейшем, так и браузерам.

    Заключение

    Конечно, это лишь верхушка айсберга — просто несколько вещей, которые следует иметь в виду при написании разметки. Чтобы познакомиться с этой темой подробнее, можно обратиться к следующим источникам (среди прочих):

    • HTML best practices on GitHub
    • W3C school HTML style guide

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *