Простейший скрипт для реализации hover-эффекта для любого элемента в Internet Explorer 6

Внимание: рекомендуется обновленная версия данной статьи.

Несмотря на то, что данное решение уже опубликовано в РУнете не мной, я просто не могу не написать о нем, т.к. решение, на мой взгляд, достойно внимания, и нужно его популяризовать посредством моего блога.

Я постоянно слежу за материалами по HTML и CSS верстке, но почему-то до недавнего времени мне нигде не попался простейший способ создания ховер-эффекта (:hover) в самом часто упоминаемом веб-разработчиками браузере IE6, который, как мы знаем, данный селектор поддерживает только для тега ссылки <a>.

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

До сей поры мне приходилось применять громоздкие скрипты, данный же скрипт состоит из всего лишь 6 строк:

<attach for=element event=onmouseover handler=topm>
<attach for=element event=onmouseout handler=verm>
<script>
	function topm(){element.className='hover';}
	function verm(){element.className='';}
</script>

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

Данный скрипт нужно сохранить в файл с любым названием, но обязательно с расширением .htc, например, ie6hover.htc.

Как пользоваться скриптом

Для начала его необходимо подключить к файлу стилей, например, так (если нужно предусмотреть возможность его применения к любому html-элементу):

* {behavior:url("ie6hover.htc")}

Либо, например, вот так (если хотим его применить только к конкретному элементу):

li {behavior:url("ie6hover.htc")}

А непосредственно реализация ховер-эффекта делается следующим образом. Например, если это меню с выпадающим списком:

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

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

Как видите, все максимально просто.

