Скользящий эффект для меню при наведении, который более известен, как lavalamp эффект. Эффект реализован только на CSS с помощью transitions и селектора ~.

HTML

Для всех трех примеров html один и тот же, отличаются только классами: ph-line-nav, ph-dot-nav, ph-heart-nav:

<div class="nav ph-line-nav">
    <a href="#">Home</a>
    <a href="#">About</a>
    <a href="#">Gallery</a>
    <a href="#">Contact</a>
    <div class="effect"></div>
</div>


Одноуровневый селектор - символ тильда "~" - отбирает элементы, которые являются одноуровневыми элементами, содержащего их контейнера. Первый элемент должен следовать перед вторым и т.д. друг за другом и иметь одного родителя.
Ниже всех элементов <a>, вложен div.effect, таким образом, чтобы он имел такого же родителя, что и анкоры.

CSS

Начнем со стилей, которые характерны для всех трех примеров.

.nav {
    overflow: hidden;
    position: relative;
    width: 480px;
}
    .nav a {
        display: block;
        position: relative;
        float: left;
        padding: 1em 0 2em;
        width: 25%;
        text-decoration: none;
        color: #393939;
        transition: .7s;
    }
    .nav a:hover {
        color: #c6342e;
    }


Вся магия lavalamp заключена в этом участке кода:   

.effect {
    position: absolute;
    left: -12.5%;
    transition: 0.7s ease-in-out;
}
.nav a:nth-child(1):hover ~ .effect {
    left: 12.5%;
    /* середина первого <a> */
}
.nav a:nth-child(2):hover ~ .effect {
    left: 37.5%; 
    /* середина второго <a> */
}
.nav a:nth-child(3):hover ~ .effect {
    left: 62.5%;
    /* середина третьего <a> */
}
.nav a:nth-child(4):hover ~ .effect {
    left: 87.5%;
    /* середина четвертого <a> */
}


Когда курсор мыши перемещается по ссылкам, элемент div.effect плавно перемещается в середину ссылки, выбранной в данный конкретный момент.
Можете поэкспериментировать с transition-timing-function (тут cubic-bezier.com). Мы используем "ease-in-out" функцию.


Начнем с простейшего примера, первого, с плавающей линией. Тут мы определим основные размеры, цвета и положение этой линии:

.ph-line-nav .effect {
    width: 90px;
    height: 2px;
    bottom: 36px;
    background: #c6342e;
    box-shadow: 0 1px 0 white;
    margin-left:-45px;
}


В каждом случае мы будем устанавливать значение margin-left равное половине длины элемента, так чтобы он всегда был по центру ссылки над которой находится курсор:


Теперь рассмотрим эффект с точкой. Добавим горизонтальную линию высотой 1px к div.nav, используя псевдо-элемент :after. Также добавим маленькие точки, располагающиеся на линии, под каждым пунктом меню, тут мы тоже используем псевдо-элемент :after. Контейнер div.effect теперь у нас ввиде круга (другие свойства аналогичны предыдущему примеру):

.ph-dot-nav:after {
    content: "";
    display: block;
    position: absolute;
    width: 100%;
    height: 1px;
    background: #c6342e;
    bottom: 40px;
 }
.ph-dot-nav a:after {
    content: "";
    position: absolute;
    width: 4px;
    height: 4px;
    bottom: 38px;
    left: 50%;
    margin-left: -2px;
    background: #c6342e;
    border-radius: 100%;
 }
.ph-dot-nav .effect {
    width: 10px;
    height: 10px;
    bottom: 36px;
    margin-left: -5px;
    background: #c6342e;
    border-radius: 100%;
 }


Посмотрим на пример с пронзающим сердце стрелой. Сердце состоит из двух элементов, левая половинка :before, а правая реализована с помощью псевдо-элемента :after. У a:after есть свойство z-index со значением 1, что располагает половинку сердца над стрелкой.

.ph-heart-nav .effect,
.ph-heart-nav a:after,
.ph-heart-nav a:before{
    background: url('../images/heart.png') no-repeat;
}
.ph-heart-nav .effect {
    position: absolute;
    bottom: 26px;
    background-position: 0 0;
    height: 8px;
    width: 62px;
    margin-left:-31px;
}
.ph-heart-nav a:before, .ph-heart-nav a:after {
    content: "";
    display: block;
    position: absolute;
    left: 50%;
    bottom: 20px;
    background-position: -62px 0;
    height: 20px;
    width: 11px;
    margin-left: -11px;
}
.ph-heart-nav a:after {
    z-index: 1;
    background-position: -73px 0;
}

СКАЧАТЬСкачек: 1405
2,06 Kb
Кто скачал?

ДЕМОПосмотреть
пример
CSS3 + HTML5
  • Перевод: Игорь