原生js实现移动开发轮播图、相册滑动特效

实现移动开发轮播图、相册滑动特效的核心技术是原生JS实现手势识别和滑动控制。在实现前,需要明确以下几点:

  1. 滑动容器的尺寸及内部元素的数量
  2. 滑动方向和速度控制
  3. 原生JS实现手势识别技术

接下来,我将结合示例展开讲解:

示例一:移动轮播图

实现移动轮播图需要使用JS异步实现图片的加载和手势滑动的监听。以下是详细步骤:

第一步:布局

使用HTML布局画面容器及包含着图片的DIV,图片数量根据需求自行添加。建议设置图片的高度、宽度、水平居中等属性,以便于控制样式。

<div id="banner">
  <div id="imgs" style="width: 600px; height: 200px; margin: 0 auto; position: relative;">
    <img alt="图片1" src="img/1.jpg" />
    <img alt="图片2" src="img/2.jpg" />
    <img alt="图片3" src="img/3.jpg" />
  </div>
</div>

第二步:JS异步加载图片

使用异步加载方法,将用于轮播的图片先预加载,以便于在滑动时不需要等待图片加载完毕。

var imgs = new Array();
var imgUrls = ["img/1.jpg", "img/2.jpg", "img/3.jpg"];

function preloadImages() {
  for (i = 0; i < imgUrls.length; i++) {
    imgs[i] = new Image();
    imgs[i].src = imgUrls[i];
    imgs[i].onload = function() {
      console.log(i);
    };
  }
}

第三步:处理手势滑动

使用原生JS处理滑动事件,需要对滑动容器添加 touchstart、touchmove、touchend三大事件监听器,并对其中的坐标位置信息进行处理,计算出滑动方向和速度。

$(function() {
  var startX, endX, startY, endY;
  var threshold = 50;    //手势敏感度
  var el_imgs = document.getElementById("imgs");
  var len = imgUrls.length;
  var index = 0;         //当前显示图片的下标

  el_imgs.addEventListener("touchstart", function(e) {
    startX = e.touches[0].pageX;
    startY = e.touches[0].pageY;
  }, false);

  el_imgs.addEventListener("touchend", function(e) {
    endX = e.changedTouches[0].pageX;
    endY = e.changedTouches[0].pageY;
    var swipeLength = Math.abs(endX-startX);      //水平位移量
    var swipeHLength = Math.abs(endY-startY);     //垂直位移量

    if (swipeLength > threshold && swipeHLength < threshold) {  //判断是否水平滑动、是否超过阈值
      if (endX > startX && index > 0) {
        index--;
        slide(index*600);
      }
      if (endX < startX && index < len-1) {
        index++;
        slide(index*600);
      }
    }
  }, false);

  function slide(duration) {    //滑动函数
    var imgs = document.getElementById("imgs");
    $(imgs).animate({"left": -duration + "px"}, 400);
  }

  preloadImages();  //异步预加载图片

});

第四步:添加样式

使用CSS对图片显示的样式进行简单排版,然后对图片容器进行绝对定位。

#imgs img {
  float:left;
  width:600px;
  height:200px;
}

#imgs {
  position:absolute;
  left: 0px;
  top: 0px;
}

示例二:相册滑动特效

实现相册滑动特效需要使用JS异步实现图片的加载和手势滑动的监听,同时使用CSS对显隐以及动画效果进行控制。以下是详细步骤:

第一步:布局

使用HTML布局画面容器及包含着图片列表的DIV,图片数量根据需求自行添加。建议设置图片宽度,以便于控制样式。

<div id="photos">
  <ul id="photo-list">
    <li><img src="images/1.jpg"></li>
    <li><img src="images/2.jpg"></li>
    <li><img src="images/3.jpg"></li>
    <li><img src="images/4.jpg"></li>
    <li><img src="images/5.jpg"></li>
    <li><img src="images/6.jpg"></li>
    <li><img src="images/7.jpg"></li>
    <li><img src="images/8.jpg"></li>
    <li><img src="images/9.jpg"></li>
  </ul>
