Home >Web Front-end >H5 Tutorial >H5 implements touch screen version of carousel

H5 implements touch screen version of carousel

php中世界最好的语言
php中世界最好的语言Original
2018-03-26 14:20:581600browse

This time I will bring you the H5 touch-screen version of the carousel. What are the precautions for H5 to implement the touch-screen version of the carousel. The following is a practical case, let's take a look.

I am new to the front-end and would like to share the implementation process of the touch screen version of the carousel on the mobile phone. The general functions are as follows:

1. Support circular sliding

2. The width can be arbitrary Settings do not need to be the same width as the screen

3. The page can be scrolled vertically

4. Callbacks can be set to monitor the switching of elements

5. Pure js, without any third party Third-party library

Principle

1. Assume that the width of the sub-element .item is 375px, use absolute positioning to move all Place the child element inside the parent element

2. Set the width of the parent element .carousel to 375px, which is the same width as the child element .item

3. Add a touch event to the parent element .carousel: touchstart, touchmove, touchend

4. When the finger is pressed, save the initial position (clientX)

5. When the finger slides, the sliding direction is determined by the sliding distance:

① Swipe your finger to the left to move the current element and the element to the right of the current element at the same time

② Swipe your finger to the right to move the current element and the element to the left of the current element at the same time

6. Lift your finger When starting, use the sliding distance to determine whether to switch to the next page

①If the moving distance does not exceed 50% of the width of the child element, the current page will be rolled back to the initial position without switching the current element.

②The movement distance exceeds 50% of the width of the child element, and the current element is switched to the next element.

③Set the transform attribute of the current element to translate3d(0px, 0px, 0px), and set the z-index attribute +1

④Set the transform attribute of the next child element to translate3d (375px, 0px, 0px), and set the z-index attribute +1

⑤Set the transform attribute of the previous child element to translate3d(-375px, 0px, 0px), and set the z-index attribute +1 1

⑥Set the z-index attribute of all other child elements to the default value

7. The previous element of the first child element is the last element, and the next element of the last element The element is the first element, and this step is implemented through a circular linked list.

When moving, the transform attribute of the child element .item is set, not the parent element .carousel

Implementation steps

html&css

//html
<p class="carousel" ontouchstart="" >  
  <p class="item" style="background: #3b76c0" >    
    <h3 >item-1</h3>  
  </p>  
  <p class="item" style="background: #58c03b;">    
    <h3>item-2</h3>  
  </p>  
  <p class="item" style="background: #c03b25;">    
    <h3>item-3</h3>
  </p> 
  <p class="item" style="background: #e0a718;">  
    <h3>item-4</h3>  
  </p>  
  <p class="item" style="background: #c03eac;">    
    <h3>item-5</h3>  
  </p>
</p>
//css
.carousel{
  height: 50%;
  position: relative;
  overflow: hidden;
}
.item {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
}

js

Set the initial state

First implement a two-way linked list to maintain the elements in the carousel component.

function Node(data) {
    this.data = data;
    this.prev = null;
    this.next = null;
    this.index = -1;
}
//双向循环列表
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);
        }
    }
}

After you have the linked list, create a linked list instance, add child elements to the linked list, and set some initial states

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;  //保存当前显示的元素,默认为第一个元素
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

Bind touch events

touchstart event

When the finger is pressed, the initial position is saved

_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 event

The finger is on the screen Sliding, the page moves with the finger

_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 event

When the finger leaves the screen, calculate which page it needs to stay on

_container.addEventListener("touchend",function(e) {
    // e.preventDefault();//取消此行代码的注释会在该元素内阻止页面纵向滚动
    //是否会滚
    var isRollback = false;
    //计算手指在屏幕上停留的时间
    var deltaT = new Date().getTime() - startT;
    if (isMove) { //发生了左右滑动
        //如果停留时间小于300ms,则认为是快速滑动,无论滑动距离是多少,都停留到下一页
        if(deltaT < 300){
            translate = translate < 0 ? -_itemWidth : _itemWidth;
        }else {
            //如果滑动距离小于屏幕的50%,则退回到上一页
            if (Math.abs(translate) / _itemWidth < 0.5){
                isRollback = true;
            }else{
                //如果滑动距离大于屏幕的50%,则滑动到下一页
                translate = translate < 0 ? -_itemWidth : _itemWidth;
            }
        }
        moveTo(translate, isRollback);
    }
}, false);

Carousel library

For the convenience of use, I encapsulated the entire implementation process into a library and added the prev() and next() methods. It is very simple to use:

<script src="lib/carousel.js"></script>
CreateCarousel("carousel", "item", true)
  .bindTouchEvent()
  .setItemChangedHandler(onPageChanged);
//参数"carousel"为容器的类名
//参数"item"为子元素的类名
//第三个参数设置是否需要循环播放,true为循环播放

Believe it After reading the case in this article, you have mastered the method. For more exciting information, please pay attention to other related articles on the PHP Chinese website!

Recommended reading:

zepto realizes seamless scrolling up and down on the mobile terminal

What are the methods for H5 form verification

The above is the detailed content of H5 implements touch screen version of carousel. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn