vant-weapp源码解析---Tab标签页

news2024/11/18 1:28:09

这个标签栏,属于一个很常见的组件,一般我不用这个组件,自己手写一个scroll-view以及样式,更加轻便。但是我写的最简单的标签页没有滚动效果,以及选中标签动画效果。因此根据标签栏滚动学习下,并且自己手写一个标签栏。

在这里插入图片描述

这些是所涉及到的文件以及代码

在这里插入图片描述

这是滚动需要的页面元素和样式

在这里插入图片描述

其中可以出现点击滚动效果的是因为有scroll-x,scroll-with-animation,scroll-left这个三个属性。
然后通过点击标签进行调用计算scroll-left的方法,这样就可以进行滚动。

<scroll-view scroll-x="{{ scrollable }}" scroll-with-animation="{{ scrollWithAnimation }}" scroll-left="{{ scrollLeft }}" class="{{ utils.bem('tabs__scroll', [type]) }}" style="{{ color ? 'border-color: ' + color : '' }}">
        <view class="{{ utils.bem('tabs__nav', [type, { complete: !ellipsis }]) }} nav-class" style="{{ computed.navStyle(color, type) }}">
          <view wx:if="{{ type === 'line' }}" class="van-tabs__line" style="{{ computed.lineStyle({ color, lineOffsetLeft, lineHeight, skipTransition, duration, lineWidth, inited }) }}" />
            <view wx:for="{{ tabs }}" wx:key="index" data-index="{{ index }}" class="{{ computed.tabClass(index === currentIndex, ellipsis) }} {{ utils.bem('tab', { active: index === currentIndex, disabled: item.disabled, complete: !ellipsis }) }}" style="{{ computed.tabStyle({ active: index === currentIndex, ellipsis, color, type, disabled: item.disabled, titleActiveColor, titleInactiveColor, swipeThreshold, scrollable }) }}" bind:tap="onTap">
              <view class="{{ ellipsis ? 'van-ellipsis' : '' }}" style="{{ item.titleStyle }}">
                {{ item.title }}
                <van-info wx:if="{{ item.info !== null || item.dot }}" info="{{ item.info }}" dot="{{ item.dot }}" custom-class="van-tab__title__info" />
              </view>
            </view>
        </view>
 </scroll-view>

在这里插入图片描述

这个方法是计算scrollLeft 距离的方法,选出元素(van-tabs__nav黄色框和van-tab每个红色框)得到宽度,并且计算距离scrollLeft的位置。
getAllRect和getRect是用来选择节点的封装方法

scrollIntoView() {
            const { currentIndex, scrollable, scrollWithAnimation } = this.data;
            if (!scrollable) {
                return;
            }
            Promise.all([
                getAllRect(this, '.van-tab'),
                getRect(this, '.van-tabs__nav'),
            ]).then(([tabRects, navRect]) => {
              console.log("tabRects",tabRects)
              console.log("tabRects",navRect)
                const tabRect = tabRects[currentIndex];
                const offsetLeft = tabRects
                    .slice(0, currentIndex)
                    .reduce((prev, curr) => prev + curr.width, 0);
                this.setData({
                    scrollLeft: offsetLeft - (navRect.width - tabRect.width) / 2,
                });
                if (!scrollWithAnimation) {
                    nextTick(() => {
                        this.setData({ scrollWithAnimation: true });
                    });
                }
            });
        },

在这里插入图片描述

根据Tab标签页的源码,页面元素进行修改,js不变,依然使用scrollIntoView方法。在进行tab切换的时候调用scrollIntoView方法。

在这里插入图片描述

下划线滑动动画

这个是涉及到的下划线的页面元素和样式

在这里插入图片描述

这是动态滑动样式的方法,其中定义了移动的距离,背景颜色,高度,移动速度。

在这里插入图片描述

计算lineOffsetLeft的方法,和上面的计算方法同理

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/700194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态规划的入门