</div>

第二步:JS异步加载图片

使用异步加载方法,将用于滑动的图片先预加载,以便于在滑动时不需要等待图片加载完毕。

var imgs = new Array();
var imgUrls = ["images/1.jpg", "images/2.jpg", "images/3.jpg", "images/4.jpg", "images/5.jpg", "images/6.jpg", "images/7.jpg", "images/8.jpg", "images/9.jpg"];

function preloadImages() {
  for (i = 0; i < imgUrls.length; i++) {
    imgs[i] = new Image();
    imgs[i].src = imgUrls[i];
    imgs[i].onload = function() {
      console.log(i);
    };
  }
}

第三步:处理手势滑动

使用原生JS处理滑动事件,需要对滑动容器添加 touchstart、touchmove、touchend三大事件监听器,并对其中的坐标位置信息进行处理,计算出滑动方向和速度。滑动过程中需要动态设置图片列表的left值。

$(function() {
  var startX, endX, dist, tmp, el_photos, li_photos, len_li, i, j, l;

  function init() {
    el_photos = document.getElementById("photos");
    li_photos = el_photos.getElementsByTagName('li');
    len_li = li_photos.length;
    l = 0;  //初始位置下标为0;
    el_photos.addEventListener('touchstart', function(e) {
      startX = e.touches[0].pageX;
      startY = e.touches[0].pageY;
      el_photos.style.transition = 'all 0s';
      dist = 0;    //滑动距离为0
    }, false);
    el_photos.addEventListener('touchmove', function(e) {
      e.preventDefault();
      endX = e.touches[0].pageX;
      dist = endX-startX;     //滑动距离
      el_photos.style.left = (-l*2*10 + dist/2) + 'vw';    //滑动距离为dist的1/10
    }, false);
    el_photos.addEventListener('touchend', function(e) {
      if (dist < -20) {  // 向左滑
        l++;
        tmp = setTimeout(function() {
          el_photos.style.transition = 'all 0.3s';
          el_photos.style.left = (-l*20) + 'vw';    //设置动态过渡效果         
        }, 100);
      } else if (dist > 20) {  // 向右滑
        l--;
        tmp = setTimeout(function() {
          el_photos.style.transition = 'all 0.3s';
          el_photos.style.left = (-l*20) + 'vw';
        }, 100);
      } else {
        el_photos.style.left = (-l*20) + 'vw';
      }
    }, false);
  }

  preloadImages();
  init();
});

第四步:添加样式

使用CSS对图片显示的样式进行简单排版,然后对图片容器进行绝对定位。

#photos {
  width: 100vw;
  overflow: hidden;
  position: relative;
}

#photo-list {
  width: calc(200% - (2 * 2vw));
  left: 0;
  position: absolute;
  margin: 0;
  padding: 0;
  list-style: none;
  white-space: nowrap;
  font-size: 0;
  z-index: -1;
}

#photo-list li {
  display: inline-block;
  width: 20vw;
  min-height: calc((100vw - 4vw) / 3);
  margin-right: 2vw;
  margin-left: 2vw;
  transition: all 0.3s;
}

#photo-list li:last-child {
  margin-right: 0;
}

至此,我们就完成了基于原生JS的移动开发轮播图、相册滑动特效。在实现过程中,需要理解手势的概念以及JS异步处理的方法。通过练习这种类型的小案例,可以帮助我们更好地掌握WenApp的特性和实现机制,从而更好地进行移动开发。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:原生js实现移动开发轮播图、相册滑动特效 - Python技术站

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

