Приветствую, дорогие друзья!
Хочу предложить Вашему вниманию ещё одно аккордеонное вертикальное меню с использованием JavaScript. В отличие от предыдущего меню в данном аккордеоне скрипт вынесен в отдельный файл и оформлен в виде класса, что делает его более универсальным и расширяемым, а также и позволяет разделить логику работы от представления. Кроме того, для более приятного визуального восприятие введена функция раздвигающегося слайдера (эффект движения).
HTML код может выглядеть примерно так:
JavaScript Accordion
-
ПУНКТ №1
-
ПУНКТ №2
-
ПУНКТ №3
-
ПУНКТ №4
Видно, что сам аккордеон представляет собой список ul с идентификатором асс, в элементах которого содержатся пункты меню (заголовки h3) и соответствующие этим пунктам контейнеры div с одержимым. В принципе содержимое может быть любым, но в нашем случае – это список соответствующих ссылок-подпунктов каждого из пунктов.
Скрипт, посредством которого организовано раздвижение аккордеона, представлен ниже и представляет собой класс my_accordion.slider и двумя вспомогательными функциями.
my_accordion=function(){ //Слайдер
function slider(n){
this.n=n; // имя переменной слайдера (Асс)
this.h=[]; // массив для элементов пунктов меню (для h3)
this.c=[] // массив для элементов содержимого пунктов меню (для div)
}
//добавляем к слайдеру функцию инициализации init
slider.prototype.init=function(t,o){
// идентификатор аккордеона
// номер открытого пункта при инициализации
i=x=0; // переменные для цикла и счётчика
w=[]; // массив для дочерних элементов
var a=_$(t); // находим элемент с id,указанном в t("acc") -в переменную a
n=a.childNodes; // находим у этого элемента все дочерние
l=n.length; // находим их количество
for(i;i0)&&(h!=d)){ // в противном случае: за исключением того, на котором событие
c.d=-1; // устанавливаем атрибут сворачивания
su(c) // идём на таймер
}
}
};
// таймер с идентификатором c.t,выполняющий функцию sl(c) каждые 10 мс.
function su(c){c.t=setInterval(function(){sl(c)},10)};
// функция частичного изменения высоты DIVа
function sl(c){
var h=c.offsetHeight; // текущая высота текущего div
d=(c.d==1)?c.m-h:h; // устанавливаем d в зависимости о того свёрнут div или нет
c.style.height=h+(Math.ceil(d/10)*c.d)+'px'; // частичное изменение высоты
if((c.d==1&&h>=c.m)||(c.d!=1&&h==1)){ // если высота изменена полностьтю, то
clearInterval(c.t) // очищаем таймер
}
};
return{slider:slider}
}();
Логика работы этого скрипта ясна из приведенных в нём комментариев. Для того чтобы использовать скрипт, достаточно в html-документе создать экземпляр соответствующего класса и инициализировать его. В качестве передаваемых параметров при создании используется – имя создаваемого экземпляра класса, а при инициализации – идентификатор элемента (в рассматриваемом случае это идентификатор ‘acc’ спиcка ul ), а также номер пункта меню, разворачиваемого при инициализации.
Осталось немножко оформить аккордеон в таблице стилей:
* {margin:0; padding:0; font:12px Verdana,Arial}
#acc {
width:357px;
list-style:none;
color:#033;
margin:40px auto 40px;
border:1px solid #bbb;
}
#acc h3 {
width:auto;
padding:6px 6px 8px;
margin-top:0px;
cursor:pointer;
color: #567;
font-size: 12px;
background: -moz-linear-gradient(top, #ffffff 1%, #eaeaea 100%);
background: -webkit-gradient(linear, left top, left bottom, color-stop(1%,#ffffff), color-stop(100%,#eaeaea));
background: -webkit-linear-gradient(top, #ffffff 1%,#eaeaea 100%);
background: -o-linear-gradient(top, #ffffff 1%,#eaeaea 100%);
background: -ms-linear-gradient(top, #ffffff 1%,#eaeaea 100%);
background: linear-gradient(top, #ffffff 1%,#eaeaea 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eaeaea',GradientType=0 );
}
#acc h3:hover {
box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.5) inset;
-moz-box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.5) inset;
-webkit-box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.5) inset;
}
#acc .acc-content {
overflow:hidden;
width:auto;
background:#fff;
}
#acc .acc-content ul{
list-style:none;
height:200px;
}
#acc .acc-content ul li a{
color:#555;
text-decoration: none;
font-size: 11px;
line-height: 20px;
display: block;
padding-left:20px;
}
#acc .acc-content ul li a:hover{
color:#55d;
background: #f6f6f6;
}
На этом пока всё. До встречи!