自定义 jQuery 轮播过渡错误

拉兹万·赞菲尔

我正在使用 jQuery 和 CSS 处理自定义图像轮播。出于性能原因我试图避免使用从 Github 下载多功能轮播插件

我的目标是获得垂直过渡,就像www.pcgarage.ro上的那样,但不使用他们(可能)使用的插件。为此,我写了:

var $elm = $('.slider'),
  $slidesContainer = $elm.find('.slider-container'),
  slides = $slidesContainer.children('a'),
  slidesCount = slides.length,
  slideHeight = $(slides[0]).find('img').outerHeight(false);

//Set slide height
$(slides).css('height', slideHeight);

// Append bullets
for (var i = 0; i < slidesCount; i++) {
  var bullets = '<a href="#">' + i + '</a>';
  if (i == 0) {
    // active bullet
    var bullets = '<a href="#" class="activeSlide">' + i + '</a>';
    // active slide
    $(slides[0]).addClass('active');
  }
  $('.slider-nav').append(bullets);
}

// Set (initial) z-index for each slide
var setZindex = function() {
  for (var i = 0; i < slidesCount; i++) {
    $(slides[i]).css('z-index', slidesCount - i);
  }
}
setZindex();

$('.slider-nav a').on('click', function() {
  activeIdx = $(this).text();
  $('.slider-nav a').removeClass('activeSlide');
  $(this).addClass('activeSlide');
  setActiveSlide();
  slideUpDown();
});

var setActiveSlide = function() {
  $(slides).removeClass('active');
  $(slides[activeIdx]).addClass('active');
}

var slideUpDown = function() {
  // set top property for all the slides
  $(slides).css('top', slideHeight);
  // then animate to the next slide
  $(slides[activeIdx]).animate({
    'top': 0
  });
}
body {
  margin: 0;
  padding: 0;
}

body * {
  box-sizing: border-box;
}

.container {
  max-width: 1200px;
  margin: 0 auto;
}

.slider {
  width: 100%;
  height: 300px;
  position: relative;
  overflow: hidden;
}

.slider .slider-nav {
  position: absolute;
  left: 10px;
  bottom: 10px;
  z-index: 30;
}

.slider .slider-nav a {
  display: block;
  float: left;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  margin-right: 3px;
  text-indent: -9999px;
  background: #fff;
}

.slider .slider-nav a.activeSlide {
  background: transparent;
  border: 2px solid #fff;
}

.slider .slider-container {
  width: 100%;
  text-align: center;
}

.slider .slider-container a {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
}

