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

yizhihongxing

下面是总体的攻略:

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日

相关文章

  • css绝对定位如何在不同分辨率下的电脑正常显示定位位置?(一定要看!)

    CSS 绝对定位是一种常用的布局技巧,可以用于实现元素的精确定位。但是,在不同分辨率下的电脑上,绝对定位的元素可能会出现位置偏移的问题。以下是关于“CSS 绝对定位如何在不同分辨率下的电脑正常显示定位位置?”的完整攻略。 步骤一:使用百分比定位 为了解决不同分辨率下的电脑上绝对定位元素位置偏移的问题,可以使用百分比定位。百分比定位是相对于父元素的宽度和高度进…

    css 2023年5月18日
    00
  • css文件不能被正常载入的问题解决方法

    当CSS文件无法被正常载入时,可能是由于以下几种原因导致的: CSS文件路径错误 服务器无法识别CSS文件类型 文件名不规范或文件内容出错 以下是针对这些问题的可行解决方法: CSS文件路径错误 如果CSS文件的路径有误,网页无法正确地读取到CSS文件,从而导致样式表无法被正确应用。解决方法是检查路径是否正确: <link rel="styl…

    css 2023年6月9日
    00
  • AJAX实现瀑布流布局

    下面我将提供关于“AJAX实现瀑布流布局”的完整攻略,包含以下几个步骤: 步骤1:了解瀑布流布局 瀑布流布局是一种流式布局方式,在页面中按照列来展示数据。该布局的特点是: 每一列宽度相同,高度不同; 每一列数据按照从上到下,从左到右的顺序依次排列; 数据加载时通过 AJAX 异步请求,实现数据的无限滚动加载。 步骤2:布局HTML和CSS 在HTML中,我们…

    css 2023年6月11日
    00
  • 如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度

    让我来详细讲解一下如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度的攻略。 问题描述 在HTML中,pre元素和textarea元素都是常用于显示文本的元素。但是,它们在默认情况下都会出现滚动条,如果文本内容过长会导致页面布局不够美观。所以,我们需要去掉它们的滚动条,并让它们自动换行、自适应文本内容高度。 解决方法 去掉滚动条…

    css 2023年6月10日
    00
  • 可以少写1000行代码的正则表达式

    当我们编写代码的时候,往往需要对字符串进行各种各样的处理和判断,例如去除空格、筛选有效数据、判断邮箱格式等等。这些操作在不用正则表达式的情况下,往往需要写很多的判断条件,代码量就会变得非常庞杂和难以维护。而正则表达式就可以通过一些简单的语法表达式完成这些复杂的操作,从而大大减少代码量,提高代码的可读性和可维护性。 以下是一些可以少写1000行代码的正则表达式…

    css 2023年6月9日
    00
  • xmlplus组件设计系列之图标(ICON)(1)

    XMLPlus组件设计系列之图标(ICON)(1) 简介 本文介绍XMLPlus组件中图标(ICON)的设计和使用。 设计 XMLPlus中的图标(ICON)是一种可重用的组件,用于在网站中显示图标以增加用户对功能的辨识度和易用性。图标(ICON)组件的设计应该基于以下原则: 清晰明了:图标应该清晰、简洁,能够通过色彩、形状等方式反映所代表的功能。 可重用:…

    css 2023年6月9日
    00
  • 推荐一些比较有用的css3新属性

    当今的Web设计中,CSS3是非常重要且强大的工具。除了传统的颜色、字体、布局和边框等基础属性,CSS3还提供了一些新的属性,为网页设计师提供了更多创意和灵活性。以下是我为你推荐的几个比较有用的CSS3新属性的详细讲解: 1. Border-radius 属性 1.1 标题 border-radius属性可以用来设置元素的圆角。在Web设计中,圆角的应用非常…

    css 2023年6月11日
    00
  • 匹配form表单中所有内容的正则表达式

    匹配form表单中所有内容的正则表达式通常用于对表单数据的验证或提取。以下是一些该正则表达式的攻略: 正则表达式 <form.+?>([\s\S]*?)<\/form> 详细解释 该正则表达式包含了两个部分: <form.+?>: 匹配<form>标签的起始部分,并匹配任意数量的包含在<>中的字符,…

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