Переопределить свойство CSS Display с помощью Flexslider 2

Я хочу скрыть в блоке карусели div#carousel_container- в моем случае - этот Flexslider 2.2 слайдер все <li> определенного класса, кроме первого.

Я планирую сделать это, чтобы скрыть их все (display: none), а затем использовать jQuery для отображения (display: block) первого <li>, который можно идентифицировать с помощью следующего настраиваемого атрибута data-gal-order = 1.

Я пробовал несколько способов:

  1. Добавьте div#carousel_container .slides li {display:none;} в мою таблицу стилей, а затем используйте jQuery, чтобы изменить только свойство display нужного элемента на block.

  2. Добавьте !important к №1. Это успешно скрывает мои элементы, но затем я не могу переключить некоторые обратно на display:block с помощью jQuery.

  3. Используйте jQuery, чтобы сначала установить свойство display:none для всех <li> элементов, а затем установить display:block для целевых элементов.

    • throught .css('display', 'none') and opposite.
    • или через .attr('style', 'float: left; display: none; width: 210px;') и наоборот.
  4. Выполнение моего пользовательского скрипта №2 до или после объявления ползунка, т.е.

    //my custom script [before]
    
    //slider declaration
    $('div#carousel_container').flexslider({
                    animation: "slide",
                    controlNav: false,
                    animationLoop: false,
                    slideshow: false,
                    itemWidth: 210,
                    itemMargin: 5,
                    asNavFor: 'div#slider_container'
    });
    
    //OR my custom script [after] (also tried with different load/ready event)
    

Однако мои изменения всегда отменяются, и style="float: left; display: block; width: 210px;" добавляется к каждому <li> элементу.

Я вполне уверен в селекторах моего сценария jQuery, так как, например, мне удалось добавить, как ожидалось, настраиваемый атрибут как для всех <li>, так и для целевых.

