一尘不染

如何构建具有滑动或不透明效果的简单jQuery图像滑块?

css

我们中的某些人可能不希望使用现成的插件,因为它们的尺寸很大,并且可能与当前的javascript产生冲突。

我以前使用过轻型滑块插件,但是当客户进行模块化修改时,就变得很难操作。然后,我的目标是建立易于定制的地雷。我认为滑块从一开始就不应该那么复杂。

什么是构建jQuery图像滑块的简单干净的方法?


阅读 281

收藏
2020-05-16

共1个答案

一尘不染

在检查示例之前,您应该了解我最常用的两个jQuery函数。

index()返回的值是一个整数,指示jQuery对象中第一个元素相对于其同级元素的位置。

eq()根据元素的位置(索引值)选择元素。

基本上,我选择选定的触发器元素,index value并使用eq方法将其与图像匹配。

- 淡入/淡出 效果。

- 滑动 效果。

-备用 鼠标滚轮 响应。


HTML样本:

<ul class="images">
   <li>
      <img src="images/1.jpg" alt="1" />
   </li>
   <li>
      <img src="images/2.jpg" alt="2" />
   </li>
   ...
</ul>

<ul class="triggers">
   <li>1</li>
   <li>2</li>
   ...
</ul>
<span class="control prev">Prev</span>
<span class="control next">Next</span>

效果:

CSS技巧: 位置重叠的图片:绝对

ul.images { position:relative; }
  ul.images li { position:absolute; }

jQuery:

var target;
var triggers = $('ul.triggers li');
var images = $('ul.images li');
var lastElem = triggers.length-1;

triggers.first().addClass('active');
images.hide().first().show();

function sliderResponse(target) {
    images.fadeOut(300).eq(target).fadeIn(300);
    triggers.removeClass('active').eq(target).addClass('active');
}

滑动效果:

CSS技巧: 使用双重包装并使用child作为遮罩

.mask { float:left; margin:40px; width:270px; height:266px; overflow:hidden;  }
    ul.images { position:relative; top:0px;left:0px; }
    /* this width must be total of the images, it comes from jquery */
        ul.images li { float:left; }

jQuery:

var target;
var triggers = $('ul.triggers li');
var images = $('ul.images li');
var lastElem = triggers.length-1;
var mask = $('.mask ul.images');
var imgWidth = images.width();

triggers.first().addClass('active');
mask.css('width', imgWidth*(lastElem+1) +'px');

function sliderResponse(target) {
    mask.stop(true,false).animate({'left':'-'+ imgWidth*target +'px'},300);
    triggers.removeClass('active').eq(target).addClass('active');
}

两个滑块的通用jQuery响应:

触发器+下一个/上一个点击和计时

triggers.click(function() {
    if ( !$(this).hasClass('active') ) {
        target = $(this).index();
        sliderResponse(target);
        resetTiming();
    }
});

$('.next').click(function() {
    target = $('ul.triggers li.active').index();
    target === lastElem ? target = 0 : target = target+1;
    sliderResponse(target);
    resetTiming();
});
$('.prev').click(function() {
    target = $('ul.triggers li.active').index();
    lastElem = triggers.length-1;
    target === 0 ? target = lastElem : target = target-1;
    sliderResponse(target);
    resetTiming();
});

function sliderTiming() {
    target = $('ul.triggers li.active').index();
    target === lastElem ? target = 0 : target = target+1;
    sliderResponse(target);
}

var timingRun = setInterval(function() { sliderTiming(); },5000);
function resetTiming() {
    clearInterval(timingRun);
    timingRun = setInterval(function() { sliderTiming(); },5000);
}

2020-05-16