加载滑块后 Slick.js 破坏样式 [英] Slick.js breaking styling after loading a slider

查看:24
本文介绍了加载滑块后 Slick.js 破坏样式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个基本的 HTML/CSS/JavaScript 网页,页面上有一个供团队使用的部分.此部分将有 4 个团队,每个团队都有工作人员.使用 Slick.js,用户将为相关团队选择一个标志,然后为该团队加载一个滑块,同时隐藏上一个滑块.每个滑块将加载该团队的所有成员作为幻灯片.

上图应该能让您直观地了解我要实现的目标.小绿框将是旗帜,我很确定你可以解决其余的问题.滑块将一次显示多张幻灯片,您可以向左或向右单击以显示列表中的下一张.

问题:当点击标志时,每个滑块都被替换为新的滑块,新的滑块可以随机工作,而且在单击标志之间时,我会发现滑块堆叠在一起并且显示不正确.

这是我所拥有的...(HTML):

 jQuery(document).ready(function($) {函数initSlider(目标){$(target).slick({点:假,无限:真实,速度:300,自动播放:真实,幻灯片显示:1,自适应高度:真});}initSlider('.quote-1');initSlider('.quote-2');initSlider('.team-uk');initSlider('.team-uk-small');$('.team-flag').click(function(e){$('.team-flag').removeClass('active');$('.team-slider').addClass('hidden');$(this).addClass('active');var target = $(this).data('target');$(target).removeClass('隐藏');initSlider(目标);});$('.team-flag-small').click(function(e){$('.team-flag-small').removeClass('active');$('.team-slider').addClass('hidden');$(this).addClass('active');var target = $(this).data('target');$(target).removeClass('隐藏');initSlider(目标);});});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script><script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script><link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/><link href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.7.1/slick-theme.css" rel="stylesheet"/><script src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.7.1/slick.min.js"></script><div class="容器"><div class="row"><div class="col-md-12"><h4>团队</h4>

<div class="col-md-12"><div class="team-slider team-uk" data-slick='{"slidesToShow": 3, "slidesToScroll": 1}'><!-- 团队成员幻灯片--><div class="team-player col-xs-12 col-md-4"><img class="center-block" src="/img/andy.png"/><p class="lead">安迪</p><p>首席技术官</p><div class="team-icon-group"><a href="" class="team-social-btn"><i class="fa fa-linkedin" aria-hidden="true"></i></a><a href="" class="team-social-btn"><i class="fa fa-twitter" aria-hidden="true"></i></a>

<!-- 团队成员幻灯片结束--><!-- 重复-->

<div class="team-slider team-usa hidden" data-slick='{"slidesToShow": 3, "slidesToScroll": 1}'><!-- 团队成员幻灯片--><div class="team-player col-xs-12 col-md-4"><img class="center-block" src="/img/andy.png"/><p class="lead">美国队</p><p>首席技术官</p><div class="team-icon-group"><a href="" class="team-social-btn"><i class="fa fa-linkedin" aria-hidden="true"></i></a><a href="" class="team-social-btn"><i class="fa fa-twitter" aria-hidden="true"></i></a>

<!-- 团队成员幻灯片结束--><!-- 重复-->

<div class="team-slider team-india hidden" data-slick='{"slidesToShow": 3, "slidesToScroll": 1}'><!-- 团队成员幻灯片--><div class="team-player col-xs-12 col-md-4"><img class="center-block" src="/img/andy.png"/><p class="lead">印度队</p><p>首席技术官</p><div class="team-icon-group"><a href="" class="team-social-btn"><i class="fa fa-linkedin" aria-hidden="true"></i></a><a href="" class="team-social-btn"><i class="fa fa-twitter" aria-hidden="true"></i></a>

<!-- 团队成员幻灯片结束--><!-- 重复-->

<div class="team-slider team-hong-kong hidden" data-slick='{"slidesToShow": 3, "slidesToScroll": 1}'><!-- 团队成员幻灯片--><div class="team-player col-xs-12 col-md-4"><img class="center-block" src="/img/andy.png"/><p class="lead">香港队</p><p>首席技术官</p><div class="team-icon-group"><a href="" class="team-social-btn"><i class="fa fa-linkedin" aria-hidden="true"></i></a><a href="" class="team-social-btn"><i class="fa fa-twitter" aria-hidden="true"></i></a>