Но что касается изменения свойства style = "display", то сейчас я потерялся, даже если я понял, что моя проблема может быть связана с этой частью скрипта Flexslider (github.com/woothemes/FlexSlider/blob/master/ jquery.flexslider.js # L892-924)?

Любая идея будет очень признательна!


ПОЧТИ РЕШЕНИЕ 10.10.2014

Благодаря r4xz и Shikhar, мне удалось решить мою проблему следующим образом:

  • Используя следующий класс: .hide-me { display: none !important; }
  • включить указанные элементы до объявления ползунка
  • добавить параметр selector: '.slides > li:not(.hide-me)' при объявлении гибкого слайдера карусели.
  • Что касается несвязанной побочной проблемы, о которой я упоминал в комментариях, это просто то, что кажется мне нелогичным: itemMargin margin служит не для добавления поля к элементу - это должно быть сделано с помощью CSS - а для того, чтобы сообщить flexslider сколько разницы между ними вы добавили в свой CSS, чтобы он автоматически рассчитал соответствующую ширину ползунка.

Здесь рабочий скрипт


ЕЩЕ ОДНА ПРОБЛЕМА: см. этот комментарий


person John112    schedule 08.10.2014    source источник


Ответы (2)


Согласно js-fiddle, которым вы поделились, проблема может быть решена следующим подходом:

Сначала включите класс hide-me, а затем инициализируйте flexslider с помощью селектора ".slides> li: not (.hide-me)". Мы делаем это для того, чтобы мы могли выбрать подходящие изображения в соответствии с вашими требованиями. Теперь все вычисления ширины, выполняемые flexslider, будут основаны на видимых изображениях, то есть не имеющих класса «скрыть меня». Селектор : not (селектор) здесь соответствует каждому элементу, который НЕ является указанным элементом / селектором.

  $(function() {
        /* Toggle hide-me class*/
        var $liCarousel = $('#carousel_container li.img');
        $liCarousel.toggleClass('hide-me');
        $liCarousel.siblings('[data-ingal-order=1]').toggleClass('hide-me');

        $('#carousel_container').flexslider({
            animation: "slide",
            controlNav: false,
            animationLoop: false,
            slideshow: false,
            itemWidth: 210,
            itemMargin: 5,
            asNavFor: 'div#slider_container',
            selector: '.slides > li:not(.hide-me)'
        });

        $('div#slider_container').flexslider({
            animation: "slide",
            controlNav: false,
            animationLoop: false,
            directionNav:false,
            slideshow: false,
            sync: 'div#carousel_container'
        });
    });
person Shikhar    schedule 09.10.2014
comment
Замечательно, это был последний шаг назад, в котором я нуждался! Следуя вашему подходу, Шихар, я смог проделать трюк, не изменяя скрипт FlexSlider (FS). Действительно, он предоставляет параметр selector, который подходит для этого случая. Теперь он работает отлично! jsfiddle.net/253ekLf8/4 Спасибо вам обоим, @ r4xz и Шихар! - person John112; 10.10.2014
comment
отсутствует закрытие тега комментария в Fiddle; лучше проверьте это: jsfiddle.net/253ekLf8/5 - person John112; 10.10.2014
comment
На самом деле почти идеально ... Когда вы нажимаете на последний слайд карусели, он продолжает прокручивать пустой контент! У вас есть идея, как предотвратить это действие только в том случае, если после него нет слайда? - person John112; 10.10.2014
comment
Потрясающие. Почему я не подумал об этом. Отредактирую свой ответ, чтобы включить это! - person Shikhar; 11.10.2014
comment
Так как моя оставшаяся проблема более конкретна, чем та, которая была описана здесь изначально, я только что попросил помощи в ней в новый поток, а также отредактирую свой вопрос здесь, если я смогу решить другой там. - person John112; 14.10.2014
comment
У вас есть причина проблемы, которую вы указали в новом thread, но не смог ответить, так как у меня недостаточно репутации, чтобы добавить комментарий, и я еще не нашел полного ответа. Проблема возникает из-за строки 164 в flexslider target = $ slide.index ();. - person Shikhar; 15.10.2014
comment
Здесь функция index отвечает за выбор правильной цели, к которой перемещается гибкий слайдер. Теперь в вашем случае, например, если 1-е и 4-е изображения выбраны / видны из всего 4, то в соответствии с текущей реализацией / поведением индексной функции значения индекса будут 0 и 3, поскольку они все еще выглядят в оригинале список изображений, а не в отфильтрованном / сопоставленном списке, из-за чего гибкий слайдер перемещается неправильно. Очевидно, что правильными значениями в этом случае будут 0 и 1, и поэтому проблема никогда не возникает для первых двух слайдов. - person Shikhar; 15.10.2014
comment
Большое спасибо за то, что следили за этой проблемой! - person John112; 15.10.2014
comment
Что касается L.164, я не уверен, что текущая реализация действительно ищет в исходном списке изображений. Поскольку $(this) L.163 возвращается к переменной slider.slides, которая определена в L .45 с помощью специального селектора. - person John112; 15.10.2014
comment
Я знаю, что здесь проблема с индексной функцией jquery. Взгляните на эту ссылку чтобы понять контекст того, что я пытаюсь сказать. Кроме того, попробуйте жестко закодировать значения целевой переменной на желаемые / подходящие значения, и вы не столкнетесь с проблемой пробелов для последних слайдов. - person Shikhar; 15.10.2014
comment
Я попробовал этот маленький грязный прием вместо L.164 в flexslider, чтобы исправить проблему, но это не помогло бы для элементов с одинаковыми именами классов, и поэтому не рекомендовал это исправление target = $("." + $slide.attr("class").replace(" ",".")).index(slider.slides.selector); - person Shikhar; 15.10.2014
comment
Тогда я понял вашу точку зрения - ресурс, на который вы ссылались, смутил меня, поскольку он относится к ошибке jQuery, которая теперь исправлена. Однако при тестировании на Flexslider я очень хорошо вижу упомянутую вами ошибку. Нажмите на миниатюру этого скрипта, и вы увидите в прикрепленной консоли значение цели как в соответствии с текущей реализацией Flexslider - то есть 0 & 3, поскольку я придерживался вашего примера. Затем я смог воспроизвести ошибку без учета конкретной реализации Flexslider, которая дает то же самое, что можно увидеть в эта скрипка - person John112; 15.10.2014
comment
Теперь, читая index() документацию, я на самом деле считаю, что идея вашего предложения по исправлению не такая уж грязная. Как ни странно, если жестко запрограммированная версия вашего исправления не работает в реализации Flexslider - возвращает целевые значения 2 (почему ?!) & 3 (см. Fiddle) - однако он работает при установке директивы по контексту Flexslider - возвращает 0 & 1 (см. другую скрипку). Значит, в Flexslider он должен работать, а почему-то нет ?! - person John112; 15.10.2014
comment
Для реализации скриптов с Flexslider дополнения к скрипту Flexslider по умолчанию находятся в строках с 164 по 167 панели JS Fiddles. - person John112; 15.10.2014
comment
Наконец разобрался с исправлением. Мы все время использовали неправильный селектор. Нам также нужно различать элементы карусели и слайдера. Замена L.164 Flexslider на target = $slide.index("#carousel " + slider.slides.selector); сделает Хитрость. Кроме того, предыдущий Fiddle возвращал правильные целевые значения; 0 и 1 для совпадающих элементов # ползунка и 2 и 3 (которые мы видели) для совпадающих элементов # карусели - person Shikhar; 15.10.2014
comment
Большой! Большое спасибо. Я отвечу и задам вам последний побочный вопрос по более конкретная тема. Это был последний штрих, который мне нужно было отметить, чтобы вопрос был решен. Отредактирую с работающим примером реализации. - person John112; 17.10.2014

Второй способ звучит отлично, но требует небольшого улучшения:

.hide-me { display: none !important; }

Теперь вы можете переключить класс .hide-me в указанном li, чтобы показать / скрыть элемент.

person Wojciech Mleczek    schedule 08.10.2014
comment
Реализовано с .toogleClass('hide-me') почти хорошо работает, спасибо! Тем не менее появился побочный вопрос. Если ненужные элементы теперь успешно исчезают, они не используются для расчета ширины карусели. То есть, например, если в моей карусели отображается 2 элемента из 10, ширина карусели все равно рассчитано Flexslider для 10 элементов. Таким образом, даже для 2 элементов, отображаемых на экране, достаточно большого для отображения 4 из них, прокрутка стрелок Prev / Next будет включен, что отображает пустую область ... - person John112; 09.10.2014
comment
jsfiddle.net/253ekLf8/3 с другой побочной проблемой (но, очевидно, не связанной с .hide- me class) - у меня не может работать параметр itemMargin Flexslider ... - person John112; 09.10.2014