Красивое меню на CSS

Добрый день!

Сегодня я хотел бы рассказать о том, как сделать красивое меню, как показано на картинке:

Приступим!

 

HTML РАЗМЕТКА

<!-- основной контейнер для меню и иконок -->
<div class="navbar-inner">

    <!-- разметка меню -->
    <ul class="nav">
        <li class="first">
            <a href="#">Главная</a>
            <div class="rightBorder"></div>
        </li>
        <li>
            <a href="#">Услуги</a>
            <div class="leftBorder"></div>
            <div class="rightBorder"></div>
        </li>
        <li class="active">
            <a href="#">О проекте</a>
            <div class="leftBorder"></div>
            <div class="rightBorder"></div>
        </li>
        <li>
            <a href="#">Об авторе</a>
            <div class="leftBorder"></div>
            <div class="rightBorder"></div>
        </li>
        <li>
            <a href="#">Контакты</a>
            <div class="leftBorder"></div>
            <div class="rightBorder"></div>
        </li>
        <li>
            <a href="#">Информация</a>
            <div class="leftBorder"></div>
            <div class="rightBorder"></div>
        </li>
    </ul>

    <!-- иконки соц-сетей -->
    <div class="soc-icons">
        <a href="#"><div class="soc-icon odnocl"></div></a>
        <a href="#"><div class="soc-icon vk"></div></a>
        <a href="#"><div class="soc-icon facebook"></div></a>
    </div>

</div>

Структура HTML весьма проста. У каждого пункта меню есть 2 боковых бордера, которые будут отображаться у активного элемента или при наведении на пункт меню. У первого элемента левого бордера нет!

В правой части меню выведем иконки социальных сетей.

 

CSS СТИЛИ

Для начала установим следующие стили:

* {
    padding: 0px;
    margin: 0px;
    font-family: 'Tahoma';
    text-decoration: none;
}
body {
    width: 1000px;
    margin: 0 auto;
}

/* стиль для основного контейнера меню */
.navbar-inner {
    position: relative;
    min-height: 42px;
    background-image: url('../img/nav_bg.png');
    background-repeat: repeat-x;
    border: 1px solid #d4d4d4;
    border-top: none;
    border-left: none;

    -webkit-border-bottom-right-radius: 5px;
    -webkit-border-bottom-left-radius: 5px;
    -moz-border-radius-bottomright: 5px;
    -moz-border-radius-bottomleft: 5px;
    border-bottom-right-radius: 5px;
    border-bottom-left-radius: 5px;

    text-transform: uppercase;
    font-size: 12px;
    font-weight: bold;
}

/* стили для пунктов меню */
.nav {
    float: left;
}
.nav > li {
    list-style: none;
    float: left;
    height: 42px;
    position: relative;
    border-right: 1px solid #c9c9c9;
}
.nav > li > a {
    padding: 14px 25px 14px;
    color: black;
    display: block;
}

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

Прописываем стиль для каждого элемента li и устанавливаем отступы для тега a.

В результате у нас получится следующее:

 

Теперь приступим к самому интересному! Заданию стиля для наведения на пункт меню и стиля активного пункта.

 

СТИЛИ АКТИВНОГО ПУНКТА МЕНЮ

.nav > .active > a,
.nav > .active > a:hover,
.nav > .active > a:focus,
.nav > li > a:hover {
    background-color: #cae285;
    background-image: -moz-linear-gradient(top, #cae285, #9fcb56);
    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#cae285), to(#9fcb56));
    background-image: -webkit-linear-gradient(top, #cae285, #9fcb56);
    background-image: -o-linear-gradient(top, #cae285, #9fcb56);
    background-image: linear-gradient(to bottom, #cae285, #9fcb56);

    border: 1px solid #9fcb56;
    border-left: none;
    border-right: none;
    border-color: #aec671 #9fbb62 #87ac4a;

    -moz-box-shadow: inset 0px 1px #d7e9a4;
    -webkit-box-shadow: inset  0px 1px #d7e9a4;
    box-shadow: inset 0px 1px #d7e9a4;

    /* т.к. при наведении появляется бордер сверху, то
    уменьшаем верхний падинг на 1px */
    padding: 13px 25px 14px;
}

Придаем активному пункту меню зеленый бэкграунд в виде градиента и задаем верхний и нижний бордер. При наведении появляется появляется бордер сверху, поэтому уменьшаем верхний падинг на 1px.

В результате получим следующий вариант:

Но у нас пока что нет боковых бордеров. Если их добавить обычным CSS стилем, то при переключении меню, пункты меню будут прыгать примерно на 1 пиксель. А это плохо. Поэтому воспользуемся нашими искусственными бордерами.

Пропишем для них стили:

/* стили для боковых бордеров */
.leftBorder, .rightBorder {
    display: none;
    position: absolute;
    width: 1px;
    height: 43px;
    background-color: #9fbb62;
    top: 0px;
    z-index: 1000;
}

.leftBorder {
    left: -1px;
}
.rightBorder {
    right: -1px;
}

/* при наведении на пункт и у активного
пункта показываем боковые бордеры */
.active .leftBorder,
.active .rightBorder,
.nav > li:hover > .leftBorder,
.nav > li:hover > .rightBorder {
    display: block;
}

Теперь наши бордеры будут прекрасно отображаться при наведении.

 

Остался последний момент. Необходимо дописать стиль для первого пункта меню. Ему мы дадим закругление снизу-слева и немного иначе обработаем бордеры:

/* стили для первого пункта меню */
.first, .first a {
    -webkit-border-bottom-left-radius: 5px; /* уголок снизу-слева */
    -moz-border-radius-bottomleft: 5px;
    border-bottom-left-radius: 5px;
}
.first a {
    border-left: 1px solid #d4d4d4;
}
.first.active, .first a:hover {
    border-left: 1px solid #9fbb62!important;
}
.first.active a:hover {
    border-left: 0px solid #9fbb62!important;
}

Теперь и первый пункт меню отображается корректно!

 

ИКОНКИ

Перед тем, как закончить, сделаем стили для наших иконок соц-сетей.

/* стили для соц-иконок */
.soc-icons {
    float: right;
    padding: 9px 7px 0 10px;
}
.soc-icon {
    float: right;
    margin-left: 4px;
    width: 24px;
    height: 24px;
    background-repeat: no-repeat;
}
.odnocl {
    background-image: url('../img/odnocl.png');
}
.vk {
    background-image: url('../img/vk.png');
}
.facebook {
    background-image: url('../img/facebook.png');
}

Тут все предельно просто.

 

ЗАКЛЮЧЕНИЕ

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

 

 

Автор статьи: Alex. Категория: CSS
Дата публикации: 08.03.2013