Псевдоклассы #

Как вы думаете, сколько, помимо этих четырех, существует псевдоклассов? :first-child, last-child? Кто еще? Все? А на самом деле всего их 33.

Название и назначение псевдоклассов

:link — отвечает за стили непосещенной ссылки;
:hover — состояние объекта (не обязательно ссылки) при наведении на него мышкой;
:active — состояние активного объекта (например, для ссылки и зажатие ее мышкой);
:visited — состояние посещенной ссылки;
:focus — когда вы используете какой-то объект на страницы, то на нем устанавливается фокус (в случае и текстовым поле это постановка курсора в это поле);
:first-child — первый дочерний элемент текущего элемента;
:last-child — соответственно, последний дочерний элемент чего-то;
:only-child — применяет стиль к элементу, если он единственный дочерний элемент;
:nth-child() — какой-то по счету с начала дочерний элемент, например p:nth-child(4);
:nth-last-child() — аналогично, только отчет с конца; интересно, что в этом и предыдущем селекторах можно задавать не только конкретные цифры, но и счетность, к примеру вот так: ul li:nth-last-child(2n+1);
:lang() — если у элемента указан язык (с помощью атрибута lang, например lang="en"), то этот элемент можно выбрать так;
:root — дает указание применить стиль к корневому элементу (в html документе это тег );
:not() — дает ограничение на применение стилей по селектору (то есть селектор .red-block:not(div) применит указанный стиль ко всем элементам с классом .red-block, только есть этот элемент не div );
:empty — выбирает пустые элементы;
:first-of-type — применяет стиль к первому элементу этого типа, то есть если у вас есть два дива, стиль будет работать только для первого из них;
:last-of-type — аналогично предыдущему, только для последнего элемента;
:only-of-type — применяет стили к элементы, если он имеет уникальный тип внутри своего родителя;
:nth-of-type() — выбирает указанный по счету с начала элемент текущего типа;
:nth-last-of-type() — тоже самое, но отсчет с конца;
:target — например, если у вас адрес имеет вид index.html#anchor, то этот псевдо класс задаст правило для элемента с id="anchor";
:enabled — выбирает активные инпуты;
:disabled — а этот неактивные;
:checked — отмеченные чекбоксы и выбранные радиобаттоны;
:indeterminate — для радиобаттонов и чекбоксов опеределяет состояние, когда они «никакие», то есть ни выбраны, ни не выбраны (ужас как написал ;-)
:default — элемент по-умолчанию, например кнопка отправки формы;
:valid — стиль для правильного инпута (когда указана data type в HTML 5);
:invalid — когда, соответственно, инпут невалиден;
:in-range — когда значение инпута находиться в заданных границах (type="range", задан min и max, но это все только в HTML 5);
:out-of-range — когда не попадает в границы;
:required — все обязательные поля;
:optional — все необязательные;
:read-only — те элементы, которые доступны только для чтения;
:read-write — для чтения и записи.


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

Динамические колонки #

Существует два типа колонок, используемых на веб-сайтах: фиксированной ширины и тянущиеся в ширину в зависимости от размера экрана (их еще называют “резиновыми”).

Недостатком фиксированных колонок при их использовании в “резиновом” блоке является то, что может появляться лишнее незаполненное пространство (при определенной ширине блока), поскольку его ширина меньше ширины столбца:
Динамические колонки

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

Решение

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

Посмотреть пример

hover и IE6 #

Многие верстальщики сталкивались с необходимостью использования :hover в своих шаблонах. Практически всегда данный псевдокласс используется для ссылок (тег a), для которых :hover работает всегда и везде, но бывают ситуации, когда встает задача сделать подсветку для других элементов, например для div или td, и вот здесь появляется «подводный камень», известный нам как IE6. С данным браузером всегда было достаточно много проблем, но все они само собой имеют пути решения. В данном топике я приведу 3 способа реализации :hover для IE6

1) hover.htc



Как пользоваться скриптом
Для начала его необходимо подключить к файлу стилей, например, так (если нужно предусмотреть возможность его применения к любому html-элементу):
* {behavior:url("hover.htc")}

Либо, вот так (если хотим его применить только к конкретному элементу):
li {behavior:url("hover.htc")}

А непосредственно реализация ховер-эффекта делается следующим образом. Например, если это меню с выпадающим списком:
li:hover ul, /* для современных браузеров */
li.hover ul { /* для Internet Explorer 6 */
  display: block
}

Обратите внимание, что класс .hover — это то, что прописано в самом скрипте. По желанию, название этого класса можно заменить.