https://www.bilibili.com/video/BV13Q4y197Wg/ 动态规划解题步骤 —— carl 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由…

Postman 最被低估的功能,自动化接口测试效率简直无敌!

目录 该篇文章针对已经掌握 Postman 基本用法的读者&#xff0c;即对接口相关概念有一定了解、已经会使用 Postman 进行模拟请求的操作。 接口结果判断 功能区 脚本相关 代码模板 集合(批量)测试 批量执行 变化的参数数据 请求依赖问题 接口执行顺序 数据传递 解决依…

系统出错。发生系统错误 1067。进程意外终止。

问题描述 使用管理员cmd&#xff0c;任务管理器均无法启动mysql。 报错提示信息&#xff1a;系统出错。发生系统错误 1067。进程意外终止。 错误排查 1.检查3306端口是否被占用 在cmd输入netstat -aon|findstr 3306&#xff0c;结果如下&#xff1a; 如果你发现是端口被占用…

OpenAI 又赢麻了谷歌 DeepMind 创始人刚称 Gemini 能碾压 GPT-4

整理 | 褚杏娟&#xff0c;核子可乐 谷歌在上个月的开发者大会上公布了一系列 AI 新项目&#xff0c;当时首次亮相的 Gemini 曾受到不少嘲讽。但近日&#xff0c;DeepMind 联合创始人兼 CEO Demis Hassabis 自曝&#xff0c;工程师们正在使用 AlphaGo 的技术来开发 Gemini&…

Java框架之spring 的 AOP 和 IOC

写在前面 本文一起看下spring aop 和 IOC相关的内容。 1&#xff1a;spring bean核心原理 1.1&#xff1a;spring bean的生命周期 spring bean生命周期&#xff0c;参考下图&#xff1a; 我们来一步步的看下。 1 其中1构造函数就是执行类的构造函数完成对象的创建&#x…

【Java】Java核心 79:Git 教程(2)Git 安装

文章目录 目标内容总结 上一篇我们讲到&#xff1a;Git是一个分布式版本控制系统&#xff0c;常用于协同开发和版本管理的工具。它可以跟踪文件的修改、记录历史版本&#xff0c;并支持多人协同工作。通过Git&#xff0c;你可以轻松地创建和切换分支、合并代码、回滚修改等操作…

Kicad编译

Windows 1.安装visual studio Pro 2019 以上版本&#xff0c;建议2022&#xff0c;自行破解&#xff0c;安装时一定要勾选上cmake工具&#xff1b;安装Git bash 2.去Gitlab上fork kicad的master分支到自己的gitlab仓库上&#xff0c;在本地创建kicad-source路径&#xff0c;初…

【debug】:安装mmcv-full==1.2.4包过程报错

【debug】:安装mmcv-full1.2.4包过程报错This error originates from a subprocess, and is likely not a problem with pip WARNING: Ignoring invalid distribution -illow (d:\anaconda3\envs\pytorch\lib\site-packages) 这是由于安装包过程中曾经出现问题&#xff0c;会影…

生成特定相关系数的变量

本文转载自根据相关性生成变量 已知一组变量a&#xff0c;想要生成另一组变量b&#xff0c;要求a与b之间相关性为c。 实现思路如下&#xff1a; 设固定变量为x1&#xff0c;随机变量x2&#xff0c;相关系数为rho。x1与x2之间的相关性可以转化为向量之间的夹角问题&#xff0c;…

Linux与Windows:操作系统之争及个人体验比较

在当今数码化的世界中&#xff0c;操作系统扮演着关键的角色。Linux和Windows作为最受欢迎和广泛使用的操作系统之一&#xff0c;具有不同的特点和优势。作为一个AI模型&#xff0c;我虽然没有真正的使用经验&#xff0c;但我可以就这两个操作系统进行比较&#xff0c;并提供一…

pointclouds 点云 demo 中的资源文件如pcd找不到的问题

