taro scroll tabs

滚动标签 切换

https://www.cnblogs.com/lml-lml/p/10954069.html

https://developers.weixin.qq.com/community/develop/doc/000cc0b94ac5f8dcf4e7666475b804

https://blog.csdn.net/weixin_42860683/article/details/83817925

https://juejin.im/post/5d563b5e6fb9a06b317b5d20

taro


import Taro, {
Component,
} from '@tarojs/taro'
import {
View,
Text,
ScrollView,
} from '@tarojs/components' import classnames from 'classnames'
import './TabList.scss' export default class TabList extends Component {
state = {
active: 0,
} componentWillMount() {
this.setState({
active: this.props.current || 0,
})
} componentDidMount() { } componentWillReceiveProps(nextProps) {
const { current } = nextProps
if (current !== this.props.current) {
this.setState({
active: current,
})
}
} onSelectTab(index) {
this.setState({
active: index,
})
this.props.onSelected && this.props.onSelected(index)
} render() {
let { tabs, tabItemStyle, scrollWithAnimation } = this.props
let { active } = this.state
return (
tabs.length && <ScrollView className="tab-list" scrollX scrollWithAnimation={scrollWithAnimation}
scrollIntoView={`tab-${active >= 2 ? (active - 2) : 0}`}
>
<View className="tab-list__container">
{
tabs.map((item, index) => {
return (
<View style={tabItemStyle} className={classnames([
'tab-item',
{
active: active === index,
},
])} onClick={this.onSelectTab.bind(this, index)} key={index} id={`tab-` + index}
>
<Text>{item.name}</Text>
<View className="tab-line"></View>
</View>
)
})
}
</View> </ScrollView>
)
}
}
TabList.defaultProps = {
tabs: [],
current: 0,
tabItemStyle: 'height:78rpx',
scrollWithAnimation: process.env.TARO_ENV === 'weapp',
}

scroll tab 组件

开发一个可以滚动的tab组件

https://github.com/ScoutYin/ly-tab#readme

https://github.com/ScoutYin/ly-tab/tree/master/src

https://www.cnblogs.com/lml-lml/p/10954069.html

window.requestAnimationFrame

animation


export function windowInit () {
var lastTime = 0
var vendors = ['webkit', 'moz']
for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame']
window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || // name has changed in Webkit
window[vendors[x] + 'CancelRequestAnimationFrame']
} if (!window.requestAnimationFrame) {
window.requestAnimationFrame = function (callback, element) {
var currTime = new Date().getTime()
var timeToCall = Math.max(0, 16.7 - (currTime - lastTime))
var interval = currTime - lastTime
var id = window.setTimeout(function () {
callback(interval)
}, timeToCall)
lastTime = currTime + timeToCall
return id
}
}
if (!window.cancelAnimationFrame) {
window.cancelAnimationFrame = function (id) {
clearTimeout(id)
}
}
}

touch event


methods: {
// start
handleTouchStart (event) {
event.stopPropagation()
cancelAnimationFrame(this.inertiaFrame)
this.lastX = event.touches[0].clientX
},
// move
handleTouchMove (event) {
if (this.listWidth <= 0) return
event.preventDefault()
event.stopPropagation()
this.touching = true
this.startMoveTime = this.endMoveTime
this.startX = this.lastX
this.currentX = event.touches[0].clientX
this.moveFollowTouch()
this.endMoveTime = event.timeStamp // 每次触发touchmove事件的时间戳;
},
// end
handleTouchEnd (event) {
this.touching = false
if (this.checkReboundX()) {
cancelAnimationFrame(this.inertiaFrame)
} else {
let silenceTime = event.timeStamp - this.endMoveTime
let timeStamp = this.endMoveTime - this.startMoveTime
timeStamp = timeStamp > 0 ? timeStamp : 8
if (silenceTime > 100) return // 停顿时间超过100ms不产生惯性滑动;
this.speed = (this.lastX - this.startX) / timeStamp
this.acceleration = this.speed / this.sensitivity
this.frameStartTime = new Date().getTime()
this.inertiaFrame = requestAnimationFrame(this.moveByInertia)
}
},
// 如果需要回弹则进行回弹操作并返回true;
checkReboundX () {
this.reBounding = false
if (this.translateX > 0) {
this.reBounding = true
this.translateX = 0
} else if (this.translateX < -this.listWidth) {
this.reBounding = true
this.translateX = -this.listWidth
}
return this.translateX === 0 || this.translateX === -this.listWidth
},
bindEvent () {
this.$el.addEventListener('touchstart', this.handleTouchStart, false)
this.$el.addEventListener('touchmove', this.handleTouchMove, false)
this.$el.addEventListener('touchend', this.handleTouchEnd, false)
},
removeEvent () {
this.$el.removeEventListener('touchstart', this.handleTouchStart)
this.$el.removeEventListener('touchmove', this.handleTouchMove)
this.$el.removeEventListener('touchend', this.handleTouchEnd)
},
// touch拖动
moveFollowTouch () {
if (this.isMoveLeft) { // 向左拖动
if (this.translateX <= 0 && this.translateX + this.listWidth > 0 || this.translateX > 0) {
this.translateX += this.currentX - this.lastX
} else if (this.translateX + this.listWidth <= 0) {
this.translateX += this.additionalX * (this.currentX - this.lastX)
/ (this.viewAreaWidth + Math.abs(this.translateX + this.listWidth))
}
} else { // 向右拖动
if (this.translateX >= 0) {
this.translateX += this.additionalX * (this.currentX - this.lastX)
/ (this.viewAreaWidth + this.translateX)
} else if ((this.translateX <= 0 && this.translateX + this.listWidth >= 0) ||
this.translateX + this.listWidth <= 0) {
this.translateX += this.currentX - this.lastX
}
}
this.lastX = this.currentX
},
// 惯性滑动
moveByInertia () {
this.frameEndTime = new Date().getTime()
this.frameTime = this.frameEndTime - this.frameStartTime
if (this.isMoveLeft) { // 向左惯性滑动;
if (this.translateX <= -this.listWidth) { // 超出边界的过程;
// 加速度指数变化;
this.acceleration *= (this.reBoundExponent +
Math.abs(this.translateX + this.listWidth)) /
this.reBoundExponent
this.speed = Math.min(this.speed - this.acceleration, 0) // 为避免减速过程过短,此处加速度没有乘上frameTime;
} else {
this.speed = Math.min(this.speed - this.acceleration * this.frameTime, 0)
}
} else if (this.isMoveRight) { // 向右惯性滑动;
if (this.translateX >= 0) {
this.acceleration *= (this.reBoundExponent + this.translateX) / this.reBoundExponent
this.speed = Math.max(this.speed - this.acceleration, 0)
} else {
this.speed = Math.max(this.speed - this.acceleration * this.frameTime, 0)
}
}
this.translateX += this.speed * this.frameTime / 2
if (Math.abs(this.speed) <= this.zeroSpeed) {
this.checkReboundX()
return
}
this.frameStartTime = this.frameEndTime
this.inertiaFrame = requestAnimationFrame(this.moveByInertia)
},
// 计算activeBar的translateX
calcBarPosX () {
if (this.fixBottom || !this.$children.length) return
if (this.$children.length <= this.value) return
const item = this.$children[this.value].$el
const itemWidth = item.offsetWidth
const itemLeft = item.offsetLeft
this.activeBarWidth = Math.max(itemWidth * 0.6, 14)
this.activeBarX = itemLeft + (itemWidth - this.activeBarWidth) / 2
},
// 点击切换item时,调整位置使当前item尽可能往中间显示
checkPosition () {
if (this.fixBottom || !this.$children.length) return
if (this.$children.length <= this.value) return
const activeItem = this.$children[this.value].$el
const offsetLeft = activeItem.offsetLeft
const half = (this.viewAreaWidth - activeItem.offsetWidth) / 2
let changeX = 0
const absTransX = Math.abs(this.translateX)
if (offsetLeft <= absTransX + half) { // item偏左,需要往右移
let pageX = offsetLeft + this.translateX
changeX = half - pageX
} else { // item偏右,需要往左移
changeX = -(offsetLeft - absTransX - half)
}
let lastX = changeX + this.translateX
// 两种边界情况
lastX > 0 && (lastX = 0)
lastX < -this.listWidth && (lastX = -this.listWidth)
this.reBounding = true
this.translateX = lastX
}
}

xgqfrms 2012-2020

www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!