2) SuckerFish hover
sfHover = function() {
   var sfEls = document.getElementById("Id родительского элемента").getElementsByTagName("Имя тега для :hover");
   for (var i=0; i

Как пользоваться скриптом
Сначала нам нужно подключить его в шаблон либо просто вставив в его целиком

или же создать, допустим, файл hover.js и подключить его так

Так как данный скрипт не нужен никому, кроме тех посетителей, которые используют IE6 сделаем его подключение через условный комментарий

В css шаблона
li:hover ul, /* для современных браузеров */
li.sfhover ul { /* для Internet Explorer 6 */
  display: block
}

Обратите внимание, что класс .sfhover — это то, что прописано в самом скрипте. По желанию, название этого класса можно заменить.

3) Ну и само собой использование jQuery
Сначала нам нужно скачать саму библиотеку jQuery, затем подключить ее в шаблон
Подключение библиотеки через условный комментарий аналогичен сути предыдушего метода

После этого добавить инициализацию
$('#Тут id элемента с указанием тега, требующего :hover (например, #block div)  ').hover(function() {
  $(this).addClass('hover');
}, function() {
  $(this).removeClass('hover');
});

В итоге получается

В css шаблона
#block:hover div, /* для современных браузеров */
#block.hover div { /* для Internet Explorer 6 */
  display: block
}

Подводя итоги о работе данных способов можно сказать, что использование способа 3) не рационально без использования jquery на сайте вообще, так как подгружать ~55кб библиотеки jquery ради реализации работы :hover в IE6 не имеет смысла, когда есть два других значительно сжатых способа.
Способ 1) Самый минимальный в плане кода, а способ номер 2) имеет наивысшую совместимость со старыми версиями IE Начиная от 5.0, так же он валиден в плане css, так не требует использования behavior

display:inline-block #

Для наглядности, рассмотрим пример списка с закруглённым бекграундом.
display:inline-block

Создаём стандартный список

теперь пишем цсс стили для нашего списка
ul {
  list-style-type:none;
  font-size:0.75em;
}
ul li {
  line-height:1em;
  background:#36e428 url(../images/list-left.gif) 0 top no-repeat;
  padding:6px 0 8px 13px;
}
li a {
  text-decoration:none;
  color:#000;
  background:url(../images/list-right.gif) 100% top no-repeat;
}

Теперь немного объяснений. Если мы выполним, поставленную перед нами задачу, именно таким способом, то на выходе мы получим:
display:inline-block

что, мягко говоря, не то что нам нужно.

Человек знающий такое свойство блока как display:block предложит решить эту проблему методом добавления тегу а свойств блока и перенесением на него нужных падингов т.е. наш цсс будеть иметь вид:
ul li {
  line-height:1em;
  background:#36e428 url(../images/list-left.gif) 0 top no-repeat;
}
li a {
  text-decoration:none;
  color:#000;
  background:url(../images/list-right.gif) 100% top no-repeat;\
  display:block;
  padding:6px 0 8px 13px;
}

но если мы взглянем на то что у нас получилось:
display:inline-block

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

А вот теперь и начинается самое интересное. Из выше приведённых примеров ясно, что нам не подходит не display:block не display:inline свойства элементов, значит будем использовать именно то, что и предназначено для таких случаев, а именно свойство display:inline-block. Для этого нам необходимо немного изменить наш хтмл-файл.

Как видете, мы взяли тег а в тег span для того, чтобы в последствии задать этим элементам, которые «по умолчанию» являются строчными элементами т.е. имеют свойство display:inline, нужное для нас display:inline-block.

Конечно же, мы можем и не дописывать тег span, а просто задать свойство инлайн-блок элементу списка li, но могут возникнуть ситуации, когда список находиться в более широкой колонке нежели он сам, в таком случае наши ссылки будут располагаться горизонтально, что естественно нас не устраивает.

Итак, наш цсс:
ul li {
  line-height:1em;
  padding-bottom:4px; /* отступ для элементов списка */
}
ul span {
  background:#36e428 url(images/list-left.gif) 0 top no-repeat;
  display:inline-block;
}
li a {
  color:#000;
  text-decoration:none;
  background:url(images/list-right.gif) 100% top no-repeat;
  display:inline-block;
  padding:6px 12px 8px 13px;
}


И если после этих манипуляций, мы взглянем на то что у нас получилось:
display:inline-block

Выводы: свойство display:inline-block позволяет нам использовать паддинги для изначально строчных элементов, а так же делать обтекаемыми блочные элементы.

@import и link в чем разница?! #

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

