React横向滚动计算

class Footer extends React.Component {
handleClick(e) {
const offset = 150; // 指定偏移量
this.scroller.scrollLeft = e.currentTarget.offsetLeft - offset;
} render() {
return <section className="m-tab">
<ul className="tab" ref={node => this.scroller = node}>
<li className="tab-item checked" onClick={e => this.handleClick(e)}>
<p className="day">DAY1</p>
<p className="content">抵达曼谷</p>
</li>
<li className="tab-item" onClick={e => this.handleClick(e)}>
<p className="day">DAY2</p>
<p className="content">抵达曼谷</p>
</li>
<li className="tab-item" onClick={e => this.handleClick(e)}>
<p className="day">DAY3</p>
<p className="content">抵达曼谷</p>
</li>
<li className="tab-item" onClick={e => this.handleClick(e)}>
<p className="day">DAY4</p>
<p className="content">抵达曼谷</p>
</li>
<li className="tab-item" onClick={e => this.handleClick(e)}>
<p className="day">DAY5</p>
<p className="content">抵达曼谷</p>
</li>
<li className="tab-item" onClick={e => this.handleClick(e)}>
<p className="day">DAY6</p>
<p className="content">抵达曼谷</p>
</li>
<li className="tab-item" onClick={e => this.handleClick(e)}>
<p className="day">DAY7</p>
<p className="content">抵达曼谷</p>
</li>
</ul>
</section>;
}
}

React Native横向滚动计算

import {View, Text, ScrollView, TouchableOpacity} from 'react-native';
import {_container, _inner, _item, _text} from './index.style'; const offsetX = 50; // tab默认偏移量 export default class FixedTab extends QComponent {
static reduxPlugin = {
mapStateToProps: state => state
} constructor(props) {
super(props);
this.scrollX = 0; // scroller的动态x偏移量
this.scrollWidth = 0; // scroller容器的宽度
this.contentWidth = 0; // scroller内部元素的宽度
this.itemLayout = {}; // scroller初始化每项的x偏移量
} onScroll(e) {
this.scrollX = e.nativeEvent.contentOffset.x;
} onLayout(e) {
this.scrollWidth = e.nativeEvent.layout.width;
} onContentLayout(e) {
this.contentWidth = e.nativeEvent.layout.width;
} onItemLayout(e, index) {
this.itemLayout[index] = e.nativeEvent.layout.x;
} changeType(index) {
// 滚动逻辑
const itemOffsetX = this.itemLayout[index] - this.scrollX;
if(itemOffsetX > offsetX) { // 右侧超出固定偏移量
if(this.itemLayout[index] + this.scrollWidth - offsetX < this.contentWidth) {
this.scroller.scrollTo({x: this.itemLayout[index] - offsetX});
} else {
this.scroller.scrollTo({x: this.contentWidth - this.scrollWidth});
}
} else {
if(this.itemLayout[index] > offsetX) { // 默认当前元素偏移量大于固定偏移量
this.scroller.scrollTo({x: this.itemLayout[index] - offsetX});
} else {
this.scroller.scrollTo({x: 0});
}
}
} render() {
return <ScrollView
ref={node => this.scroller = node}
style={_container}
horizontal={true}
showsHorizontalScrollIndicator={false}
onLayout={e => this.onLayout(e)}
onScroll={e => this.onScroll(e)}
scrollEventThrottle={16}
>
<View style={_inner} onLayout={e => this.onContentLayout(e)}>
{list.map((item, i) =>
<View key={i} onLayout={e => this.onItemLayout(e, i)}>
<TouchableOpacity style={_item} onPress={() => this.changeType(i)}>
<Text style={_text}>{item.name}</Text>
</TouchableOpacity>
</View>
)}
</View>
</ScrollView>;
}
}