Комментарии (62)

  1. gordi
    6 января 2009 г. в 00:15

    Jman

    А на счёт поведения в точку…

    Ах, вот в чем причина Вашего на адекватного поведения, простите, ради бога, не знал :)

    Мне не нужен ни какой функционал

    Тогда в чем дело?

    Говорю вам спасибо за исправление.
    Надеюсь вы успокоитесь после этого? :(

  2. 6 января 2009 г. в 00:20

    да, меня зацепило то что “мне нужен какой-то функционал”.
    Надеюсь наш спор исчерпан?
    Если кого-то не устраивает моя манера общения, то я извиняюсь. gordi ;)

  3. 6 января 2009 г. в 00:24

    Ах, вот в чем причина Вашего на адекватного поведения, простите, ради бога, не знал :)

    Как раз на оборот, не причина а следствие.
    Но опять таки, я ни кому не грубил, и не оскорблял. Я всего лишь высказал сомнение в вашей компетенции.

  4. gordi
    6 января 2009 г. в 00:29

    gordi

    0_о , а где я выражался?

    Устал вас цитировать.
    Читайте внимательно не только себя любимого, ok :)

    …тогда почему вы захотели увидеть очевидное.

    То, что очевидно для меня или для вас, совсем не очевидно для большинства, примеры подтверждающие очевидное и невероятное, никогда не повредят, согласны?

    Закончим на мирной ноте, все уже сказанно :)

  5. 6 января 2009 г. в 00:35

    В моём понимании выражаться — ругаться матом .

    Читайте внимательно не только себя любимого, ok :)

    Я шизофренией не страдаю.

  6. 6 января 2009 г. в 00:38

    предлагаю перейти на ты, и пожать друг-другу руки.
    Хватит наверное уже нам флудить. Если вдруг захочется продолжить… icq 986785

  7. gordi
    6 января 2009 г. в 00:48

    Jman

    …в вашей компетенции

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

    Не хочу строить никаких догадок в отнешении вас, но еще раз перечитаейте комментарии и не только свои и многое поймете, если конечно сможете.

    С такой манерой общения лучше сами с собой перед зеркалом практикуйте :)

  8. 6 января 2009 г. в 01:22

    А Вы умеете говорить за себя. Может Вам хватит прикрываться автором блога.
    То что он поставил на Вас прямую ссылку, для меня ровным счётом ничего не значит.
    Вы для меня не несёте никакого авторитета. Так что Ваши заявления о том что Вы будете меня учить поведению css и html — пустые слова.
    Указывать на мою манеру поведения а тем более как мне практиковаться, вам никто права не давал. Не нравится не общайтесь.
    Вы слишком высокого о себе мнения и как личность и как профессионал.

    Свои догадки можете оставить при себе. Я сказал своё последнее слово. И считаю что дальнейший разговор — бессмысленный. Флудите дальше.

  9. gordi
    6 января 2009 г. в 01:29

    Jman

    Я сказал своё последнее слово.

    Ну на конец-то :)
    Маленький ребенок обиделся и пошел плакать :)
    Стало легче дышать:)

  10. 6 января 2009 г. в 12:33

    Jman,

    Всё таки я немогу понять почему я должен доказывать очивидное. Давайте сделаем на оборот.
    Dimox, если не трудно подключи к своему блогу этот скрипт, так как написано в статье

    * {behavior:url("ie6hover.htc")}

    и посмотри что будет в IE6 и IE7.

    Я бы сам никогда не стал пользоваться конструкцией, которая захватывает сразу все теги. Я бы даже запись вида li {behavior:url("ie6hover.htc")} сделал еще более уточняющей, т.е. вот так:

    #nav li {behavior:url("ie6hover.htc")}
    

    А в статье я просто примеры привел. Но теперь понимаю, что обязательно нужны уточнения на счет затирания стилей. В общем, внесу в статью необходимые правки, народ же не знает =)

    Еще раз спасибо за дополнение!

    P.S. Ничего себе баталии развели, на моем блоге такое впервые =) Зря вы так поцапались…

  11. 6 января 2009 г. в 15:14

    Тролли :).

    Кстати в статье можно описать все три решения.
    1 Решение для определенного селектора.
    2 Решение Павла через експрешн.
    3 Решение для всего документа. (автор не я, это всего лишь симбиоз из первого и второго).

    С наступающим :)

  12. 6 января 2009 г. в 15:26

    Jman, да, пожалуй, так и сделаю. А, возможно, опубликую это в виде новой статьи.

  13. gordi
    6 января 2009 г. в 15:34

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

  14. 6 января 2009 г. в 15:48

    Dimox, Ну тогда ждём новую статью, с удовольствием сделаю кросспост

  15. 6 января 2009 г. в 15:49

    Сергей, хорошо, и живые примеры для сравнения всех вариантов “нарисую” =)

  16. gordi
    6 января 2009 г. в 16:12

    Dimox, Ok
    Сам, когда начинал, долго ломал голову, что там имел ввиду тот или иной “гений”, ему-то и одного слова было достаточно, чтобы описать проблему и ее решение :)
    А нам смертным думать и думать :)
    Поэтому вспоминая прошлое, для своих читателей, всегда только с примерами, как говориться бери и пользуйся, все проверенно мин нет :)
    Настраивай, как надо, но вот этого делать ни в коем случае нельзя :)
    Ну ты понимаешь :)

  17. 12 января 2009 г. в 08:13

    Дам-с, как приходит время заниматься IE6, так и хочется переосмыслить все жизненные ценности. Проще всего, наверное, вывести сообщение, мол, обновитесь, и не морочить себе голову :)

  18. Denis
    30 января 2009 г. в 19:19

    Ребят, отметьте в статье, что не стоит цеплять htc’цешку на селектор *. Попробуйте взять очень большую страничку с плотной верстокой(сохраните на винт, например, страницу хабра с большим количестов комментов) и добавьте в стили: “* { behavior:url(“какой нибудь.htc”); }”
    Посмотрите что станет с ишаком. На каждый встреченный html-элемент (даже
    будет запрашиваться и выполняться скрипт.
    Такие вещи (behavior и любые expression) всегда применяются точечно — если они нужены где-то, то надо создать класс и только на него и вешать.
    Удачи.

  19. Филипп
    21 апреля 2009 г. в 14:01

    Такие вещи (behavior и любые expression) всегда применяются точечно — если они нужены где-то, то надо создать класс и только на него и вешать.

    Вот за это – огромное спасибо!

  20. Sync
    10 августа 2009 г. в 23:41

    Мда, прочитал все коментарии поста и был очень удивлен тому что Jman говорил о реальных вещах которые и доказательств то не требуют, а ему както сразу и неповерили. Если вы только верстаете и не будете делать функционал то не спешите цеплять на все елементы id, лучше сделайте через class, а программер, если понадобится, сам потом прицепит нужный ему айдишник и по нем разрулит js.
    Вот решение которое я когдато применял:
    выносим в ie6.css

    #navigation li{
    behavior: expression(
    this.onmouseover = new Function("this.className += ' hover'"),
    this.onmouseout = new Function("this.className = this.className.replace(' hover','')"),
    this.style.behavior = null);
    }

    ну а в обычном все как и прежде

    #navigation li:hover,
    #navigation li.hover{
    background:#f00;
    }

    Но все же это нестоит применять. Так как експрешн будет тормозить работу браузера, заметно будет на больших страницах

Ваш комментарий

Жирный текст

Ссылка

Цитата

Внутристрочный код

CSS-код

HTML-код

JavaScript-код

PHP-код