Статьи

Как создать собственный аккордеон jQuery

Аккордеоны могут быть очень полезны для отображения множества различных разделов данных на небольшом пространстве. jQuery UI имеет встроенную функцию Accordion , но в соответствии с jQuery UI Build your Download размер сценариев Core jQuery UI и Accordion составляет 25 КБ и 16,6 КБ соответственно. Сегодня я покажу вам, как создать собственный аккордеон, который будет более «эффективным по пропускной способности».

Загрузите вложение с боковой панели, чтобы посмотреть.

Это похоже на многое для одного простого аккордеона. Особенно, когда вы добавляете в обычный скрипт jQuery, который сокращен до 18 Кбайт и Gzipped. Так что вместо увеличения времени загрузки страницы с дополнительными ненужными функциями, почему бы не создать что-то с нуля?

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

Таким образом, план этого урока — показать создание аккордеона с помощью функции пользовательского интерфейса jQuery, а затем создать его с помощью некоторого пользовательского кода. Давайте использовать боковую панель блога в качестве примера.

Разметка очень проста, просто элемент списка для каждого раздела в аккордеоне:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<ul id=»accordion»>
    <li>
        <a href=»#recent» class=»heading»>Recent Entries</a>
        <ul id=»recent»>
            <li><span class=»date»>01.19.2009
            <li><span class=»date»>01.15.2009
            <li><span class=»date»>01.13.2009
            <li><span class=»date»>01.11.2009
            <li><span class=»date»>01.10.2009
        </ul>
    </li>
    <li>
        <a href=»#popular» class=»heading»>Popular Entries</a>
        <ul id=»popular»>
            <li><span class=»date»>08.16.2008
            <li><span class=»date»>06.12.2008
            <li><span class=»date»>04.12.2008
            <li><span class=»date»>06.12.2007
            <li><span class=»date»>03.12.2007
        </ul>
    </li>
    <li>
        <a href=»#categories» class=»heading»>Categories</a>
        <ul id=»categories»>
            <li><a href=»#»>Category Name</a> <span class=»count»>7
            <li><a href=»#»>Category Name</a> <span class=»count»>4
            <li><a href=»#»>Category Name</a> <span class=»count»>15
            <li><a href=»#»>Category Name</a> <span class=»count»>29
            <li><a href=»#»>Category Name</a> <span class=»count»>8
        </ul>
    </li>
    <li>
        <a href=»#archive» class=»heading»>Archive</a>
        <ul id=»archive»>
            <li><a href=»#»>January 2009</a> <span class=»count»>4
            <li><a href=»#»>December 2008</a> <span class=»count»>14
            <li><a href=»#»>November 2008</a> <span class=»count»>12
            <li><a href=»#»>October 2008</a> <span class=»count»>8
            <li><a href=»#»>September 2008</a> <span class=»count»>18
        </ul>
    </li>
