原生JS实现移动端的轮播效果
首先 我们想实现的效果是在手指按下拖动的时候图片能够跟随移动(无动画效果)然后松开手指后判断图片移动的位置 和某一个值进行比较
在这里我们默认定为盒子的1/3宽度 当x轴的移动位置大于1/3的时候图片切换到下一张或者上一张(此时需要有动画效果)
当图片移动位置小于1/3的时候 抬起手指的图片回到原位( 此时也有动画效果) 具体代码如下
布局就是简单的长列形式 让最外层的banner固定宽多余的隐藏 ul的宽度这足够大 通过移动ul的left值实现图片的移动 基本上就是PC 端的左右轮播
HTML 部分
<div class="banner">
<ul>
<li><img src="./app/img/1.jpg" alt=""></li>
<li><img src="./app/img/2.jpg" alt=""></li>
<li><img src="./app/img/3.jpg" alt=""></li>
<li><img src="./app/img/4.jpg" alt=""></li>
<li><img src="./app/img/5.jpg" alt=""></li>
<li><img src="./app/img/6.jpg" alt=""></li>
</ul>
</div>
CSS 部分
main .banner {
width: 100%;
height: 4.58667rem;
overflow: hidden;
margin-top: 0.05333rem;
position: relative;
} main .banner ul {
width: 600%;
height: 4.58667rem;
display: flex;
position: absolute;
left:;
} main .banner ul li {
width: 100%;
height: 4.58667rem;
} main .banner ul li img {
width: 100%;
height: 100%;
}
JS 部分
/**
* @function[此函数作用封装手机端轮播]
* 此题需主要几个点 首先加transition : all 1s linear;是放在css中 后来发现在拖着动的时候也有动画 为了不让拖着动的
* 时候有动画 于是采用translate 与left相结合的方法实现 但是很快又发现两个位置会出现叠加问题 然后哦嘛噶出现各种归零及
* 恢复当前位置的死循坏中了 最后还是放弃了 然后用left 在用到的用style加上动画效果 不需要的地方再把动画取消了 这样
* 就能达到我们需要的效果了
*
* 做此题的思路是先做出无动画状态下的左后右滑图片能够相应的进行切换 接着添加上动画效果 然后在move事件中添加上
* 图片跟随的情况 接着判断第一张图片的右滑 和最后一张图片不能左滑的情况 这里建议多使用变量开关和if语句
* 不要使用一个if语句或者三木运算加上|| && !他们就行判断 不然容易晕
*
*/
class mySwiper {
constructor(opt) {
this.el = document.querySelector(opt.el); //盛放轮播最外层盒子
this.index = 0;
this.init()
}
init() {
this.touchEvent();
}
touchEvent() {
this.el.addEventListener("touchstart", Touch);
this.el.addEventListener("touchmove", Touch);
this.el.addEventListener("touchend", Touch);
let that = this;
let ul = this.el.querySelector("ul"); function Touch(e) {
switch (e.type) {
case "touchstart":
this.start = {
x: e.touches[0].clientX,
y: e.touches[0].clientY
}
// this.end = {
// x: 0,
// y: 0
// }
break;
case "touchmove":
this.end = {
x: e.touches[0].clientX,
y: e.touches[0].clientY
}
//在手指滑动的滑动距离赋值给这个图片滑动的距离 换句话说也是这个ul移动的距离
let flag1=false;
let flag2=false;
if(that.index==0){//在下标为1的时候切往右滑动的时候是不能让图片跟着移动的
//console.log((this.end.x-this.start.x)>0,"-----我在下标为0的时候滑动的方向")
if((this.end.x-this.start.x)>0){
flag1=true;
}
}
//同理 在下标为最后一个的时候切往左滑的是不能让图片移动的
//console.log((that.el.children),"----我在下标为最后一张")
if(that.index==(ul.children.length - 1)){
if((this.end.x-this.start.x)<0){
flag2=true;
}
}
let flag3=true;//第三个开关控制图片是不是能移动
//console.log(flag2)
if(flag1){
flag3=false;
}
if(flag2){
flag3=false;
}
if(flag3){
ul.style.transition = `top 1s linear`;
ul.style.left = `${-that.index*(that.el.offsetWidth)+(this.end.x-this.start.x)}px`;
}
break;
case "touchend":
if (this.end) {
if (this.end.y - this.start.y < 20) {
//在鼠标抬起的瞬间让left值为当前页所在的位置;
//再抬起的时候不要判断x轴方向 把其放在移动函数中进行判断
ul.style.transition = `all 1s linear`;
ul.style.left = `${-that.index*(that.el.offsetWidth)}px`;
that.move(this.end.x - this.start.x);
}
}
}
}
}
move(l) {
//l 是开始落下的位置和抬起的位置之间的差
let ul = this.el.querySelector("ul");
let w = this.el.offsetWidth;
console.log("滑动的距离太短 我还不能移动喽")
if (l < 0 && Math.abs(l) >= w / 3) { //如果l是负数 证明是在像右滑动 如果绝对值还大于一半的话就让其划过去
this.index++;
if (this.index >= ul.children.length - 1) {
this.index = ul.children.length - 1
}
console.log(this.index, "-------左滑");
ul.style.transition = `all 1s linear`;
ul.style.left = -this.index * w + "px"
//ul.style.transform = `translateX(${-this.index*w}px)`;
} if (l > w / 3) { //如果想左滑动的时候大于盒子的一半的话就让其把这个图片划过去 this.index--;
if (this.index < 0) {
this.index = 0;
}
console.log(this.index, "-------右滑")
ul.style.left = -this.index * w + "px";
ul.style.transition = `all 1s linear`;
// ul.style.transform = `translateX(${-this.index*w}px)`;
} }
}
原生JS实现移动端的轮播效果的更多相关文章
- 移动端图片轮播效果:depth模式总结
最近公司app改版首页增加了一处轮播图效果,但是跟普通的轮播效果不同,是类似于下图的样式,找了一些兼容移动端的插件以及jQuery源码,总结一下使用心得: 1:jquery源码:缺点是在手机端的滑动很 ...
- 原生js和jquery实现图片轮播特效
本文给大家分享的是使用原生JS和JQ两种方法分别实现相同的图片轮播特效,十分的实用,也非常方便大家对比学习原生js和jQuery,有需要的小伙伴可以参考下. 1)首先是页面的结构部分对于我这种左右切换 ...
- 原生js和jquery实现图片轮播特效(转)
本文给大家分享的是使用原生JS和JQ两种方法分别实现相同的图片轮播特效,十分的实用,也非常方便大家对比学习原生js和jQuery,有需要的小伙伴可以参考下. 1)首先是页面的结构部分对于我这种左右切换 ...
- 原生js实现一个简单的轮播图
想锻炼一下自己的原生js能力可以从写一个轮播图开始,轮播图的运用想必大家都知道吧,好了废话不多说,开始记笔记了,一些需要注意的点,我都在代码中标注了 首先是构造html: <div id=&qu ...
- 原生js一行代码实现简易轮播图
这是一个简易的js无限循环轮播图,只用了一行js代码就实现了无限循环,记录一下三目运算符的伟大! <!DOCTYPE html><html lang="en"&g ...
- 原生JS实现淘宝无缝轮播
<!DOCTYPE html ><html><head><meta http-equiv="Content-Type" content=& ...
- js 实现淘宝无缝轮播图效果,可更改配置参数 带完整版解析代码[slider.js]
前言: 本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽. 本篇文章为您分析一下原生JS写淘宝无缝轮播图效果 需求分析: ...
- CSS3图片轮播效果
原文:CSS3图片轮播效果 在网页中用到图片轮播效果,单纯的隐藏.显示,那再简单不过了,要有动画效果,如果是自己写的话(不用jquery等),可能要费点时间.css3的出现,让动画变得不再是问题,而且 ...
- Omi-touch实战 移动端图片轮播组件的封装
pc端的轮播,移动端的轮播都很常见.一年前,我还为手机端没有左滑,右滑事件从而封装了一个swipe库,可以自定义超过多少滑动时间就不触发,也可以设置滑动多少距离才触发,这一个功能的代码就达到400多行 ...
随机推荐
- Android常用的图片加载库
Android常用的图片加载库 前言:图片加载涉及到图片的缓存.图片的处理.图片的显示等.四种常用的图片加载框架,分别是Fresco.ImageLoader. Picasso. Glide. Uni ...
- 【转】Java中的多线程你只要看这一篇就够了
https://www.jianshu.com/p/40d4c7aebd66 引 如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的, ...
- linux oom-killer
本人从事UTM的开发工作,最近遇到out of memory killer.这里整理一下资料. 简述 当系统内存不足时,系统会触发 oom-killer.oom-killer的机制就是选择杀掉最适合的 ...
- 200. Number of Islands + 695. Max Area of Island
Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surro ...
- 薄弱的交互页面之新浪微博到博客的储存型xss漏洞
首先分享一片博文到微博,然后 在微博评论xss code 最后回到博客点击举报就触发xss了 点击举报 Xss之2 首先还是分享一片博文到微博,然后评论xsscode 回到我的博客个人中心,查看评论 ...
- 规约模式的ef拼接
public class LamadaExtention<Dto> where Dto : new() { private List<Expression> m_lstExpr ...
- Jenkins报错Caused: java.io.IOException: Cannot run program "sh" (in directory "D:\Jenkins\Jenkins_home\workspace\jmeter_test"): CreateProcess error=2, 系统找不到指定的文件。
想在本地执行我的python文件,我本地搭建了一个Jenkins,使用了execute shell来运行我的脚本,发现报错 [jmeter_test] $ sh -xe D:\tomcat\apach ...
- websphere部署中文乱码问题
WebSphere上面的java虚拟机存在默认编码方式,默认为ISO-8859-1. 在JAVA虚拟机的定制属性页面上,添加如下内容: 1.修改服务器编码类型: (1)前台修改方法: 服务器-> ...
- Mycat数据库中间件对Mysql读写分离和分库分表配置
Mycat是一个开源的分布式数据库系统,不同于oracle和mysql,Mycat并没有存储引擎,但是Mycat实现了mysql协议,前段用户可以把它当做一个Proxy.其核心功能是分表分库,即将一个 ...
- 日期时间JS插件
首先要引入基本文件:bootstrap的基本js和css文件,因为用到了jquery所以要引入jquery文件 <script src="jquery-1.11.2.min.js&qu ...