@import — Импорт позволяет импортировать одну таблицу стилей в другой. Он работает несколько иначе нежели «линк», так как вы можете импортировать таблицы стилей внутрь связанной через «линк» таблицы стилей. Но не желательно включать @import между и вашего HTML документа, например:

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

Зачем использовать @import?

Наиболее распространенная причина использования @import вместо (или вместе с) состоит в том, что старые браузеры не распознают @import, поэтому вы можете таким образом спрятать от них стили. В частности:

скрыть таблицу стилей от Netscape 4, IE 3 и 4 (но не 4.72):
@import url(../style.css);

скрыть таблицу стилей от Netscape 4, IE 3 и 4 (но не 4.72), Konqueror 2 и Amaya 5.1:
@import url("../style.css");

скрыть таблицу стилей от Netscape 4, IE 6 и ниже:
@import url(../style.css) screen;

скрыть таблицу стилей от Netscape 4, IE 4 и ниже, Konqueror 2:
@import "../styles.css";

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

Зачем использовать ?

Одной из наиболее весомых причин в пользу использования связанных через таблиц стилей является возможность использования альтернативных стилей для ваших клиентов. Такие браузеры как Firefox, Safari и Opera поддерживают атрибут rel="alternate stylesheet" и когда есть возможность позволяют пользователям переключаться между таблицами стилей. А для переключения между таблицами стилей в IE придется использовать javascript свитчер. Такой способ наиболее часто используется для подключения стилей для страниц в увеличенном формате. Как известно, IE не способен нормально увеличивать страницы, поэтому вы можете предложить альтернативный CSS.

Одним из недостатков использования @import является то, что если у вас есть очень простой только c правилом @import, ваши страницы могут отображаться некорректно, в основном в IE6 с так называемым эффектом FOUC. Простым фиксом этой проблемы является внедрение в , по крайней мере, одного дополнительного элемента или .

Media Type

Многие пишут о том, что можно использовать media type для сокрытия таблицы стилей от старых браузеров. Зачастую, этот довод приводится в пользу при сравнивании способов подключения таблиц стилей, но подвох заключается в том, что на самом деле можно использовать media type в обеих случаях, и браузеры, не поддерживающие media type не будут видеть таблицы стилей. Например, Netscape 4 не распознает media type, так что вы можете использовать как связанную через таблицу стилей, чтобы скрыть стиль от этого браузера, так и правило @import:


Но вот в некоторых версиях IE (6 и ниже) не поддерживается тип носителя при использовании правила @import, так что вы можете использовать это, чтобы скрыть таблицу стилей от них:


Итак, какой метод нужно использовать?

Лично я, как и автор статьи, предпочитаю использовать , а затем импортировать таблицы стилей в мой внешний файл стилей. Таким образом, я имею только 1 или 2 строки кода в своем html-документе. Но в общем, все зависит от вас. Если вас больше устраивает @import, то используйте его! Оба метода соответствуют стандартам и, если вы не планируете поддержку действительно старых браузеров (например, Netscape 4) не существует веского довода в пользу какого-либо метода.

CSS + PHP #

Style.php

Вместо привычного нам расширения .css, мы подключим к страничке файл .php

Тип документа

В самом начале файла style.php необходимо указать, что на выходе нам все-таки нужен файл стилей, т.е. указываем тип документа:
header("Content-type: text/css; charset: UTF-8");
?>

Вводим переменные

Теперь установим значения для нескольких переменных, например такие:
header("Content-type: text/css; charset: UTF-8");

$brandColor = "#990000";
$linkColor = "#555555";
$CDNURL = "http://cdn.blahblah.net"
?>

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

Достаточно просто вывести обозначенные переменные в необходимых местах стилей:
#header {
background: url("/images/header-bg.png") no-repeat;
}

a
color: ;
}
...
ul#main-nav li a {
color: ;
}

Другие идеи использования CSS файла сгенерированного с помощью PHP
Сжатие CSS файла с помощью PHP
Теоретически, вы даже можете использовать информацию о User-agent для вывода стилей под конкретный браузер.
В зависимости от сезона года, вы можете менять стили, используя информацию о текущей дате.
Генерировать различные цвета, устанавливать фон случайным образом, и в конце-концов, просто тестировать.

Не работает?

В некоторых случаях (например для реализации нашей идеи в Wordpress), вам возможно потребуется прописать следующие строчки в файле .htaccess (только для Apache):

SetHandler php5-script

При этом файл стилей оставляем с расширением .css, а .htaccess кладем в туже папку, где и стили.