Стандарт правильной верстки: часть вторая
Ну вот наконец-то я добрался и до второй части “стандартов”. Прошел месяц, а может быть даже и больше, блог я существенно проапгрейдил, так что писать в него теперь не стыдно (об этом в другой статье). Сейчас же я продолжу старую песню о правильной верстке. Ready? Steady? Go!
Элементы на странице, их поведение и стили
1. Поведение тега и его внешний вид не должны кардинально отличаться от стандартных
Широко используемые теги должны быть сброшены к виду, подходящему под конкретный дизайн:
- p всегда имеет отступ (для оформления переносов строк лучше использовать <br />);
- h1, h2, h3, h4, h5, h6 всегда отличаются друг от друга размером шрифта (выше уровень – больше шрифт) и прочим форматированием;
- a (ссылка) всегда заметно выделяется из прочего текста форматированием (обычно – подчеркнута);
- img, который обрамлен ссылкой не должен иметь границ;
- table имеет стандартный для данного сайта дизайн;
- th отличается от td своим внешним видом.
2. Глобальные CSS-ресеты (CSS resets) должны задавать внешний вид основных тегов по умолчанию.
К основным тегам по умолчанию я обычно причисляю следующие
- Теги форматирования текста: a, h1..h6, p, address, img
- Теги форм: input (советую использовать классы text, checkbox и другие для большего удобства), button, textarea, select
- Таблицы: table, tr, td и др.
Наличие CSS-резетов позволит упростить процесс разработки и избежать использования “лишних” классов в коде
3. CSS-ресеты вида * {…} категорически запрещены
Сбрасывать у элементов padding или margin, выставлять абсолютно всему, что есть на странице, какой-то конкретный шрифт или цвет нельзя: рано или поздно вы … запутаетесь. Поверьте на слово ;)
4. Использование !important крайне не рекомендуется
Параметр !important очень удобен, однако он разрушает логику верстки и сбивает с толку как вас, так и браузер. Задав свойство с помощью !important вы сможете перегрузить (заменить его) в другом классе только с помощью очередного !important
5. Тег body должен иметь цвет фона
Думаете, бред? По умолчанию документ имеет белый фон, однако никто не мешает пользователю поменять его в настройках браузера. Получается, что если вы верстаете белый сайт и не указываете цвет фона, то в 0,1% случаев сайт будет иметь серый или голубоватый фон (спасибо цветовым схемам винды ;) ).
6. Размер шрифта можно задавать в % или в em, использование px крайне не рекомендуется
Пользователь может иметь свои настройки шрифтов. По умолчанию размер шрифта составляет 16 пикс, однако никто не мешает юзеру поставить собственные настройки (например, увеличить стандартные размеры), если он плохо видит. Я использую в верстке em, однако перед тем как приступать к работе, я задаю в body размер шрифта “по умолчанию”. Обычно он равен 75% (12 пикс). Далее я отталкиваюсь от этого размера, а em использую в качестве множителя.
Старые браузеры вроде IE6 умеют увеличивать масштаб страницы меняя размеры самого шрифта, если он указан в em, однако размеры, указанные в px изменяться им не могут. Следовательно, вы отбираете у пользователя часть важного для него функционала.
7. “Кликабельный” элемент должен являться либо кнопкой, либо ссылкой
Думаю, в случае с обычными ссылками и с кнопками вроде “Отправить” или “Очистить” все понятно. Но что делать с разными “вебдванольностями” вроде аяксовых ссылок “ответить” (чуть ниже выдвигается форма ответа), “выбрать город” (раскрывается список городов и т.д.)? В этом случае логично использовать ссылки: по ссылкам можно двигаться Tab-ом, по наведению на ссылку появляется “палец” (нет необходимости ставить его в CSS) и действие по клику можно продублировать в href для тех, у кого JavaScript отключен.
8. В том случае, если ссылка обрабатывается JavaScript-ом, в параметре href не должны содержаться вызовы функций
Параметр href выполняет не только служебные функции. В большинстве браузеров содержимое href-а показывается в статусбаре при наведении на ссылку. Таким образом, пользователь увидит вызов яваскриптовой функции.
Однако это не единственный недостаток: любую ссылку можно открыть в новом окне правой кнопкой мыши. Открыв новое окно из “неправильной ссылки” мы увидим JavaScript-код в строке адреса. Никакое действие выполнено не будет.
Суммируя два предыдущий пункта мы несколько вариантов решения проблемы. Вот первый (неверный) вариант:
Этот вариант немного лучше:
А вот этот наиболее близок к идеалу:
9. Тег img может использоваться только в том случае, если изображение несет смысловую нагрузку
Дело не столько в том, что пользователь должен копировать только нужные ему изображения, а в том, что тег img, использованный для вставки сепаратора/фона/украшательства не имеет смысла и лишний раз путает разработчика. Гораздо удобнее пользоваться параметром background.
10. В обработке изображений основное внимание уделяется качеству картинки, а не ее размеру. В случае монотонных изображений лучше использовать формат PNG8 нежели GIF.
Формат PNG8 чуть более качественный, правда, отображаются PNG в IE неверно, но эта проблема решаема ;)
11. Использование CSS-спрайтов крайне желательно
О CSS-спрайтах, наверное, ходят легенды. Вкратце – это технология размещения нескольких изображений в одном файле. Использование спрайтов позволяет существенно сократить время загрузки изображений и число обращений к серверу. Следовательно, сократится и общее время загрузки страницы.
12. Нельзя использовать элементы для создания отступов между блоками на сайте
Если есть такие отличные вещи, как margin и padding, то зачем нарушать семантику кода и добавлять лишние элементы? Правильно, незачем
Стоит однако отметить, что в том случае, если принадлежность к DOCTYPE не указана, браузеры будут обсчитывать padding и margin по-разному и без разного рода “распорок”, увы, не обойтись
13. Теги nobr, noframes, noscript противопоказаны
А и правда, зачем они? Без них тоже можно писать правильный код ;)
14. Использование таблиц для разметки крайне нежелательно
15. Таблица не может содержать пустых ячеек
Некоторые браузеры не рисуют границу или фон у той ячейки, в которой нет контента. Добавление неразрывного пробела ( ) как правило решает эту проблему.
Комментарии (9)
grinka
В первом пункте в описании поведения “p”, <br> лучше б заэскейпать :)
grinka
В восьмом пункте, в описании “правильного” примера идёт обращение по document.getElementById, а “id” у линка не назначен…
Григорий
Интересная статья, хорошо написано.
Хочется отметить пункт 3 “CSS-ресеты вида * {…} категорически запрещены” и рассказать о своих методах работы.
Я использую селектор * для упрощения работы. На мой взгляд очень удобно, когда для всех элементов установлены общие свойства (например margin, padding и др.). Это часто экономит время. Если нужно изменить свойство в любом нижестоящем селекторе, его можно смело изменять новым селектором т. к. по правилам css элемент принимает значение того свойства, которое было описано последним.
Например, в представленном примере:
* {
color: #333;
}
.text {
color: red;
}
Это наш текст.
Слова “Это … текс” будут отображаться темно серым цветом, а слово “наш” красным, несмотря на то, что для всех селекторов (*) установлен темно-серый цвет. В данном примере хорошо видно порядок написания свойств и принимаемых значений.
Так же хочется обратить внимание на еще один пример, что бы продемонстрировать данное правило css.
.text {
color: #333;
}
.text {
color: red;
}
Это наш текст.
В данном случае элемент class принимает значения того свойства, которое было описано последним. Т. е. слово “наш” становится красным. И это правильный css, с точки зрения официальной документации. :)
О том, как можно запутаться, используя селектор *, я даже представить не могу. Удобно, именно для этого он и был создан.
Григорий
Так, через форму не прошли теги.
Еще раз примеры с тегами в круглых скобках:
Пример №1
* {
color: #333;
}
.text {
color: red;
}
Это (span class=”text”)наш(/span) текст.
Пример №2
.text {
color: #333;
}
.text {
color: red;
}
(span class=”text”)Это наш текст.(/span)
admin
Отчасти, быть может, и верно. Проблема заключается в том, что * {margin: 0; padding:0;} нарушает понятность и семантику кода, убирает отступы там, где делать этого совершенно не нужно. Сбросить, а потом выставить отступы там, где надо неверно. А метод ваш интересный, возьму на заметку ;)
admin
И это исправил ;)
admin
Спасибо
Григорий
“Не верно” по каким правилам? :) Я кстати специально сделал упор на то, что по правилам css элемент принимает то значение, которое было указано последним, по этому, если для * стоит {margin: 0px; padding 0px; border: 0px}, а для img, котороый следует за *, установлено img {margin: 1px; padding: 1px; border: 1px dashed #ccc;}, то у картинку будет рамка в 1px , отступы и паддинг.
Я вот использую и нарадоваться не могу. :) Работать это будет во всех браузерах. И валидацию пройдет!
Григорий
Эх, и понапишут же, а остальные потом читают и других этому же учат. :) Шучу-шучу, статья-то по остальным пунктам дельная.