Памятка по CSS

Памятка по CSS

Dave Shea

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

Если у вас есть что добавить к этому документу, оставьте свой комментарий здесь.

Данный документ переведен на французский, немецкий, испанский, итальянский, венгерский, финский, русский, японский и китайский языки.

Что-то не так? Проверьте код валидатором! 

При отладке своего кода вы сэкономите уйму времени и нервов, если в первую очередь проверите его валидатором. Чаще всего проблемы с компоновкой страницы вызваны неверным XHTML или CSS. 

Создавайте и тестируйте свой CSS-код сначала в современных "продвинутых" браузерах, и лишь затем - в остальных, но не наоборот 

Если вы тестируете сайт в некачественном браузере, ваш код начинает зависеть от неправильного отображения этим браузером. Когда настанет время проверить сайт в браузерах, верно поддерживающих стандарты, вы наверняка огорчитесь увиденным. Таким образом, начните с передовых браузеров, а потом добавляйте к коду трюки для менее удачных. Таким образом ваш код с самого начала будет соответствовать стандартам, и вам не придётся слишком много "колдовать" для поддержки других браузеров. Сегодня самыми передовыми браузерами являются Mozilla, Safari, или Opera. 

Удостоверьтесь, что желаемый эффект действительно существует. 

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

Применяя плавающие блоки, убедитесь в том, что они не мешают соседям 

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

Поля (margins) всегда "сворачиваются". Пользуйтесь вместо них отступами (padding) или границами 

Если у вас вдруг появляется пустое пространство там, где оно вам не нужно, или наоборот - нету свободного пространства там, где оно вам нужно, это скорей всего происходит из-за полей (margins), которые имеют привычку "сворачиваться". Andy Budd в своей статье описывает этот глюк и дает советы, как его избежать. 

Старайтесь не задавать элементу одновременно отступ/границу И фиксированную ширину 

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

Как избежать мелькания чистого HTML в IE 

Если вы используете внешнюю таблицу стилей, подключая ее с помощью директивы @import, то рано или поздно вы заметите, что IE успевает "сверкнуть" на экране неформатированным HTML прежде, чем применит к нему стили. Эту проблему можно решить следующим образом. 

Не используйте min-width в IE 

Он не поддерживает это свойство. Но он рассматривает width как min-width в некоторой степени, поэтому с помощью небольшого фильтра для IE, вы можете получить точно эффект min-width в IE. 

Если что-то не так, уменьшите ширину 

Иногда из-за погрешностей округления сложение вида 50% + 50% даёт в итоге что-нибудь типа 100.1%. Это приводит к тому, что заботливо созданная вами вёрстка "расползается" в некоторых браузерах. Лечится просто: уменьшайте ширину с 50% до 49% или даже 49,9%. 

IE показывает все не так, как надо? 

Возможно, вы напоролись на знаменитый "Peekaboo bug", особенно если баг проявляется при наведении курсора на ссылку. Смотрите решение в статье "Позиция - это наше всё!" 

Будьте осторожны, задавая стили для "якорей" 

Если в своем коде вы используете классические якоря (<a name="anchor">), то скоро заметите, что они тоже реагируют на псевдо-классы :hover и :active. Избежать этого можно, применив к якорям id, или же применяя для них слегка извращенный синтаксис типа :link:hover, :link:active 

Помните о порядке описания ссылок. 

Задавая псевдоклассы для ссылок, делайте это всегда вот в таком порядке: Link, Visited, Hover, Active (запомните этот порядок с помощью слов "LoVe/HAte"). Любые другие комбинации не работают так, как надо. Если требуется использовать также и псевдокласс :focus, то порядок описания будет таким: Link, Visited, Hover, Focus, Active (LVHFA для запоминания чего Мэтт Холи придумал фразу "Lord Vader's Handle Formerly Anakin") 

Помните о правиле "TRouBLEd" для границ. 

