jquery горизонтальный слайдер ul/navbar

Я работаю над обычной домашней страницей с горизонтальной панелью навигации (стиль начальной загрузки Twitter).

Проблема: в зависимости от ввода при входе на сайт на странице будет отображаться набор кнопок на панели навигации. Он может отображать 4 кнопки или 20 кнопок, в зависимости от этого ввода.

Когда слишком много кнопок (простой, если кнопки> x), я хочу применить горизонтальный ползунок, который будет анимировать/скользить по одной кнопке, когда пользователь нажимает кнопку «предыдущая/следующая».

До сих пор я пробовал bxSlider (www.bxslider.com) и hoverscroll. Hoverscroll был в порядке, но мне нужно было что-то, основанное на щелчке, а не наведении курсора мыши. BxSlider скользит только на фиксированный размер при каждом щелчке, и я хочу что-то, что скользит к элементу, а не к пикселям.

Спасибо.

<div id="divone">
  <div id="divtwo">
    <ul id="my-list">
      <li>Link<li>
      <li>Link<li>
      <li>Link<li>
      <li>Link<li>
      <li>Link<li>
       etc.
    <ul>
  </div>
</div>



            #divone
            {
                width: 678px;
                height: 51px;
                position: relative;
            }

            #divtwo
            {
                width: 678px;
                height: 51px;
                overflow: hidden;
            }

            #my-list
            {
                width: 6000px;
            }

Это структура, возможно, с другим родительским элементом div 'overflow: hidden', поэтому я могу создать прокручиваемую/скользящую область.

Я ценю любую помощь.


person Zubzob    schedule 23.10.2012    source источник
comment
Пожалуйста, опубликуйте свой существующий html/css/jquery, чтобы мы знали, что писать. Я могу написать вам практическое решение, но без вашего кода это почти все, что я могу сделать.   -  person Zachary Kniebel    schedule 23.10.2012


Ответы (1)


В своих спецификациях вы указали, что если у вас есть определенное количество кнопок, скажем, «более x кнопок», вы хотите, чтобы ползунок отображался. Таким образом, вы хотите создать панель навигации, которая будет выглядеть нормально независимо от наличия ползунка. К сожалению, я не могу помочь вам с этим аспектом проблемы, если не увижу ваш CSS; Я смогу помочь вам только с jQuery.

Для начала вам нужно будет написать условное выражение:

if ($("button").length > x) { ...show slider...}

Теперь, прежде чем мы продолжим, я хотел бы указать на тот очевидный факт, что существует множество различных способов создания слайдера. Не имея возможности видеть ваш код (я знаю, что на данный момент я, вероятно, звучу как заезженная пластинка, но вы все еще новичок в Stack Overflow, так что это я вас учу), наиболее совместимое решение, о котором я могу думать, было бы чтобы создать панель навигации и оставить достаточно места слева и справа для кнопок ползунка (мы будем манипулировать свойством visibility, чтобы показать/скрыть их, а не свойством display — это также предотвратит медленные скачки панели навигации при загрузке). браузеры).

Чтобы реализовать это, нам нужно будет начать с двух элементов (показаны только селекторы) для кнопок:

var buttonLeft = $("#buttonLeft");
var buttonRight = $("#buttonRight");

Затем мы хотим добавить следующие строки, которые будут выполняться, если наше условие было истинным:

buttonLeft.css("visibility", "visible")
          .on("click.sliderLeft", function() {...show more on the left...};
buttonRight.css("visibility", "visible")
           .on("click.sliderRight", function() {...show more on the right...};

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

Это еще одна часть сценария, которую можно реализовать десятками способов. Реализация, которую вы выберете, будет в значительной степени основываться на ваших HTML и CSS. Для этого практического руководства я просто предположу, что вы собираетесь использовать скользящий элемент с position: relative и с некоторым оберткой div с overflow: hidden.

var navBar = $("#navBar"); // sliding element

Следующий шаг — определить, что вы хотите использовать для эффекта слайда. Для простоты (и поскольку вы используете начальную загрузку - таким образом, у вас, скорее всего, все кнопки будут одинакового размера), я собираюсь предположить, что все ваши кнопки навигации имеют одинаковый размер:

var navButtonWidth = $(".navButtons").width();

Я также собираюсь предположить, для простоты, что у вас есть левое и правое поля ваших кнопок, установленные на 5px. Далее я предполагаю, что каждая анимация будет занимать 1000 миллисекунд. Таким образом, вы захотите добавить следующие строки в обработчики кликов, чтобы они служили вашими эффектами слайда:

var slideAmount = navButtonWidth + 10; //button width plus margin left plus margin right

//left button
...
var slideLeftStr = "+=" + slideAmount + "px";
navBar.animate({ left: slideStr }, 1000);
...

//right button
...
var slideRightStr = "-=" + slideAmount + "px";
navBar.animate({ left: slideStr }, 1000);
...

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


Дайте знать, если у вас появятся вопросы. Удачи! :)


ОБНОВЛЕНИЕ:

Чтобы ответить на ваш вопрос об использовании кнопок для перехода к определенной кнопке, ответ будет «да, вы можете это сделать», но на самом деле вы хотели бы перейти к начальной позиции следующей или предыдущей кнопки (соответственно). ). Я могу сказать вам, что это, вероятно, выглядело бы ужасно, но в любом случае вот код:

...
//put this function outside of the click handlers
var slideTo = function (destButton) {
    //destButton is the button you are sliding to
    return destButton.offset().left + "px";   
}     

//put this in both click handlers
...
var destinationButton = ....get the previous or next button based on which handler you're in
navBar.animate({ left: slideTo(destinationButton) }, 1000);
...

Однако вариант, который я бы предложил, состоит в том, чтобы написать обработчик кликов, который медленно скользит по панели навигации, пока пользователь все еще держит указатель мыши над кнопкой.

person Zachary Kniebel    schedule 23.10.2012
comment
Поскольку я имею дело с панелью навигации, ширина кнопок зависит от их содержимого. Таким образом, я не уверен, насколько подходит этот вариант на основе пикселей. Есть ли что-то вроде слайда на li:eq(x)? - person Zubzob; 24.10.2012
comment
Идея заключалась в том, чтобы привести простой пример, в котором вы скользите на заданную величину. Вы также можете настроить непрерывное скольжение кнопок, пока вы удерживаете кнопку мыши нажатой. - person Zachary Kniebel; 24.10.2012