В сегодняшнем уроке мы создадим целую страницу меню =), которое имеет две интересные особенности: при наведении на
пункты меню мы будем излагать пункты меню, который адаптируется к ширине текущего монитора, и мы будет делать описание с в левой части страницы, идущие к данному пункту меню.
Мы будем использовать JQuery для эффекта, а некоторые CSS3 свойства стиля нам помогут. Мы не собираемся использовать какие-либо изображения.
Пример работы вы можете посмотреть здесь, а исходники скачать здесь.
HTML структура будет состоять из неупорядоченных списков, что отражает наше меню и Div для описания элементов:
<div id="slidingMenuDesc" class="slidingMenuDesc">
<div><span>Description for "About"</span></div>
...
</div>
<ul id="slidingMenu" class="slidingMenu">
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Portfolio</a></li>
<li><a href="#">Work</a></li>
<li><a href="#">Contact</a></li>
<li><a href="#">Get a quote</a></li>
</ul>
Во-первых, мы будем писать стили меню и его элементов навигации и тогда мы будем писать стили элементов описания. Давайте сбросим несколько стилей:
body, ul, li, h1, h2, span
{
margin:0;
padding:0;
}
ul
{
list-style:none;
}
Фон будет темно-серый:
body
{
background:#292929;
}
Список пунктов меню будет абсолютно позиционироваться в правой части экрана:
.slidingMenu
{
position: absolute;
height:410px;
width: 410px;
top:40px;
overflow:hidden;
right:1px;
font-family: Arial, Helvetica, sans-serif;
}
Пункты меню float right то есть обтекать в право:
.slidingMenu li
{
display:block;
float:right;
clear:both;
position:relative;
overflow:hidden;
}
Элементы описания будут позиционироваться абсолютно, и мы зададим его динамически:
.slidingMenu li.move {
width: 9px;
height: 68px;
right:0px;
padding-right:10px;
margin-top:2px;
z-index: 8;
position: absolute;
background: #2183c4;
background:
-webkit-gradient(
linear,
left top,
left bottom,
from(#0771b8),
to(#2183c4)
);
background:
-moz-linear-gradient(
top,
#0771b8,
#2183c4
);
-moz-border-radius: 8px 0px 0px 8px;
-webkit-border-top-left-radius: 8px;
-webkit-border-bottom-left-radius: 8px;
border-top-left-radius: 8px;
border-bottom-left-radius: 8px;
-moz-box-shadow:1px 1px 5px #000;
-webkit-box-shadow:1px 1px 5px #000;
box-shadow:1px 1px 5px #000;
}
Мы будем делять этот движущийся элемент при наведении очень легко градиент фона и некоторые тени решат проблему.
Стиль для ссылки элемент будет выглядить следующим образом:
.slidingMenu li a
{
font-size:66px;
text-transform:uppercase;
text-decoration: none;
color: #ddd;
outline: none;
text-indent:5px;
z-index: 10;
display: block;
float: right;
height: 66px;
line-height: 66px;
position: relative;
overflow: hidden;
padding-right:10px;
}
Описания будет относительно расположению контейнера.
/* Описания */
.slidingMenuDesc
{
margin-top:40px;
position:relative;
}
Div с описанием внутри будет иметь тот же фон градиентом.
Округлые границы будут на противоположных углах:
.slidingMenuDesc div
{
background: #2183c4;
background:
-webkit-gradient(
linear,
left top,
left bottom,
from(#0771b8),
to(#2183c4)
);
background:
-moz-linear-gradient(
top,
#0771b8,
#2183c4
);
height: 68px;
padding-right:5px;
left:-5px;
width:0px;
margin-top:2px;
overflow:hidden;
position:absolute;
-moz-box-shadow:1px 1px 5px #000;
-webkit-box-shadow:1px 1px 5px #000;
box-shadow:1px 1px 5px #000;
-moz-border-radius: 0px 8px 8px 0px;
-webkit-border-top-right-radius: 8px;
-webkit-border-bottom-right-radius: 8px;
border-top-right-radius: 8px;
border-bottom-right-radius: 8px;
}
Мы должны установить эти элементы абсолютными, поскольку мы будем регулировать сверху по текущему элементу списка.
Описание службы будет абсолютно позиционированым, а также. Это не обязательно, но это дает больше вариантов, если вы хотели бы применить другие эффекты анимации:
.slidingMenuDesc div span
{
font-size:36px;
color: #f0f0f0;
text-indent:5px;
z-index: 10;
display: block;
height: 66px;
line-height: 66px;
position:absolute;
right:10px;
margin-left:5px;
top:-3px;
}
А теперь, давайте взглянем на JavaScript!
Во-первых, мы добавим следующие сценарии в наш головной HTML:
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js">
</script>
<script src="cufon-yui.js" type="text/javascript"></script>
<script src="BabelSans_500.font.js" type="text/javascript"></script>
<script src="jquery.easing.1.3.js" type="text/javascript"></script>
И мы будем реализовывать следующий сценарий:
$(function() {
Cufon.replace('a, span').CSS.ready(function() {
var $menu = $("#slidingMenu");
/ **
* Первый пункт в меню,
*, Который установлен по умолчанию
* /
var $selected = $menu.find('li:first');
/ **
* Это абсолютный элемент,
*, Которая будет перемещаться по пунктам меню
* Это ширина выбранного элемента
* И верхней расстояние от пункта к началу страницы
* /
var $moving = $('<li />',{
className: 'move',
top: $selected[0].offsetTop + 'px',
width: $selected[0].offsetWidth + 'px'
});
/ **
* Каждой раздвижной div (описания) будет иметь туже высоту
* На соответствующий пункт в меню
* /
$('#slidingMenuDesc > div').each(function(i){
var $this = $(this);
$this.css('top',$menu.find('li:nth-child('+
parseInt(i+2)+')')[0].offsetTop + 'px');
});
/ **
* Добавить абсолютную div до меню;
* Когда мы убираем мыш от меню
* Абсолютное движения div-ов до верхней части
* (например, как на начальном этапе);
* При наведении на пункт меню, мы переместим
* его в своей позиции
* /
$menu.bind('mouseleave',function(){
moveTo($selected,400);
})
.append($moving)
.find('li')
.not('.move')
.bind('mouseenter',function(){
var $this = $(this);
var offsetLeft = $this.offset().left - 20;
//слайд в описании
$('#slidingMenuDesc > div:nth-child('+
parseInt($this.index()) +')').stop(true).
animate({'width':offsetLeft+'px'},
400, 'easeOutExpo');
//переместить абсолютный div до этого пункта
moveTo($this,400);
})
.bind('mouseleave',function(){
var $this = $(this);
var offsetLeft = $this.offset().left - 20;
//выскальзывание описание
$('#slidingMenuDesc > div:nth-child('+
parseInt($this.index()) +')').stop(true).
animate({'width':'0px'},400, 'easeOutExpo');
});;
/ **
* Движения абсолютного DIV-ва,
* С определенной скоростью,
* На должноное место $elem
* /
function moveTo($elem,speed){
$moving.stop(true).animate({
top : $elem[0].offsetTop + 'px',
width : $elem[0].offsetWidth + 'px'
}, speed, 'easeOutExpo');
}
}) ;
});
Мы выбираем первый пункт по умолчанию, который является нашим "Home".
Когда мы наведём курсор мыши на пункт меню мы будем двигать li.move в правильную позицию и выдвинем в соответствии с описанием пункта меню.
Мы надеемся, что вам понравилось и вы найдёте этот урок полезным!