React 类组件 + Ts 简易无缝轮播图

index.tsx文件

import React, { Component, createRef } from 'react';
import './index.less'
class index extends Component {
    box = createRef<HTMLDivElement>()
    getbox = () => this.box.current as HTMLDivElement;
    disx: number = 0
    x: number = 0
    index: number = 0
    list = [4, 1, 2, 3, 4, 1]
    fnStart(ev: React.TouchEvent) {   
        this.getbox().style.transition = 'null';
        if (this.index === 5) this.index = 1;
        if (this.index === 0) this.index = 4;
        this.disx = ev.changedTouches[0].pageX;
        this.getbox().ontouchmove = this.fnMove.bind(this)
        this.getbox().ontouchend = this.fnEnd.bind(this)
    }
    fnMove(ev: TouchEvent) {
        this.x = ev.changedTouches[0].pageX - this.disx;
        this.getbox().style.left = this.index * -100 + this.x / 10 + 'vw'

    }
    fnEnd() {
        this.getbox().style.transition = '.3s all';

        if (this.x < -150) this.index++
        if (this.x > 150) this.index--
        this.x = 0
        this.getbox().style.left = this.index * -100 + 'vw'
    }

    render() {
        return (
            <div className='slider'>
                <div className="slider-box">
                    <div className="list-item" ref={this.box}>
                        {
                            this.list.map((item, index) => <div key={index}
                                onTouchStart={this.fnStart.bind(this)}
                            >{item}</div>)
                        }
                    </div>
                </div>
            </div>
        );
    }
}

export default index;

index.less

.slider {
    width: 100vw;
    height: 100vh;
    display: flex;
    flex-direction: column;
        .slider-box {
            display: flex;
            position: absolute;
            overflow: hidden;
            height: 81%;
            width: 100vw;      
            .list-item {
                transition: 0.3s all;
                display: flex;
                position: absolute;
                left: 0vw;
                height: 81%;

                >div:nth-child(2n-1) {
                    background-color: rgb(216, 56, 56);
                }
                >div:nth-child(2n) {
                    background-color: rgb(31, 140, 186);
                }
                div {
                    text-align: center;
                    font-size: 50px;
                    line-height: 80px;
                    width: 100vw;
                    height: 40%;
                }
            }
        }
    
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值