<!-- 团队成员幻灯片结束--><!-- 重复-->

<div class="col-md-12 team-flag-group"><img src="/img/web-assests/uk-flag.jpg" alt="英国队" class="team-flag active" id="team-uk-btn" data-target=".team-英国"/><img src="/img/web-assests/usa-flag.jpg" alt="美国队" class="team-flag" id="team-usa-btn" data-target=".team-usa"/><img src="/img/web-assests/india-flag.jpg" alt="印度队" class="team-flag" id="team-india-btn" data-target=".team-india"/><img src="/img/web-assests/hong-kong-flag.jpg" alt="香港队" class="team-flag" id="team-hong-kong-btn" data-target=".team-hong-kong"/>

Javascript:

在这个阶段,我不相信我做错了什么,但完全愿意纠正,因为我不会说我是 JavaScript 的专家,所以任何帮助将不胜感激.

我忘了提到,当样式未加载时,它会在 4-5 秒后启动,但显然从最终用户的位置来看,这看起来有问题.

解决方案

您的问题与隐藏和显示轮播有关.当你把类 hidden 放在你的轮播上时,它会得到样式 display: none; 然后当你删除它时,Slick 很难设置幻灯片的位置,就像当它首先被初始化.这就是为什么所有幻灯片都垂直堆叠的原因.

要解决此问题,如果滑块已经初始化,您应该在滑块上调用 .slick('setPostion').如果滑块具有 .slick-initialized 类,您就可以判断它是否已经初始化.

您的代码将如下所示:

$('.team-flag').click(function(e) {$('.team-flag').removeClass('active');$('.team-slider').addClass('hidden');$(this).addClass('active');var target = $(this).data('target');$(target).removeClass('隐藏');if ($(target).hasClass('slick-initialized'))$(target).slick('setPosition');别的initSlider(目标);});

这样您也只需要初始化一次滑块.

有关工作解决方案的演示,请参阅此小提琴.

I am working a basic HTML/CSS/JavaScript webpage, on the page is a section for teams. This section will have 4 teams with staff for each. Using Slick.js the user will select a flag for the related team and that will then load a slider for that team while hiding the previous slider. Each slider will load all the members for that team as a slide.

The picture above should give you a visual idea of what I'm looking to achieve. the small green boxes will be the flags and I'm pretty sure you can work out the rest. The slider will show a number of slides at once and you click left or right to display the next in the list.

The issue: When clicking on flags each slider is being replaced with the new one which is working however randomly and more often than not when clicking between the flags I will find the sliders stacked and not displaying correctly.

Here is what I have... (HTML):

    jQuery(document).ready(function($) {
      function initSlider(target) {
        $(target).slick({
          dots: false,
          infinite: true,
          speed: 300,
          autoplay: true,
          slidesToShow: 1,
          adaptiveHeight: true
        });
      }
    
      initSlider('.quote-1');
      initSlider('.quote-2');
      initSlider('.team-uk');
      initSlider('.team-uk-small');
    
      $('.team-flag').click(function(e){
        $('.team-flag').removeClass('active');
        $('.team-slider').addClass('hidden');
        $(this).addClass('active');
        var target = $(this).data('target');
        $(target).removeClass('hidden');
        initSlider(target);
      });
    
      $('.team-flag-small').click(function(e){
        $('.team-flag-small').removeClass('active');
        $('.team-slider').addClass('hidden');
        $(this).addClass('active');
        var target = $(this).data('target');
        $(target).removeClass('hidden');
        initSlider(target);
      });
    });

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<link href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.7.1/slick-theme.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.7.1/slick.min.js"></script>

