JS仿京东移动端手指拨动切换轮播图效果

下面是总体的攻略:

1. 需求分析

首先需要明确需求,也就是要实现一个仿京东移动端的轮播图效果。该效果的主要特点有:

  • 手指拖动轮播图时,图片可以随着手指滑动而跟随移动,并在释放时自动定到下一个或上一个轮播图。
  • 轮播图可以自动循环播放
  • 底部的小圆点可以随着轮播图的切换而同步更新

2. 技术选型

实现这个效果需要使用以下技术:

  • HTML、CSS、JavaScript
  • jQuery
  • Hammer.js(一个常用的移动端手势库)

3. 实现步骤

3.1 HTML结构

首先需要定义HTML结构,基本上就是一个容器,里面包含了不同的轮播图和底部的小圆点。示例如下:

<div class="slider">
  <ul class="slider-wrapper">
    <li class="slider-item"><img src="img1.jpg"></li>
    <li class="slider-item"><img src="img2.jpg"></li>
    <li class="slider-item"><img src="img3.jpg"></li>
  </ul>
  <ul class="slider-dots">
    <li class="slider-dot"></li>
    <li class="slider-dot"></li>
    <li class="slider-dot"></li>
  </ul>
</div>

3.2 CSS样式

接下来是CSS样式的设置,包括容器的宽高,轮播图的宽度和位置,以及小圆点的样式等。这里不再赘述。示例如下:

.slider {
  width: 100%;
  height: 200px;
  position: relative;
  overflow: hidden;
}
.slider .slider-wrapper {
  width: 300%;
  height: 100%;
  position: relative;
  left: -100%;
}
.slider .slider-item {
  float: left;
  width: 33.333%;
  height: 100%;
  position: relative;
}
.slider .slider-item img {
  width: 100%;
  height: 100%;
}
.slider .slider-dots {
  position: absolute;
  bottom: 10px;
  left: 50%;
  transform: translateX(-50%);
}
.slider .slider-dot {
  display: inline-block;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background-color: #ccc;
  margin-right: 10px;
}
.slider .slider-dot.active {
  background-color: #f00;
}

3.3 JavaScript代码

最后是JavaScript代码的编写,包括了自动轮播和手势拖动效果的实现。示例如下:

$(function() {
  var $sliderWrap = $('.slider-wrapper');
  var $sliderItems = $('.slider-item');
  var $sliderDots = $('.slider-dot');

  var slider = {
    len: $sliderItems.length,
    curIdx: 0,
    fromIdx: 0,
    toIdx: 0,
    isAnimating: false,
    autoPlayTimer: null,

    init: function() {
      var _this = this;

      // 初始化轮播图显示
      $sliderWrap.css('left', '-100%');
      $sliderItems.eq(0).clone().appendTo($sliderWrap);
      $sliderItems.eq(-1).clone().prependTo($sliderWrap);

      // 初始化小圆点
      $sliderDots.eq(0).addClass('active');
      $sliderDots.on('click', function() {
        var idx = $(this).index();
        _this.toIdx = idx;
        _this.move();
      });

      // 自动轮播
      this.autoPlay();

      // 手势操作
      this.bindTouchEvents();
    },

    autoPlay: function() {
      var _this = this;
      clearInterval(this.autoPlayTimer);
      this.autoPlayTimer = setInterval(function() {
        _this.toNext();
      }, 3000);
    },

    toNext: function() {
      this.toIdx = this.curIdx + 1;
      this.move();
    },

    toPrev: function() {
      this.toIdx = this.curIdx - 1;
      this.move();
    },

    move: function() {
      var _this = this;

      if (_this.isAnimating) {
        return;
      }

      _this.isAnimating = true;

      // 修改小圆点
      $sliderDots.eq(_this.curIdx).removeClass('active');
      $sliderDots.eq(_this.toIdx).addClass('active');

      // 目标位置
      var toPos = -(_this.toIdx + 1) * 100 / (_this.len + 2) + '%';

      // 动画移动
      $sliderWrap.animate({ left: toPos }, 500, function() {
        // 判断是否需要重置轮播图位置
        if (_this.toIdx >= _this.len) {
          $sliderWrap.css('left', '-100%');
          _this.curIdx = 0;
          _this.fromIdx = 0;
          _this.toIdx = 0;
        } else if (_this.toIdx < 0) {
          $sliderWrap.css('left', -(_this.len * 100 / (_this.len + 2)) + '%');
          _this.curIdx = _this.len - 1;
          _this.fromIdx = _this.len - 1;
          _this.toIdx = _this.len - 1;
        } else {
          _this.curIdx = _this.toIdx;
          _this.fromIdx = _this.toIdx;
        }
        _this.isAnimating = false;
      });
    },

    bindTouchEvents: function() {
      var _this = this;

      // 使用Hammer.js绑定手势事件
      var hammer = new Hammer($('.slider')[0]);
      hammer.get('swipe').set({ direction: Hammer.DIRECTION_HORIZONTAL, threshold: 20 });

      hammer.on('swipeleft', function() {
        _this.toNext();
      });

      hammer.on('swiperight', function() {
        _this.toPrev();
      });

      hammer.on('panstart', function() {
        clearInterval(_this.autoPlayTimer);
        $sliderWrap.stop(true, true);
      });

      hammer.on('panmove', function(e) {
        var delta = e.deltaX / $(window).width();
        $sliderWrap.css('left', -(_this.curIdx + 1 - delta) * 100 / (_this.len + 2) + '%');
      });

      hammer.on('panend', function(e) {
        if (e.deltaX / $(window).width() > 0.2) {
          _this.toPrev();
        } else if (e.deltaX / $(window).width() < -0.2) {
          _this.toNext();
        } else {
          _this.move();
        }
        _this.autoPlay();
      });
    }
  }

  slider.init();
});