一、问题描述 点云官网提供了许多学习点云类库的例子和demo &#xff0c;但是在github中找到tutorials后执行 mkdir build cd build cmake .. make 之后却发现没有 资源文件&#xff0c;怎么办 如&#xff1a;pcl-pcl-1.7.2\doc\tutorials\content\sources\normal_estimation…

QVHZO-A-06-3/U0/WG直动式比例流量阀控制器

QVHZO-A-06-3/U0/WG、QVHZO-A-06-12/I/PE、QVHZO-A-06-18/I、QVHZO-A-06-36/U0、QVHZO-A-06-45/I、QVKZOR-A-10-65/I/PE、QVKZOR-A-10-90/I直动式比例流量阀特点&#xff1a; 具有恒压差流量补偿功能 通过比例线圈起动 用于底板安装: 油口安装面符合ISO4401(规格尺寸6和10)…

基于单片机智能温室大棚控制系统

功能介绍 以51单片机作为主控系统&#xff1b; DS18B20温度采集模块检测温度&#xff1b; 光敏电阻和ADC0832组成的光照检测模块&#xff1b; 土壤湿度检测模块检测土壤湿度&#xff1b; CO2检测模块检测CO2浓度&#xff1b; LCD1602显示模块显示测量值、 若温度小于温度最…

Middleware ❀ Zookeeper功能与使用详解

文章目录 1、功能简述1.1 服务目标1.2 文件系统 - 树状结构1.3 数据节点Znode类型1.4 变更通知 - Watcher1.4.1 工作机制1.4.1.1 Client注册1.4.1.2 Server处理1.4.1.3 Client回调 1.4.2 监听特性 1.5 权限控制 - ACL1.5.1 模式 - scheme1.5.2 权限 - Permission 1.6 选举机制1…

Springboot如何手动连接库并获取指定表结构

一、前言&#x1f525; 通过&#xff0c;在使用springboot框架之后&#xff0c;就很少涉及到手动连接数据库的方式了&#xff0c;但bug菌有遇到这么一个需求场景&#xff0c;给到你的是无上限的数据库连接信息&#xff0c;要求你能按连接信息指定获取表数据&#xff0c;突然我就…

玩机搞机---另类操作 修改原生卡刷包转换为线刷包方式刷机

偶然给安卓机型刷写原生安卓的系统。可能其第三方twrp原因或者底包原因导致卡刷一直报错。虽然最终写入开机&#xff0c;但浪费时间&#xff0c;究其原因还在于分区切换和挂载分区导致的。写这篇博文的意义不是在于让玩家按步骤转换线刷&#xff0c;只是明白其分区写入的原理 索…

【JavaEE初阶】TCP/IP协议(二)

文章目录 网络层重点协议IP协议地址管理路由选择 数据链路层重点协议以太网协议MTU 应用层重要协议DNS&#xff08;域名解析系统&#xff09; 网络层重点协议 IP协议 协议头格式如下&#xff1a; 4位版本号&#xff08;version&#xff09;&#xff1a;指定IP协议的版本&am…

2023-6-28-第十一式代理模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

解读 RocketMQ 5.0 全新的高可用设计

作者&#xff1a;斜阳 高可用架构演进背景 在分布式系统中不可避免的会遇到网络故障&#xff0c;机器宕机&#xff0c;磁盘损坏等问题&#xff0c;为了向用户不中断且正确的提供服务&#xff0c;要求系统有一定的冗余与容错能力。RocketMQ 在日志&#xff0c;统计分析&#x…

Selenium系列(二) - 详细解读针对浏览器的操作

控制浏览器有哪些操作&#xff1f; 最大化、最小化浏览器控制、获取浏览器大小获取当前标签页title、url前进、后退、刷新执行js语句打开、关闭新标签页滚动页面 点击右边目录即可跳转哦&#xff01; -------------->>>>>>>>>> 最大化、最小化…