<div class="container">
      <div class="row">
        <div class="col-md-12">
            <h4>THE TEAM</h4>
        </div>          
    
        <div class="col-md-12">
            <div class="team-slider team-uk" data-slick='{"slidesToShow": 3, "slidesToScroll": 1}'>
    
              <!-- Team Member Slide -->
              <div class="team-player col-xs-12 col-md-4">
                <img class="center-block" src="/img/andy.png" />
                <p class="lead">Andy</p>
                <p>CTO</p>
                <div class="team-icon-group">
                  <a href="" class="team-social-btn"><i class="fa fa-linkedin" aria-hidden="true"></i></a>
                  <a href="" class="team-social-btn"><i class="fa fa-twitter" aria-hidden="true"></i></a>
                </div>
              </div>
              <!-- Team Member Slide end -->
    
              <!-- Repeated -->           
    
            </div>
    
            <div class="team-slider team-usa hidden" data-slick='{"slidesToShow": 3, "slidesToScroll": 1}'>
    
              <!-- Team Member Slide -->
              <div class="team-player col-xs-12 col-md-4">
                <img class="center-block" src="/img/andy.png" />
                <p class="lead">Team America</p>
                <p>CTO</p>
                <div class="team-icon-group">
                  <a href="" class="team-social-btn"><i class="fa fa-linkedin" aria-hidden="true"></i></a>
                  <a href="" class="team-social-btn"><i class="fa fa-twitter" aria-hidden="true"></i></a>
                </div>
              </div>
              <!-- Team Member Slide end -->
    
              <!-- Repeated -->        
    
            </div>
    
            <div class="team-slider team-india hidden" data-slick='{"slidesToShow": 3, "slidesToScroll": 1}'>
    
              <!-- Team Member Slide -->
              <div class="team-player col-xs-12 col-md-4">
                <img class="center-block" src="/img/andy.png" />
                <p class="lead">Team India</p>
                <p>CTO</p>
                <div class="team-icon-group">
                  <a href="" class="team-social-btn"><i class="fa fa-linkedin" aria-hidden="true"></i></a>
                  <a href="" class="team-social-btn"><i class="fa fa-twitter" aria-hidden="true"></i></a>
                </div>
              </div>
              <!-- Team Member Slide end -->
    
              <!-- Repeated -->      
    
            </div>
    
            <div class="team-slider team-hong-kong hidden" data-slick='{"slidesToShow": 3, "slidesToScroll": 1}'>
    
              <!-- Team Member Slide -->
              <div class="team-player col-xs-12 col-md-4">
                <img class="center-block" src="/img/andy.png" />
                <p class="lead">Team Hong Kong</p>
                <p>CTO</p>
                <div class="team-icon-group">
                  <a href="" class="team-social-btn"><i class="fa fa-linkedin" aria-hidden="true"></i></a>
                  <a href="" class="team-social-btn"><i class="fa fa-twitter" aria-hidden="true"></i></a>
                </div>
              </div>
              <!-- Team Member Slide end -->           
    
                <!-- Repeated --> 
    
            </div>
          </div>
    
          <div class="col-md-12 team-flag-group">
            <img src="/img/web-assests/uk-flag.jpg" alt="UK Team" class="team-flag active" id="team-uk-btn" data-target=".team-uk" />
            <img src="/img/web-assests/usa-flag.jpg" alt="USA Team" class="team-flag" id="team-usa-btn" data-target=".team-usa"/>
            <img src="/img/web-assests/india-flag.jpg" alt="India Team" class="team-flag" id="team-india-btn" data-target=".team-india"/>
            <img src="/img/web-assests/hong-kong-flag.jpg" alt="Hong Kong Team" class="team-flag" id="team-hong-kong-btn" data-target=".team-hong-kong"/>
          </div>
    
      </div>
    </div>

Javascript:

At this stage I don't believe I have done anything wrong but completely open to correction as I wouldn't say I'm an expert at JavaScript so any help will be appreciated.

Edit: I forgot to mention that when the style doesn't load it does kick in after 4-5 seconds but obviously from a end users position this looks buggy.

解决方案

Your issue has to do with hiding and showing your carousel. When you put the class hidden on your carousel it gets the style display: none; and then when you remove it Slick has a hard time setting the positions of the slides like when it first gets initialized. That's why all the slides become stacked vertically.

To fix this you should call .slick('setPostion') on the slider if it has already be initialized. You can tell if a slider has already been initialized if it has the class .slick-initialized.

Your code would then look something like this:

$('.team-flag').click(function(e) {
    $('.team-flag').removeClass('active');
    $('.team-slider').addClass('hidden');
    $(this).addClass('active');
    var target = $(this).data('target');
    $(target).removeClass('hidden');

    if ($(target).hasClass('slick-initialized'))
      $(target).slick('setPosition');
    else
      initSlider(target);
  });

This way you are also only initializing the slider only once.

See this fiddle for a demo of the working solution.

这篇关于加载滑块后 Slick.js 破坏样式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
前端开发最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