<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
npm install smoothscroll-polyfill --save
npm i --save-dev @types/smoothscroll-polyfill
import React, { useRef, useState, useEffect } from 'react' import './index.less' import smoothscroll from 'smoothscroll-polyfill' interface List { id: string, text: string } export default () => { const [ButtonList] = useState<List[]>( [ { id: 'n1', text: '推薦' }, { id: 'n2', text: '女裝' }, { id: 'n3', text: '運動' }, { id: 'n4', text: '美妝' }, { id: 'n5', text: '男裝' }, { id: 'n6', text: '鞋靴' }, { id: 'n7', text: '數碼' }, { id: 'n8', text: '母嬰' }, { id: 'n9', text: '家電' }, { id: 'n10', text: '國際' }, ] ); const [ContentList] = useState<List[]>( [ { id: 'c1', text: '推薦' }, { id: 'c2', text: '女裝' }, { id: 'c3', text: '運動' }, { id: 'c4', text: '美妝' }, { id: 'c5', text: '男裝' }, { id: 'c6', text: '鞋靴' }, { id: 'c7', text: '數碼' }, { id: 'c8', text: '母嬰' }, { id: 'c9', text: '家電' }, { id: 'c10', text: '國際' }, ] ); // ref const navLine = useRef<HTMLDivElement>(null) const tabRef = useRef<HTMLDivElement>(null) const navListParent = useRef<HTMLDivElement>(null) const contentScrollWrap = useRef<HTMLDivElement>(null) const GetContentScrollWrap = () => { return contentScrollWrap.current as HTMLDivElement } const GetTabRef = () => { return tabRef.current as HTMLDivElement } const GetNavLine = () => { return navLine.current as HTMLDivElement } const GetNavListPart = () => { return navListParent.current as HTMLDivElement } // 變數 let swiperStartX: number = 0 let swiperMoveX: number = 0 let num: number = 0 let date: number = 0 let startX: number = 0 let flag: boolean = false // 狀態 const [Index, setIndex] = useState<number>(0) const [swiperItemWidth, setContentListWidth] = useState<number>(0) const [tabItemWidth, setNavListWidth] = useState<number>(0) const Cut = (key: number) => { setIndex(key); } const FnStart = (e: React.TouchEvent) => { date = Date.now() num = 0 GetContentScrollWrap().style.transition = 'none' swiperStartX = GetContentScrollWrap().offsetLeft - e.changedTouches[0].pageX; startX = e.changedTouches[0].pageX; GetContentScrollWrap().ontouchmove = FnMove; } const FnMove = (e: TouchEvent) => { swiperMoveX = e.changedTouches[0].pageX; if (num === 0) { flag = true } num++ if (GetContentScrollWrap().offsetLeft > 0 || GetContentScrollWrap().offsetLeft < -swiperItemWidth * (ButtonList.length - 1)) return false if (flag) { GetContentScrollWrap().style.left = swiperMoveX + swiperStartX + 'px' GetContentScrollWrap().ontouchend = FnEnd; } } const FnEnd = (e: TouchEvent) => { flag = false; // let num = Index GetContentScrollWrap().style.transition = 'left .3s linear' if (Math.abs(startX - e.changedTouches[0].pageX) > swiperItemWidth / 2 || Date.now() - date < 300) { // if (startX - e.changedTouches[0].pageX < 0) { // if (Index > 0) { // num = Index - 1 // } else { // num = 0 // } // } else if (Index + 1 > ButtonList.length - 1) { // num = ButtonList.length - 1 // } else { // num = Index + 1 // } // setIndex(num) setIndex(startX - e.changedTouches[0].pageX < 0 ? Index > 0 ? Index - 1 : 0 : Index + 1 > ButtonList.length - 1 ? ButtonList.length - 1 : Index + 1) } GetContentScrollWrap().style.left = -Index * swiperItemWidth + 'px' GetContentScrollWrap().ontouchmove = null; GetContentScrollWrap().ontouchend = null; } // 監聽Index useEffect(() => { let lineTo = tabItemWidth * Index; GetNavLine().style.transform = `translate3d(${lineTo}px,0,0)`; GetNavLine().style.transition = '.1s'; //控制tab捲動 let tabTo = lineTo - tabItemWidth; GetTabRef().scrollTo({ left: tabTo, behavior: "smooth" }); GetTabRef().style.transition = '.5s'; // 控制swiper捲動 let swiperTo = swiperItemWidth * Index; GetContentScrollWrap().style.left = -swiperTo + 'px'; GetContentScrollWrap().style.transition = '.5s'; }, [Index]); // 解決行動端 scrollTo 的 behavior: "smooth" 無效的問題 useEffect(() => { smoothscroll.polyfill(); // swiper元素寬度 setContentListWidth((GetContentScrollWrap().children[0] as HTMLDivElement).offsetWidth) // nav列表寬度 setNavListWidth((GetNavListPart().children[0] as HTMLDivElement).offsetWidth) }, []) return ( <div className="v-home-wrap"> <div className='nav-wrap' ref={tabRef}> <div className="nav" ref={navListParent}> {ButtonList.map((item, index) => <div key={item.id} onClick={() => Cut(index)} className={Index === index ? "nav-list ac" : "nav-list"}>{item.text}</div> )} <div className="nav-line" ref={navLine}></div> </div> </div> <div className="content-wrap"> <div className="content" onTouchStart={FnStart} ref={contentScrollWrap}> {ContentList.map((item, index) => <div className='content-list' key={item.id}>{item.text}</div> )} </div> </div> </div> ) }
.v-home-wrap { touch-action: none; .nav-wrap { width: 100%; overflow-x: scroll; background: #f74077; .nav { padding: 0 20px; display: flex; align-items: center; justify-content: space-between; // min-width: 132vw; color: #fff; position: relative; height: 82px; .nav-list { // box-sizing: border-box; display: inline-block; font-size: 28px; padding: 0 18px; min-width: 75px; } .nav-list.ac { font-size: 34px; } .nav-line { position: absolute; width: 40px; height: 6px; background-color: #f9e2e8; border-radius: 2px; left: 45px; bottom: 0; // transition: all 1s; } } } .nav-wrap::-webkit-scrollbar { display: none; } .content-wrap { // overflow-x: scroll; overflow: hidden; height: 70vh; position: relative; left: 0; .content { min-width: 1000%; display: flex; height: 80vh; // overflow-x: scroll; position: absolute; .content-list { // white-space:nowrap; // display: inline-block; height: 80vh; // overflow-y: scroll; width: 100vw; font-size: 50px; text-align: center; color: #fff; } .content-list:nth-child(2n) { background: red; } .content-list:nth-child(2n-1) { background: blue; } } } }
到此這篇關於ReactHooks+ts(函陣列件)原生輪播的文章就介紹到這了,更多相關ReactHooks輪播內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45