相关文章

  • JS组件Bootstrap导航条使用方法详解

    JS组件Bootstrap导航条使用方法详解 Bootstrap是一个流行的前端框架,为开发Web应用程序提供了大量的组件和工具。其中,导航条是一个非常重要的组件,它可以帮助用户快速浏览网站的不同部分。本文将详细讲解Bootstrap导航条的使用方法。 首先导入Bootstrap库 导航条是Bootstrap库的一部分,因此首先需要导入Bootstrap库。…

    css 2023年6月10日
    00
  • CSS布局最常见的八条错误小结

    当我们进行网页布局时,经常会出现布局排版不协调的情况。以下是CSS布局最常见的八条错误小结及其解决方法: 1. 错误的盒子模型 盒子模型指元素的所有内容都在一个盒子里面,包括边框、内边距、外边距、宽度、高度等属性。在CSS中,有两种盒子模型:标准盒子模型和IE盒子模型。 解决方法:选择标准盒子模型,即使用box-sizing: border-box;属性将所…

    css 2023年6月9日
    00
  • 详解八种方法实现CSS页面底部固定

    我很乐意为您讲解“详解八种方法实现CSS页面底部固定”的完整攻略。 详解八种方法实现CSS页面底部固定 在开发网页时,经常会遇到需要将底部固定在页面底部的需求。下面介绍八种CSS方法可以实现底部固定的效果。 方法1:使用绝对定位 这是最简单的一种方法,只需设置底部的样式为绝对定位,距离底部为0即可。 footer{ position: absolute; b…

    css 2023年6月9日
    00
  • Vue3 style CSS 变量注入的实现

    让我为您详细讲解一下“Vue3 style CSS 变量注入的实现”的完整攻略。 什么是 Vue3 style CSS 变量注入 在 Vue3 中,我们可以利用 CSS 变量注入 的方式来为组件注入样式,本质上就是通过 Vue3 提供的 $attrs 和 style 属性处理方式,将常量化的 CSS 变量写入到 Vue3 的虚拟 DOM 中。 这种方式比起之…

    css 2023年6月10日
    00
  • 利用CSS3实现文本框的清除按钮相关的一些效果

    下面我将为你详细讲解“利用CSS3实现文本框的清除按钮相关的一些效果”的完整攻略。 1. 实现过程 实现文本框的清除按钮效果可以通过CSS3的伪元素和样式组合来实现。首先需要在文本框中添加一个用于清除文本的按钮,然后添加一些CSS3样式以实现有关的效果。 1.1 添加清除按钮 在HTML代码中,需要在文本框后面添加一个按钮,这个按钮用于清除文本框中的内容。代…

    css 2023年6月10日
    00
  • IE7 float:left左浮动失效的解决方法

    下面是解决IE7 float:left左浮动失效的完整攻略。 问题描述 在IE7浏览器下,可能会出现float:left左浮动无法生效的问题,导致页面样式错乱。这是由于IE7存在兼容性问题所致。 解决方法 方法一:添加“display:inline” 在浮动元素的样式中,添加“display:inline”属性,可以修复IE7下浮动失效的问题。 示例代码: …

    css 2023年6月10日
    00
  • CSS设置DIV背景色渐变显示兼容IE/火狐/谷歌

    实现CSS设置DIV背景色渐变显示是很重要的网页设计需求。在这里,我们将提供一些基本操作步骤,以兼容IE、火狐和谷歌三种常用浏览器。 1. 使用CSS3渐变 CSS3渐变是为CSS3新技术提供的解决方案,其语法如下所示: background:linear-gradient(to right, #0000ff, #00ff00, #ff0000) 其中,to…

    css 2023年6月9日
    00
  • div浮层,滚动条移动,位置保持不变的4种方法汇总

    这里是”div浮层,滚动条移动,位置保持不变的4种方法汇总”的完整攻略: 1. 使用css position属性 当我们在使用 div浮层、滚动条移动等效果时,我们通常会使用css position属性。position属性有多个值,但是常见的是”fixed”和”absolute”。- “fixed” : 固定在页面的某个位置,即使滚动条移动也不会改变位置,…

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