taro scroll tabs 滚动标签 切换的更多相关文章

  1. 一个页面tab标签切换,都有scroll事件的解决办法

    当前页有多个tab,如果都有scroll事件, 先解绑$(window).off('scroll') 再执行scroll就不可以了,多个标签就不会互相干扰: 给你们个例子: //标签切换    $(' ...

  2. taro swiper & scroll tabs

    taro swiper & scroll tabs https://taro-docs.jd.com/taro/docs/components/viewContainer/swiper.htm ...

  3. vant中tab标签切换时会改变内容滚动高度

    vant的tabs标签页,标签切换时会改变内容区的滚动高度,这是因为内容区共用同一个父元素为滚动区域引起的,解决办法:在tabs的内容区域嵌套一层滚动区域,让每个内容区域使用单独的滚动元素就行了.   ...

  4. 网站开发,推荐使用SuperSlide 插件-Tab标签切换,图片滚动,无缝滚动,焦点图

    SuperSlide 致力于解决网站大部分特效展示问题,使网站代码规范整洁,方便维护更新.网站上常用的“焦点图/幻灯片”“Tab标签切换”“图片滚动”“无缝滚动”等只需要一个SuperSlide即可解 ...

  5. “焦点图/幻灯片”“Tab标签切换”“图片滚动”“无缝滚动”仅需一个SuperSlidev2.1

    官网:http://www.superslide2.com/index.html 1. 标签切换 / 书签切换 / 默认效果 2. 焦点图 / 幻灯片 3. 图片滚动-左 4. 图片滚动-上 5. 图 ...

  6. scroll tabs

    scroll tabs https://github.com/NervJS/taro-ui/blob/dev/src/components/tabs/index.tsx https://github. ...

  7. js鼠标滚轮滚动图片切换效果

    效果体验网址:http://keleyi.com/keleyi/phtml/image/12.htm HTML文件代码: <!DOCTYPE html PUBLIC "-//W3C// ...

  8. JavaScript----marquee滚动标签 图片无缝滚动 插入百度地图

    页面的自动滚动效果,可由javascript来实现, 但是有一个html标签 - <marquee></marquee>可以实现多种滚动效果,无需js控制. 使用marquee ...

  9. 很好用的Tab标签切换功能,延迟Tab切换。

    一个网页,Tab标签的切换是常见的功能,但我发现很少有前端工程师在做该功能的时候,会为用户多想想,如果你觉得鼠标hover到标签上,然后切换到相应的内容,就那么简单的话,你将是一个不合格的前端工程师啊 ...

随机推荐

  1. Windows VS Code 配置 Java 开发环境

    Windows VS Code 配置 C/C++ 开发环境 准备 Windows [这个相信大家都有 笑: )] VS Code JDK 建议 JDK8以上(不包含JDK8,关于 Windows环境下 ...

  2. (十六)配置多数据源,整合MybatisPlus增强插件

    配置多数据源,整合MybatisPlus增强插件 多数据简介 MybatisPlus简介 1.案例实现 1.1 项目结构 1.2 多数据源配置 1.3 参数扫描类 1.4 配置Druid连接池 1.5 ...

  3. 五:SpringBoot-多个拦截器配置和使用场景

    SpringBoot-多个拦截器配置和使用场景 1.拦截器简介 1.1 拦截器中应用 2.拦截器用法 2.1 编写两个拦截器 2.1.1 OneInterceptor 拦截器 2.1.2 TwoInt ...

  4. JavaWeb——JSP内置对象application,JSP属性范围

    application application语法 application对象 JSP属性范围 范围的分类 page request session application pagecontext延伸 ...

  5. hadoop的Namenode HA原理详解

    为什么要Namenode HA? 1. NameNode High Availability即高可用. 2. NameNode 很重要,挂掉会导致存储停止服务,无法进行数据的读写,基于此NameNod ...

  6. maven高级笔记

    Maven高级 1.maven基础知识回顾 1.1 maven介绍 maven 是一个项目管理工具,主要作用是在项目开发阶段对Java项目进行依赖管理和项目构建. 依赖管理:就是对jar包的管理.通过 ...

  7. Latex安装教程(附美赛论文latex模板)

    @ 目录 Latex简介 安装步骤 texlive下载 配置环境变量 配置Texsudio latex版本helloworld 美赛 latex模板 Latex简介 LaTeX(LATEX,音译&qu ...

  8. fiddler抓包+雷电模拟器 完成手机app抓包的配置

    1.下载最新版Fiddler,强烈建议在官网下载:https://www.telerik.com/download/fiddler 不下载最新版的话,配置起来会遇到很多问题,弄太麻烦了.因为我下载的是 ...

  9. Codeforces Round #678 (Div. 2) C. Binary Search (二分,组合数)

    题意:有长度\(n\)的序列,让你构造序列,使得二分查找能在\(pos\)位置找到值\(x\).问最多能构造出多少种排列? 题解:题目给出的\(pos\)是固定的,所以我们可以根据图中所给的代码来进行 ...

  10. WSL安装

    默认的我们可以看到并没有安装任何发行版本: 访问:https://aka.ms/wslstore 安装后我们如何进入linux系统呢,我们使用windows terminal