Значения для границ, полей (margins) и отступов (padding) сокращённо описываются в таком порядке: по часовой стрелке в направлении Top, Right, Bottom, Left (верхнее, правое, нижнее, левое). Таким образом, запись margin: 0 1px 3px 5px; означает, что верхней границы нет, левая равна пяти пикселям ну и так далее. 

Явно указывайте единицы измерения у ненулевых значений 

Спецификация CSS требует указывать единицы измерения для всех величин, связанных с размерами, отступами или шрифтами (единственное исключение - line-height, как это ни странно). Поведение отдельных браузеров в ситуациях, когда единицы измерения не указаны, может быть совершенно неожиданным. Что касается ноля, то ноль есть ноль независимо от того, измерять ли его пунктами, пикселями или чем-то ещё. Единицы измерения для него не нужны. Пример: padding: 0 2px 0 1em; 

Тестируйте различные размеры шрифта 

"Продвинутые" браузеры типа Mozilla и Opera позволяют менять размер шрифта вне зависимости от единиц, в которых он задан. У некоторых пользователей непременно шрифты будут настроены так, что их размер в браузере окажется меньше или больше вашего. Пытайтесь оптимизировать ваш код под максимально возможный диапазон размеров шрифта. 

Не забывайте о прописных и строчных буквах 

Некоторые броузеры строго относятся к регистру букв. Если вы назвали свой класс "homePage", старайтесь и в стилевых таблицах использовать в точности такое же имя, так как в строгих броузерах (таких как Mozilla) имя "homepage" не эквивалентно "homePage". 

Тестируйте, включив стили в код страницы; публикуйте в Сети, убрав стили во внешний файл. 

Работая со стилями, размещёнными в HTML-коде страницы, вы не столкнетесь с возможными ошибками при тестировании, связанными с кэшированием. Это особенно важно при работе с некоторыми браузерами на Mac-платформе. Но не забудьте перед переносом сайта в сеть вынести все стили во внешний файл и подключить его через @import или <link>. 

Работая над ошибками позиционирования, добавьте блокам чёткие границы 

Универсальное правило типа div {border: solid 1px #f00;} может сослужить огромную службу при поиске ошибок позиционирования. Но добавив границы для отдельных элементов, вы сможете точно определить места, где блоки налазят друг на друга или же где появляется лишнее пустое пространство, что не всегда легко обнаружить. 

Не используйте одинарных кавычек в описаниях путей для изображений 

Задавая путь к фоновому изображению, откажитесь от навязчивого желания заключить его в кавычки. В них нет необходимости, кроме того, IE5 для Mac на этих кавычках просто заклинит. 

Не подключайте пустые внешние файлы стилей в надежде заполнить их "когда-нибудь в будущем" 

IE5 для Mac заклинит на пустом файле, и время загрузки страницы возрастёт. Вместо этого поместите в файл хотя бы одно стилевое правило (или даже просто комментарий) - и MacIE снова вернется к жизни. 

Кроме того, есть некоторые аспекты теории, которые не относятся напрямую к функциональности вёрстки, но, тем не менее, их следует соблюдать при разработке:

Упорядочьте свой CSS файл 

Сопровождайте каждую группу стилевых правил своим комментарием, группируйте сходные по смыслу селекторы, определите для себя правила наименования селекторов и следуйте им неукоснительно, визуально "отбивайте" селекторы пробелом (рекомендуем использовать именно пробел, а не табуляцию - это условие кроссплатформенности) и соблюдайте порядок свойств. 

Именуйте классы и идентификаторы, исходя из их назначения, а не внешнего вида 

Создав класс .smallblue и решив впоследствии поменять в нём текст на большой и красный, вы тем самым перечеркнёте смысл его названия. Вместо этого используйте классы типов .copyright и .pullquote. (опираясь на функциональное назначение класса) 

Полагайтесь на CSS-фильтры лишь как на самое последнее средство 

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

Совмещайте селекторы 

Чем легче CSS-файл, тем меньше требуется времени на его загрузку. По возможности группируйте селекторы, полагайтесь на наследование свойств, и уменьшайте объем текста, используя короткую запись свойств. 

Применяя методы замены изображений, не забывайте о доступности 

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