.slider .slider-container img {
  transform: translateX(-50%);
  margin-left: 50%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<div class="container">
  <div class="slider slider-homepage">
    <div class="slider-nav"></div>
    <div class="slider-container">
      <a href="#">
        <img src="https://picsum.photos/1200/300/?gravity=east" alt="">
      </a>
      <a href="#">
        <img src="https://picsum.photos/1200/300/?gravity=south" alt="">
      </a>
      <a href="#">
        <img src="https://picsum.photos/1200/300/?gravity=north" alt="">
      </a>
    </div>
  </div>
</div>

我的代码的问题是每次转换都会出现(明显的)白屏,我不明白其原因。

我的错误在哪里?

卡里姆汗

我添加了一些变量和函数来解决这个问题,请检查脚本。

var $elm = $('.slider'),
        $slidesContainer = $elm.find('.slider-container'),
        slides = $slidesContainer.children('a'),
        slidesCount = slides.length,
        slideHeight = $(slides[0]).find('img').outerHeight(false);
    
    //Set slide height
    $(slides).css('height', slideHeight);
    
    // Append bullets
    for (var i = 0; i < slidesCount; i++) {
        var bullets = '<a href="#">' + i + '</a>';
        if (i == 0) {
            // active bullet
            var bullets = '<a href="#" class="activeSlide">' + i + '</a>';
            // active slide
            $(slides[0]).addClass('active');
        }
        $('.slider-nav').append(bullets);
    }
    
    // Set (initial) z-index for each slide
    var setZindex = function () {
        for (var i = 0; i < slidesCount; i++) {
            $(slides[i]).css('z-index', slidesCount - i);
        }
    }
    setZindex();
    
    var displayImageBeforeClick = null;
    
    $('.slider-nav a').on('click', function () {
        displayImageBeforeClick = $(".slider-container .active");
        activeIdx = $(this).text();
        if($(slides[activeIdx]).hasClass("active")){ return false; }
        $('.slider-nav a').removeClass('activeSlide');
        $(this).addClass('activeSlide');
        setActiveSlide();
        slideUpDown();
    });
    
    var setActiveSlide = function () {
        $(slides).removeClass('active');
        $(slides[activeIdx]).addClass('active');
    }
    
    var slideUpDown = function () {
        // set top property for all the slides
        $(slides).not(displayImageBeforeClick).css('top', slideHeight);
        // then animate to the next slide
        $(slides[activeIdx]).animate({
            'top': 0
        });
    
        $(displayImageBeforeClick).animate({
            'top': "-100%"
        });
    }
body {
  margin: 0;
  padding: 0;
}

body * {
  box-sizing: border-box;
}

.container {
  max-width: 1200px;
  margin: 0 auto;
}

.slider {
  width: 100%;
  height: 300px;
  position: relative;
  overflow: hidden;
}

.slider .slider-nav {
  position: absolute;
  left: 10px;
  bottom: 10px;
  z-index: 30;
}

.slider .slider-nav a {
  display: block;
  float: left;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  margin-right: 3px;
  text-indent: -9999px;
  background: #fff;
}

.slider .slider-nav a.activeSlide {
  background: transparent;
  border: 2px solid #fff;
}

.slider .slider-container {
  width: 100%;
  text-align: center;
}

.slider .slider-container a {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
}

.slider .slider-container img {
  transform: translateX(-50%);
  margin-left: 50%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

<div class="container">
  <div class="slider slider-homepage">
    <div class="slider-nav"></div>
    <div class="slider-container">
      <a href="#">
        <img src="https://picsum.photos/1200/300/?gravity=east" alt="">
      </a>
      <a href="#">
        <img src="https://picsum.photos/1200/300/?gravity=south" alt="">
      </a>
      <a href="#">
        <img src="https://picsum.photos/1200/300/?gravity=north" alt="">
      </a>
    </div>
  </div>
</div>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

jQuery验证自定义错误

来自分类Dev

多个Bootstrap轮播和自定义jQuery控件

来自分类Dev

jQuery验证自定义错误消息的位置

来自分类Dev

规则的jQuery验证程序自定义错误消息位置

来自分类Dev

jQuery / PHP输出自定义错误消息

来自分类Dev

使用Jquery验证添加自定义错误消息

来自分类Dev

jQuery验证:在自定义div中显示错误标签

来自分类Dev

JQuery 验证自定义错误消息未显示

来自分类Dev

自定义轮播间隔?

来自分类Dev

自定义轮播间隔?

来自分类Dev

自定义 Bootstrap 轮播

来自分类Dev

自定义UIView过渡

来自分类Dev

UINavigationController的自定义过渡

来自分类Dev

jQuery自定义快门

来自分类Dev

jQuery自定义插件

来自分类Dev

自定义jQuery插件

来自分类Dev

自定义所选的jQuery

来自分类Dev

自定义容器和自定义过渡

来自分类Dev

jquery自定义,自定义attr

来自分类Dev

jQuery验证插件自定义错误类分配给父div

来自分类Dev

如何使用jQuery.validator占位符来自定义错误消息?

来自分类Dev

JQuery在多个位置(表单顶部和表单级别)验证自定义错误消息

来自分类Dev

jQuery验证,带有包含确认的自定义错误消息

来自分类Dev

自定义最小和最大错误消息以进行jQuery不干扰验证

来自分类Dev

如何在jQuery Validaiton插件中添加自定义错误替换消息?

来自分类Dev

jQuery自定义验证仅显示最后一个字段的错误

来自分类Dev

如何在jQuery验证插件的空白/错误字段中添加自定义CSS?

来自分类Dev

jQuery验证插件自定义错误类分配给父div

来自分类Dev

从自定义事件返回false会在新的jquery版本中产生错误