横向tab计算滚动位置的更多相关文章

  1. vue-scroller记录滚动位置

    问题描述: 列表页进入详情页,或者tab页切换,然后再返回列表页,希望能切换到之前滚动位置 解决问题思路: 切换到其他页面前记录位置,返回列表页的时候返回位置.这就需要借助vue-router的bef ...

  2. jQuery内容横向拖拽滚动

    如果有业务需求:使用横向滚动,而又不想用滚动条,可以使用横向拖拽滚动,主要是利用元素的scrollLeft特性: 废话不多说直接上代码: css: .box{ width:100%; height:3 ...

  3. React+React Router+React-Transition-Group实现页面左右滑动+滚动位置记忆

    2018年12月17日更新: 修复在qq浏览器下执行pop跳转时页面错位问题 本文的代码已封装为npm包发布:react-slide-animation-router 在React Router中,想 ...

  4. 横向不间断滚动DIV

    横向不间断滚动DIV,5个一组,js控制,自动生成任意组显示 <!DOCTYPE html> <html> <head> <meta http-equiv=& ...

  5. “Win10 UAP 开发系列”之 在MVVM模式中控制ListView滚动位置

    这个扩展属性从WP8.1就开始用了,主要是为了解决MVVM模式中无法直接控制ListView滚动位置的问题.比如在VM中刷新了数据,需要将View中的ListView滚动到顶部,ListView只有一 ...

  6. html--offsetLeft,Left,clientLeft的关键--动态获取计算元素位置关系

    动态计算元素位置关系的时候,必备... http://www.cnblogs.com/panjun-Donet/articles/1294033.html

  7. android开发之记录ListView滚动位置

    这个问题本身不难,但是由于项目中的需求太过于复杂,结果导致这个问题变得不是那么容易实现.在网上一搜,结果如下: 我不知道是who copy who?反正介绍的所谓的三种方法,第一种都是无法运行的,很明 ...

  8. javascript-图片横向无缝隙滚动(可在服务器运行)

    前两次弄'图片横向滚动'javascript,在本地上运行得很美,可是一上到我们学校后台的服务器,就有很多问题,这个算是行的了. css代码: <style type="text/cs ...

  9. Android listView scroll 恢复滚动位置

    相信大家尝试过许多方法恢复滚动位置,本人也找了许多方法,唯有这个方法好用,下面把代码贴出来 声明两个变量 private int mPosition; private int lvChildTop; ...

随机推荐

  1. Laravel 安装mysql、表增加模拟数据、生成控制器

    参考中文网教程: 安装mysql.表增加模拟数据 http://www.golaravel.com/post/2016-ban-laravel-xi-lie-ru-men-jiao-cheng-yi/ ...

  2. 【JZOJ3640】【COCI2014】utrka

    Mission 2<=N<=300,2<=M<=N∗(N−1) Solution SPFA. 由于只是二元关系,所以条件随便写. 具体来说,如果是u⇒v. 若v的最大领先时间还 ...

  3. 【JZOJ3617】【ZJOI2014】力

    ╰( ̄▽ ̄)╭ 对于100%的数据,n≤100000;0<qi<1,000,000,000. (⊙ ▽ ⊙) 令ri=1i2, 设Fj=∑j−1i=0qi∗rj−1−i,Gj=∑j−1i= ...

  4. Python学习笔记(一)初识Python以及安装Python

    一.Python简介 1.Python发展史 Python 是由 Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的. Python 本身也是由诸多 ...

  5. StringUtils常用方式留存

    StringUtils是org.apache.commons.lang下的一个工具包.主要用途从名字可以看出是针对于String的一些操作工具,里面包含的方法非常多,英语水平尚可以的人可以前往它的官方 ...

  6. check constraints

    SELECT constraint_name, constraint_type, column_name, STATUSfrom user_constraints natural join user_ ...

  7. 技巧专题3(cdq分治、整体二分等)

    cdq分治与整体二分 cdq来源于2008年国家集训队作业陈丹琦(雅礼巨佬),用一个log的代价完成从静态到动态(很多时候是减少时间那一维的). 对于一个时间段[L, R],我们取mid = (L + ...

  8. SQL知识总结(1)

    什么是数据库: sql组成: DDL:数据定义语句,有CREATE/DROP等: DML:数据操作语句,有DELETE/UPDATE/INSERT/INSERT等; DQL:数据查询语句,有SELEC ...

  9. AI种黄桃AI卖黄桃 阿里巴巴推进一站式政务服务

    7月11日,武汉城市峰会期间,武汉.枣阳.荆门等多个城市发布了同阿里巴巴的最新合作.这些合作包括用人工智能改善武汉交通拥堵.降低枣阳黄桃种植成本.提升荆门城市治理和市民服务水平等.阿里云.蚂蚁金服.高 ...

  10. JAVA高级特性--String/StringBuffer/Builder

    String String对象一旦创建就不能改变 是常量 需要进行大量字符串操作应采用StringBuffer/StringBuilder  最终结果转换成String对象 StringBuffer ...