4. 示例说明

示例1:增加新的轮播图

通过修改HTML结构,将新轮播图img4.jpg添加到列表中:

<div class="slider">
  <ul class="slider-wrapper">
    <li class="slider-item"><img src="img1.jpg"></li>
    <li class="slider-item"><img src="img2.jpg"></li>
    <li class="slider-item"><img src="img3.jpg"></li>
    <li class="slider-item"><img src="img4.jpg"></li>
  </ul>
  <ul class="slider-dots">
    <li class="slider-dot"></li>
    <li class="slider-dot"></li>
    <li class="slider-dot"></li>
    <li class="slider-dot"></li>
  </ul>
</div>

然后在CSS中修改轮播图包裹元素的宽度和轮播图item的宽度为25%:

.slider .slider-wrapper {
  width: 400%;
  height: 100%;
  position: relative;
  left: -100%;
}
.slider .slider-item {
  float: left;
  width: 25%;
  height: 100%;
  position: relative;
}

最后刷新页面,可以看到新增的轮播图以及底部的小圆点已经同步更新。

示例2:关闭自动播放功能

通过注释掉轮播图对象slider对象的autoPlay()方法即可。

slider.init();
// slider.autoPlay();

然后刷新页面,可以发现轮播图不再自动播放。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS仿京东移动端手指拨动切换轮播图效果 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • div水平垂直居中的完美解决方案

    首先我们要了解什么是“div水平垂直居中的完美解决方案”。 通常情况下,我们经常需要把一个容器(例如一个 标签)居中显示,而这个容器的宽度和高度都是不确定的。此时,需要用到一种方法,能够适应各种情况,实现“水平垂直居中”的效果。这种方法,就是“flex布局”。 flex布局 在父元素上使用display: flex,然后给子元素添加margin: auto即…

    css 2023年6月10日
    00
  • BOOTSTRAP时间控件显示在模态框下面的bug修复

    针对“BOOTSTRAP时间控件显示在模态框下面的bug修复”的问题,我提供以下完整攻略: 问题描述 在使用BOOTSTRAP时间控件时,当该控件被放置在模态框(Modal)中时,会出现控件被模态框遮挡,无法选取的bug。这是因为模态框Z-index值的默认设置会使得该控件表现异常。 修复步骤 要解决这个问题,我们可以通过以下步骤: 首先,需要将BOOTST…

    css 2023年6月10日
    00
  • CSS使用技巧20则

    让我们来详细讲解“CSS使用技巧20则”的完整攻略吧。 CSS使用技巧20则 1. 了解CSS选择器的优先级规则 在多个CSS样式规则中,当发生冲突时,浏览器要判断哪个样式规则应该优先应用。这时就需要了解CSS选择器的优先级规则了。 CSS选择器的优先级从高到低分别是: !important声明(高于任何其他声明) 内联样式声明 ID选择器 类选择器、属性选…

    css 2023年6月9日
    00
  • jquery追加元素的所有方法全面深入实例讲解(append、prepend、after、before、wrap等等)

    下面我来为您详细讲解jquery追加元素的所有方法全面深入实例讲解。 1. append() 1.1 简介 append() 方法用于在指定元素的结尾处(仍位于内部)插入指定内容。可以是任何内容,如字符串、DOM 元素或 jQuery 对象。语法:$(selector).append(content) 1.2 示例 例如,在一个带有 id=”demo” 的 …

    css 2023年6月10日
    00
  • 完美解决IE8下不兼容rgba()的问题

    为了解决IE8浏览器不兼容rgba()的问题,我们可以在CSS当中实现透明效果。 方案一:使用IE8支持的滤镜效果 IE8支持的滤镜可以实现类似于rgba()的透明效果,可以在属性当中使用Alpha滤镜来达到透明的效果。 /* 使用Alpha滤镜 */ background: none; /* 首先需要将原来的背景去掉 */ filter: progid:D…

    css 2023年6月10日
    00
  • 详解使用mocha对webpack打包的项目进行”冒烟测试”的大致流程

    Mocha是一个用于Node.js和浏览器的JavaScript测试框架。它提供了简单明了的描述测试的语法,并且支持异步测试和回调测试。在实际的项目中,我们常常需要对Webpack打包的项目进行“冒烟测试”,以确保所有模块能够正确加载、所有依赖关系链接正确等。下面是详解使用Mocha对Webpack打包的项目进行”冒烟测试”的大致流程: 步骤一:安装Moch…

    css 2023年6月10日
    00
  • 常用html元素总结包括基本结构、文档类型、头部、主体等等

    下面我会详细讲解“常用html元素总结包括基本结构、文档类型、头部、主体等等”的完整攻略。 基本结构 在编写html页面时,首先需要定义的是文档类型。常用的文档类型有HTML5、XHTML等。定义文档类型的方式如下: <!DOCTYPE html> 接着,需要构建一个最基本的HTML文件结构,代码如下所示: <!DOCTYPE html&g…

    css 2023年6月10日
    00
  • 弹窗居中的简单实现方法

    弹窗居中是前端开发中经常会遇到的问题,本文将详细介绍如何实现弹窗在页面中居中显示的方法。 方法一:使用绝对定位和margin 在HTML中,创建一个容器用来装载弹窗,然后使用CSS设置该容器的绝对定位和宽高。具体实现代码如下: <div class="modal-container"> <!– 弹窗内容 –> …

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部