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. 云原生交付加速!容器镜像服务企业版支持 Helm Chart

    2018 年 6 月,Helm 正式加入了 CNCF 孵化项目:2018 年 8 月,据 CNCF 的调研表明,有百分之六十八的开发者选择了 Helm 作为其应用包装方案:2019 年 6 月,阿里云 ...

  2. jquery tooltip.js

    1.引用关联的js脚本 <script type="text/javascript" src="script/jquery-1.3.2.min.js"&g ...

  3. Calendar to julian date format

    1.JULIAN DATE 定义 2.示例: 定义枚举: public enum JulianDateType    {        /// <summary>        /// J ...

  4. WPF MVVM简单介绍

     前面文章中,我们已经知道,WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通知去更新UI. 我们不管 ...

  5. 找不到windows.h源文件

    一.找不到源文件window.h 今天在网上下了个程序,在公司用VS2015能打开,在家用VS2017却打不开,提示找不到源文件window.h,因为引用了这个头文件,但是却找不到 解决方案: 右侧解 ...

  6. 学习JDK1.8集合源码之--LinkedList

    1. LinkedList简介 LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列,它是基于双向链表实现的.因为它实现了Deque接口,所以也是双端队列的一种实现. 2.Lin ...

  7. php各种字符串截取

    各种字符串截取.php <?php /** * 字符串截取,支持中文和其他编码 * @param [string] $str [字符串] * @param integer $start [起始位 ...

  8. react-native-login-redux

    项目地址如下 https://github.com/agunbuhori/react-native-login-redux 先看页面 ```js // 还有中英文切换 //src/global.js ...

  9. 深入浅出Cocoa 之动态创建类【转】

    在前文<深入浅出Cocoa之类与对象>一文中,我已经详细介绍了ObjC中的 Class 与 Object 的概念,今天我们来如何在运行 时动态创建类.下面这个函数就是应用前面讲到的Clas ...

  10. CSS中的margin和padding的用法和区别

    在CSS中margin是指从自身边框到另一个容器边框之间的距离,就是容器外距离. 语法结构 (1)padding-left:10px; 左内边距 (2)padding-right:10px; 右内边距 ...