/* 01.06.2005 */
CSS rollover
Перевод: Цыгырлаш Игорь (01.06.2005)
Rollover-эффекты обычно предполагают использование 2, 3 и более изображений (и зачастую эти изображения загружаются заранее для достижения лучших результатов). Для каждого из состояний Rollover-эффекта (normal, hover, active, visited, ...) имеется по одному отдельному изображению. Суть же метода, описываемого в данной статье, в размещениеи всех изображений для всех состояний в одной картинке, что делает динамическую смену изображения быстрее и не требует предварительной загрузки.
Начнем с рассмотрения простого меню:
Пример 1:
Элементы меню это ссылки заданные тэгом A с CSS-стилем display:block. F А собственно для получения Rollover-эффекта задаются стили фонового изображения для селекторов a, a:hover и a:active. Так же для упрощения реализации Rollover-эффекта используется только одно изображение содержащее все состояния - normal, :hover, and :active.
![]()
Рис. 1: Одна цельная картинка объединяющая три состояния
Обычно, CSS rollover эффекты используют фоновые изображения следующим образом:
#menu a {
background: url("button.gif") top left no-repeat;
}
#menu a:hover {
background-image: url("button-over.gif");
}
#menu a:active {
background-image: url("button-active.gif");
}
Где каждому состоянию соответствует отдельный файл картинки.
Использование же одной общей картинки делает ненужным смену фонового изображения. Мы просто должны изменить свойство background-position смещая фоновое изобращение. Нормальное состояние использует не сдвинутое фоновое изображение. Состояние :hover использует фоновое изображение сдвинутое на определенное число пикселей (в нашем примере сдвиг 157px влево), состояние :active использует большее смещение (314px в примере).
#menu a {
background: url("button.gif") 0 0 no-repeat;
...
}
#menu a:hover {
background-position: -157px 0;
...
}
#menu a:active {
background-position: -314px 0;
...
}
Вот и все. Только одна картинка. Нет необходимости в предварительной загрузке. Состояния меняются максимально быстро (смещение фонового изображения происходим на много быстрее чем замена фонового рисунка). AFAIK, это способ работает во всех CSS-2 совместимых браузерах (IE5+, Mozilla, Opera, Safari, ...).
Полный исходный код примера 1 представлен ниже:
<style type="text/css">
#menu a {
display:block;
width:120px;
background: url("button.gif") 0 0 no-repeat;
margin: 1em 0;
padding:7px 0 10px 20px;
font: bold 14px/1 sans-serif;
color:#c60;
text-decoration: none;
}
#menu a:hover {
background-position: -157px 0;
color: #E9BE75;
}
#menu a:active {
background-position: -314px 0;
color:white;
}
</style>
<div id="menu">
<a href="">Menu item 1</a>
<a href="">Item no. 2</a>
<a href="">Another (3)</a>
<a href="">Menu item 4</a>
<a href="">One more (5)</a>
</div>
Дополнение
Было замечено печальное поведение IE под Windows. Иногда происходит мерцание элемента при наведенной на него мыши из-за медленной загрузки фонового изображения (я такого эффекта не наблюдал - прим. переводчика).
Решение данной проблемы довольно простое: фоновое изображение (смещаемое к "hover" позиции) привязывается к внешнему элементу, и тоже изображение используется и для вложенного элемента A (тэг A)(как есть без смещения). При этом :hover состояние должно просто менять фон тэга A на прозрачный, тем самым "освобождая" фон внешнего элемента. Таким образом, изображение сменяется, а у IE нет повода мерцать.
Просмотрите исходный код "Примера 2" чтобы увидеть детали реализации. Данный способ работает во всех встречаемых мною браузерах за исключением MacIE.
Пример 2:
Полная картинка:
Исходный код:
<style type="text/css">
#menu2 {
height: 25px;
margin: 3em 0; padding:0 1em;
border-bottom: 1px solid black;
}
div.outer {
float: left;
width: 120px; height: 25px;
margin: 0 3px 0 0;
background: url( 'bars.gif' ) 0 -50px no-repeat;
}
div.outer a {
display: block;
margin: 0; padding:0;
width:100%; height:100%;
overflow:hidden;
font: bold 13px/1 Georgia, serif;
color:#039;
text-decoration: none;
background: url( 'bars.gif' ) top left no-repeat;
}
div.outer span {
display: block;
margin:0; padding: 7px 0 0 13px;
}
div.outer a:hover {
background-image: none;
color: yellow;
}
div.outer a:active {
color: black;
}
</style>
<div id="menu2">
<div class="outer"><a href="#"><span>First</span></a></div>
<div class="outer"><a href="#"><span>Second</span></a></div>
<div class="outer"><a href="#"><span>Third</span></a></div>
</div>