</ul>

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
/*****Reset*****/
html, body, div, h1, h3, h3, h4, h5, h6, ul, ol, dl, li, dt, dd, p, blockquote, pre, form, fieldset, table, th, td { margin: 0;
 
/*****Basic Definitions*****/
body { background: #fff;
h1 { font-size: 24px;
 
a { }
a:visited { }
a:hover { text-decoration: none;
img { border: none;
p, ul, ol, dl, table { margin-bottom: 18px;
ul, ol, dd { margin-left: 36px;
 
/*****Custom Classes*****/
.clearing { clear: both;
.clearfix { overflow: hidden;
.last { margin-bottom: 0;
.screenReader { left: -9999px;

Далее я собираюсь удалить поле и стиль списка из неупорядоченного списка аккордеона и списков потомков и добавить нижнюю границу к неупорядоченному списку аккордеона (вскоре вы увидите, почему это только нижняя граница).

1
2
ul#accordion, ul#accordion ul { list-style: none;
ul#accordion { border-bottom: 1px solid #000E2E;

Затем я собираюсь добавить границу вокруг каждой секции аккордеона, кроме нижней границы. Кроме того, я собираюсь удалить границу из элементов списка, которые являются потомками секции аккордеона, и добавить только нижнюю границу. Если это последний дочерний элемент неупорядоченного списка потомков, я собираюсь удалить нижнюю границу. Да, я знаю, что это не будет работать в IE, но это не обязательно.

1
2
3
4
5
6
7
8
ul#accordion li { border: 1px solid #000E2E;
ul#accordion ul li {
    border: none;
    border-bottom: 1px solid #C2C8D1;
    color: #999;
    padding: 5px 10px;
}
ul#accordion ul li:last-child { border-bottom: none;

Далее я собираюсь стилизовать основную ссылку, которая будет переключать аккордеон, чтобы они выделялись больше:

01
02
03
04
05
06
07
08
09
10
ul#accordion a.heading {
    background: #F4FFF9;
    color: #999;
    display: block;
    font-size: 18px;
    line-height: 18px;
    padding: 10px 5px;
    text-decoration: none;
}
ul#accordion a.heading:hover { background: #00B9D2;

Наконец, я просто собираюсь сделать некоторые базовые стили для подсписков аккордеона, чтобы они выглядели немного лучше:

1
2
3
4
ul#accordion li ul a { border-bottom: 1px solid #00B9D2;
ul#accordion li ul a:hover { border-bottom: none;
ul#accordion li ul .date { padding-right: 10px;
ul#accordion li ul .count { padding-left: 10px;

Давайте посмотрим, где мы находимся до сих пор. Так же будет выглядеть аккордеон, когда мы используем JQuery UI Accordion и JavaScript отключен.

Аккордеонная разметка

Похоже, нам нужно будет добавить несколько дополнительных CSS для IE6, чтобы учесть ошибку пробелов :

1
2
3
4
ul#accordion { float: left;
ul#accordion li { float: left;
ul#accordion a.heading { width: 298px;
ul#accordion ul li { float: none;
Домашняя страница пользовательского интерфейса jQuery

Теперь, когда у нас есть вся разметка и стилизация, реализовать аккордеон JQuery UI очень просто. Во-первых, нам просто нужно включить jQuery и наш скрипт jQuery UI .

1
2
<script type=»text/javascript» src=»scripts/jquery.js»></script>
<script type=»text/javascript» src=»scripts/jquery-ui-accordion.js»></script>

Затем нам нужно инициализировать аккордеон в нашем неупорядоченном списке с идентификатором аккордеона:

И вот, у вас есть рабочий гармошка.

Рабочий Аккордеон

Чтобы сделать текущий открытый аккордеонный элемент более заметным, я добавил немного дополнительного CSS:

1
ul#accordion li.ui-accordion-selected a.heading { background: #025185;

Имя класса ui-accordion-selected автоматически добавляется в текущий раздел аккордеона.

Теперь, когда мы сделали аккордеон jQuery UI, пришло время создать наш собственный. Одна вещь, которая мне не обязательно нравится в версии jQuery UI, это то, как она отображается, когда JavaScript отключен. Я бы предпочел, чтобы только один раздел был открыт одновременно.

Для этого я добавлю немного PHP. Вы можете легко сделать это с любым языком программирования.

Идея заключается в том, что мы собираемся передать переменную в URL, и если переменная совпадает с каждым разделом, мы назначаем класс текущего для этого раздела. Гораздо проще увидеть это в коде, поэтому посмотрите:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php $section = $_GET[‘section’];
<ul id=»accordion»>
    <li<?php if($section == » || $section == ‘recent’): ?> class=»current»<?php endif;
        <a href=»?section=recent» class=»heading»>Recent Entries</a>
        <ul id=»recent»>
            <li><span class=»date»>01.19.2009
            <li><span class=»date»>01.15.2009
            <li><span class=»date»>01.13.2009
            <li><span class=»date»>01.11.2009
            <li><span class=»date»>01.10.2009
        </ul>
    </li>
    <li<?php if($section == ‘popular’): ?> class=»current»<?php endif;
        <a href=»?section=popular» class=»heading»>Popular Entries</a>
        <ul id=»popular»>
            <li><span class=»date»>08.16.2008
            <li><span class=»date»>06.12.2008
            <li><span class=»date»>04.12.2008
            <li><span class=»date»>06.12.2007
            <li><span class=»date»>03.12.2007
        </ul>
    </li>
    <li<?php if($section == ‘categories’): ?> class=»current»<?php endif;
        <a href=»?section=categories» class=»heading»>Categories</a>
        <ul id=»categories»>
            <li><a href=»#»>Category Name</a> <span class=»count»>7
            <li><a href=»#»>Category Name</a> <span class=»count»>4
            <li><a href=»#»>Category Name</a> <span class=»count»>15
            <li><a href=»#»>Category Name</a> <span class=»count»>29
            <li><a href=»#»>Category Name</a> <span class=»count»>8
        </ul>
    </li>
    <li<?php if($section == ‘archive’): ?> class=»current»<?php endif;
        <a href=»?section=archive» class=»heading»>Archive</a>
        <ul id=»archive»>
            <li><a href=»#»>January 2009</a> <span class=»count»>4
            <li><a href=»#»>December 2008</a> <span class=»count»>14
            <li><a href=»#»>November 2008</a> <span class=»count»>12
            <li><a href=»#»>October 2008</a> <span class=»count»>8
            <li><a href=»#»>September 2008</a> <span class=»count»>18
        </ul>
    </li>
</ul>

Вы также должны заметить, что я изменил URL каждой из ссылок, чтобы переключать секции аккордеона, чтобы они соответствовали выражению if для секции. В общем, если JavaScript отключен, вы перейдете на новую страницу с открытым разделом.

Нам также нужно удалить JQuery UI-скрипт и добавить наш собственный:

1
<script type=»text/javascript» src=»scripts/accordion.js»></script>

С этим небольшим изменением в разметке нам нужно добавить немного дополнительного CSS. У нас больше нет класса ui-accordion-selected , назначаемого элементам списка; сейчас это класс тока . Мы также должны учитывать это изменение имени класса во включенном состоянии для аккордеона:

1
ul#accordion li.current a.heading { background: #025185;

Поэтому мы хотим скрыть все неупорядоченные списки, если они не являются потомками элемента списка с классом current . Я также добавил идентификатор тела на эту демонстрационную страницу, чтобы мы могли использовать одну и ту же таблицу стилей для обоих примеров.

1
2
body#customAccordion ul#accordion li ul { display: none;
body#customAccordion ul#accordion li.current ul { display: block;

Сначала мы хотим выполнить скрипт после загрузки документа, поэтому мы начнем с этого:

Мы хотим, чтобы аккордеон функционировал при щелчке по ссылкам заголовков, но мы не хотим покидать страницу, поэтому нам нужно убедиться и вернуть false :

Далее, мне не нравится схема, которая появляется вокруг ссылок, когда они нажимаются, поэтому я установил для нее значение none:

Есть два разных случая для этого сценария.

  1. Нажатая ссылка — это уже открытый раздел.
  2. Ссылка, по которой щелкают, не является тем разделом, который уже открыт.

Это не та функциональность, которая есть в версии jQuery UI, но я думаю, что пользователь должен иметь возможность закрыть все разделы, если он этого захочет. Если по нажатой ссылке есть родительский класс, у которого есть класс current, мы хотим сдвинуть вверх неупорядоченный список и удалить класс current.

Еще одна вещь, которая меня беспокоит в версии jQuery UI, это то, что вы можете прокрутить аккордеон, чтобы он был почти не виден, щелкните по нему, и тогда взаимодействие произойдет выше того, что вы видите. Прокрутите вниз пример JQuery UI и попробуйте.

Поэтому я решил использовать этот замечательный маленький скрипт под названием jQuery ScrollTo . Это очень маленький скрипт, который добавляет плавную прокрутку страницы.

Давайте добавим это к заголовку документа перед нашим аккордеонным скриптом:

1
2
3
<script type=»text/javascript» src=»scripts/jquery.js»></script>
<script type=»text/javascript» src=»scripts/jquery-scrollTo.js»></script>
<script type=»text/javascript» src=»scripts/accordion.js»></script>

Когда секция прокручивается вверх, я хочу прокрутить окно до верхней части аккордеона:

Первый параметр функции — это цель, к которой нужно перейти, а второй — количество времени, которое это должно занять.

Этот случай возникает, когда раздел, который щелкает, в данный момент не открыт. Поэтому первое, что мы хотим сделать, это скрыть открытый в данный момент раздел и удалить класс current (этот фрагмент кода очень похож на первый случай):

Далее мы хотим открыть раздел, на который мы нажали, и добавить класс current:

Наконец, давайте прокрутим окно к вершине аккордеона, как мы это делали в первом случае:

Вот и все. Шутки в сторону. Вы думали, что создание аккордеона может быть таким простым?

Теперь давайте сравним размеры файлов JavaScript с помощью вкладки «Сеть» в Firebug .

поджигатель

В примере пользовательского интерфейса jQuery файлы JavaScript занимают около 73 КБ . В нашем пользовательском примере с дополнительной прокруткой окна файлы JavaScript составляют около 57 КБ . Это может показаться не таким уж большим, но представьте, если у вас очень высокий трафик сайта. Это может быть сохранено много байтов. Кроме того, теперь вы понимаете больше о jQuery.

Теперь выйдите и напишите свой собственный jQuery.