怎样用H5完成1个触摸屏版的轮播器的案例

日期:2021-02-24 类型:科技新闻 

关键词:快速建站,网站建设系统,免费网页建站,网站免费建设,建站系统

初入前端开发,共享1着手机上触摸屏版轮播器的完成全过程,大概作用以下:

1、适用循环系统拖动

2、宽度可随意设定,不必须与显示屏等宽

3、网页页面可纵向翻转

4、可设定回调函数监视元素的切换

5、纯js,不依靠任何第3方库

基本原理

1、假定子元素.item的width为375px,应用肯定精准定位将全部子元素放在父元素内

2、将父元素.carousel的width设定为375px,与子元素.item宽度同样

3、为父元素.carousel加上触碰恶性事件:touchstart, touchmove, touchend

4、手指按下时,储存原始部位(clientX)

5、手指拖动时,根据拖动间距分辨拖动的方位:

①手指向左划动,则另外挪动当今元素和当今元素右侧的元素

②手指向右划动,则另外挪动当今元素和当今元素左侧的元素

6、手指抬起时,根据拖动间距分辨是不是切换到下1页

①挪动间距未超出子元素宽度的50%,将当今网页页面回退到原始部位,不切换当今元素。

②挪动间距超出子元素宽度的50%,切换当今元素为下1个元素。

③将当今元素的transform特性设定为translate3d(0px, 0px, 0px),并将z-index特性+1

④将下1个子元素的transform特性设定为translate3d(375px, 0px, 0px),并将z-index特性+1

⑤将上1个子元素的transform特性设定为translate3d(⑶75px, 0px, 0px),并将z-index特性+1

⑥将别的全部子元素的z-index特性设定为默认设置值

7、第1个子元素的上1个元素是最终1个元素,最终1个元素的下1个元素是第1个元素,该流程根据循环系统链表完成。

挪动时设定的是子元素.item的transform特性,而并不是父元素.carousel

完成流程

html&css

//html
<div class="carousel" ontouchstart="" >  
  <div class="item" style="background: #3b76c0" >    
    <h3 >item⑴</h3>  
  </div>  
  <div class="item" style="background: #58c03b;">    
    <h3>item⑵</h3>  
  </div>  
  <div class="item" style="background: #c03b25;">    
    <h3>item⑶</h3>
  </div> 
  <div class="item" style="background: #e0a718;">  
    <h3>item⑷</h3>  
  </div>  
  <div class="item" style="background: #c03eac;">    
    <h3>item⑸</h3>  
  </div>
</div>
//css
.carousel{
  height: 50%;
  position: relative;
  overflow: hidden;
}

.item {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
}

js

设定原始情况

最先完成1个双重链表,用于维护保养轮播组件中的元素。

function Node(data) {
    this.data = data;
    this.prev = null;
    this.next = null;
    this.index = ⑴;
}

//双重循环系统目录
function LinkList() {
    var _nodes = [];
    this.head = null;
    this.last = null;

    if (typeof this.append !== "function") {
        LinkList.prototype.append = function (node) {
            if (this.head == null) {
                this.head = node;
                this.last = this.head;
            }
            else {
                this.head.prev = node;
                this.last.next = node;

                node.prev = this.last;
                node.next = this.head;

                this.last = node;
            }

            node.index = _nodes.length; //尽量在push前设定node.index
            _nodes.push(node);
        }
    }
}

有了链表以后,建立1个链表案例,将子元素加上进链表内,并设定1些原始情况

var _container = document.querySelector("." + containerClass);
var _items = document.querySelectorAll("." + itemClass);

var list = loop ? new LinkList() : new SingleList();
for(var i = 0; i < _items.length; i++) {
  list.append(new Node(_items[i]));
}

var _prev = null;  //储存以前显示信息的元素
var _current = list.head;  //储存当今显示信息的元素,默认设置为第1个元素

var _normalZIndex = _current.data.style.zIndex;  //未显示信息元素的z-index值
var _activeZIndex = _normalZIndex + 1;  //当今显示信息元素的z-index值

var _itemWidth = _current.data.offsetWidth; //子元素宽度

positionItems(); //原始化元素部位
zindexItems(_current, _activeZIndex); //将当今元素及其上下元素的z-index加1

关联触碰恶性事件

touchstart恶性事件

手指按下时,储存原始部位

_container.addEventListener("touchstart", function(e) {
  // e.preventDefault();//撤销此行编码的注解会在该元素内阻拦网页页面纵向翻转
  var touch = e.touches[0];
  startX = touch.clientX;   //储存手指按下时的部位
  startY = touch.clientY;
  _container.style.webkitTransition = ""; //撤销动漫实际效果
  startT = new Date().getTime();          //纪录手指按下的刚开始時间
  isMove = false;
  transitionItems(_prev, false);             //撤销以前元素的过渡
  transitionItems(_current, false);          //撤销当今元素的过渡
}, false);

touchmove恶性事件

手指在显示屏上拖动,网页页面追随手指挪动

_container.addEventListener("touchmove", function(e) {
    // e.preventDefault();//撤销此行编码的注解会在该元素内阻拦网页页面纵向翻转
    var touch = e.touches[0];
    var deltaX = touch.clientX - startX;  //测算手指在X方位拖动的间距
    var deltaY = touch.clientY - startY;  //测算手指在Y方位拖动的间距
    //假如X方位上的位移超过Y方位,则觉得是上下拖动
    if (Math.abs(deltaX) > Math.abs(deltaY)){
        translate = deltaX > _itemWidth ? _itemWidth : deltaX;
        translate = deltaX < -_itemWidth ? -_itemWidth : deltaX;

        //另外挪动当今元素及其上下元素
        moveItems(translate); 

        isMove = true;
    }
}, false);

touchend恶性事件

手指离去显示屏时,测算最后必须滞留在哪儿1页

_container.addEventListener("touchend",function(e) {
    // e.preventDefault();//撤销此行编码的注解会在该元素内阻拦网页页面纵向翻转

    //是不是会滚
    var isRollback = false;

    //测算手指在显示屏上滞留的時间
    var deltaT = new Date().getTime() - startT;
    if (isMove) { //产生了上下拖动
        //假如滞留時间小于300ms,则觉得是迅速拖动,不管拖动间距是是多少,都滞留到下1页
        if(deltaT < 300){
            translate = translate < 0 ? -_itemWidth : _itemWidth;
        }else {
            //假如拖动间距小于显示屏的50%,则退返回上1页
            if (Math.abs(translate) / _itemWidth < 0.5){
                isRollback = true;
            }else{
                //假如拖动间距超过显示屏的50%,则拖动到下1页
                translate = translate < 0 ? -_itemWidth : _itemWidth;
            }
        }

        moveTo(translate, isRollback);
    }
}, false);

Carousel库

以便便捷应用,我将全部完成全过程封裝变成1个库,并加上了prev(), next()方式,应用十分简易:

<script src="lib/carousel.js"></script>

CreateCarousel("carousel", "item", true)
  .bindTouchEvent()
  .setItemChangedHandler(onPageChanged);

//主要参数"carousel"为器皿的类名
//主要参数"item"为子元素的类名
//第3个主要参数设定是不是必须循环系统播发,true为循环系统播发

该库免费下载详细地址:http://xiazai.jb51.net/201701/yuanma/Carousel_jb51.rar

以上便是本文的所有內容,期待对大伙儿的学习培训有一定的协助,也期待大伙儿多多适用脚本制作之家。