Мастер-классы по Javascript Екатеринбург Ростов-на-Дону Москва Узнать больше...
Содержание (скрыть) Содержание (показать)

Выделение кнопки при заходе и клике

Создайте кнопку, которая выделяется при проходе курсора мыши над ней и при клике.

Кликните на демке ниже, чтобы увидеть, о чем речь:

Исходные изображения находятся на tutorial/browser/events/rollover-src/index.html.

В коде документа также есть функции для добавления/удаления класса. Используйте семантическую разметку.

Сделайте два варианта решения: одно пусть использует CSS-селекторы :hover и :active, другое — JavaScript-события вместо них.

Используйте CSS-спрайты.

Решение, шаг 1
Решение
Решение, шаг 1

Для HTML можно использовать элементы INPUT, BUTTON, либо просто DIV. На последнем и остановимся:

<div class="button"></div>

Для отслеживания действий посетителя в случае с JavaScript — нужны события mouseover, mouseout, которые будут отслеживать состояние «курсор над кнопкой» (hover), а также mousedown и mouseup для состояния «кнопка нажата».

Для CSS нужны псевдо-селекторы :hover и :active. К сожалению, в IE<8 :active поддерживается слабо.

Решение, шаг 2
Решение, шаг 2

Первым будем делать вариант с JavaScript.

Кнопку можно оформить как DIV, со стилизацией состояния через CSS:

.button {
  width: 186px;
  height: 52px;    
  background: url(button_static.png);    
}
  
.button-hover {
  background: url(button_hover.png);    
}
    
.button-click {
  background: url(button_click.png);    
}

Изначально кнопка имеет класс .button, затем при проведении мышью над ней добавляется класс .button-hover, а при клике вместо него добавляется .button-click. То есть, кнопка будет иметь одно из трех сочетаний классов: .button, .button .button-hover, .button .button-click.

При этом так как классы состояний находятся под .button, то их background будет перекрывать свойство background у .button.

Код обработки событий:

button.onmouseover = function() {
  addClass(this, 'button-hover');
}

button.onmouseout = function() {
  removeClass(this, 'button-hover');
}

button.onmousedown = function() {
  addClass(this, 'button-click');  
}

button.onmouseup = function() {
  removeClass(this, 'button-click');
}

Полное решение: tutorial/browser/events/rollover/index.html.

CSS-спрайты

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

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

Чтобы обойти эту проблему, все состояния кнопки объединяют в один CSS-спрайт:

Это изображение ставится в background. Оно ровно в три раза выше, чем обычная высота кнопки, поэтому будет видна только часть — текущее состояние. Изменение состояние реализуется через сдвиг фона при помощи background-position:

.button {
  width: 186px;
  height: 52px;
  background: url(button.png) no-repeat;
}  
  
.button-hover { background-position: 0 -52px; }
    
.button-click { background-position: 0 -104px; }
Полный пример: tutorial/browser/events/rollover-sprite/index.html.

CSS-решение

Решение при помощи CSS находится здесь: tutorial/browser/events/rollover-css/index.html.

В IE6 состояние :hover поддерживается только для элементов A, поэтому кнопку нужно сделать этим элементом.

Такое решение некорректно работает в IE<8, так как старые IE плохо поддерживают псевдоселектор :active.

#172
Наверх

Реклама

Нашли опечатку?

Нашли опечатку на сайте? Что-то кажется странным?
Выделите соответствующий текст и нажмите Ctrl+Enter!

Последние Комментарии

Помоги другим!

Помоги другим узнать о хорошей статье!