Войти | Выйти

Стилизация ребенка ссылки при :hover

Хочу описать решение с пылу с жару.

Есть структура:

<a class="b-link" href="" >
    Телефон в копилке
    <img class="b-img" src="image.png" alt=""/>
</a>

Есть стили к ней:

.b-img {
    display: none
}

.b-link:hover .b-img {
    display: inline
}

Известно, что второй селектор в ИЕ6 не отработает.

Как мы с этим боролись?

На ссылку вешали одноразовый expression и расширяли селектор:

* html .b-link {
    zoom: expression(
        runtimeStyle.zoom = 1,
        onmouseover = function() { className += " b-link-hover" },
        onmouseout = function() { className = className.replace(/ b-link-hover/, "") }
    );
}

.b-link-hover .b-img,
.b-link:hover .b-img {
    display: inline
}

Это было старое решение.

Элегантное решение

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

.b-link:hover{
    word-spacing: 0
}

Суть проста – этот селектор перезапускает Reflow, после чего ИЕ6 начинает применять селекторы для элементов в ссылках .b-link:hover .b-img {}
Приятно, что это решение работает несмотря на то, включен ли у ссылки hasLayout или нет. И не пугайтесь, это не обнуление пространства между словами, а дефолтное значение браузера.

Слова благодарности

Спасибо Роме Комарову за статью, к которой я сегодня очередной раз вернулся. Благодаря этой статье я понял, что можно не писать expression, если написать что-то из нижеследующего

.b-link:hover{background: #rgb}
.b-link:hover{background: url(transparent.gif)}
.b-link:hover{background: url(about:blank)}

Эксперимент показал, что свойство background-image не заставляет ИЕ6 перерисовать DOM. Этот селектор проблему не решает

.b-link:hover{background-image: url(about:blank)}

Но моя проблема была в том, что у элемента .b-link уже был фоновый цвет и сбрасывать его селекторами Ромы мне нельзя, потому что «дизайн».

.b-link{background: #feb247}

Первое, что пришло в голову – продублировать фоновый цвет. Оказалось, что ИЕ написан хорошо :) Он не перезапускает reflow, так как значение #rrggbb не изменилось:

.b-link{background: #feb247}
.b-link:hover{background: #feb247}

Второе, что мне пришло в голову — изменить последний символ в #rrggbb на «один вниз» — было 7, стало 6. И, да, заработало. При этом мой глаз не смог различить подмену цвета:

.b-link{background: #feb247}
.b-link:hover{background: #feb246}

Я позвал верстальщиков нашей Службы HTML-верстки и поделился тем, что решение Ромы рабочее и что у него есть такой нюанс с изменением rgb.

Виталя неделю назад обнаружил, что если просто экспрешином добавлять или удалять класс у ссылки (и больше ничего не делать), то нужный селектор тоже отрабатывает, потому что перезапускается reflow. Возможно есть еще какое-то свойство, которое сделает это и при этом не повлияет на часто используемые свойства. Надо поискать. Виталя, спасибо тебе за мысль :)

Я поискал 5 минут и был найден word-spacing.
Итого, стили выглядят так:

.b-img {
    display: none
}

.b-link:hover {
    word-spacing: 0
}

.b-link:hover .b-img {
    display: inline
}

Пользуйтесь на здоровье :)

Комментарии

5 комментариев к “Стилизация ребенка ссылки при :hover”

  1. kizu 18.Июн.2009 в 13:10

    О, то, что word-spacing вызывает рефлоу это очень клёво, спасибо и тебе :)

    ОтветитьReply to this comment
  2. Александр 22.Июн.2009 в 16:25

    Спасибо, полезно. Возьму на вооружение.

    ОтветитьReply to this comment
  3. шкутер 25.Июн.2009 в 09:56

    это просто праздник какой-то!

    ОтветитьReply to this comment
  4. lilumi 26.Июн.2009 в 15:44

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

    ОтветитьReply to this comment
  5. mihdan 20.Авг.2009 в 08:55

    Элегантное и простое решение застарелой проблемы. Премного благодарен. Спасибо

    ОтветитьReply to this comment

Написать комментарий.




XHTML: Можете использовать следующий код: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Spam Protection by WP-SpamFree Plugin

Subscribe without commenting