昨天看虎牙直播,发现导航栏挺有意思,自己也做个玩玩

<view class="tab_list row">
<view class="tab_item center" wx:for='{{tab_list}}' data-index="{{index}}" bindtap="tab">{{item}}</view>
<view class="border_line" style="left: {{border_left}}px; width: {{border_width}}px;"></view>
</view>
.tab_list{
position: relative
} .tab_item{
width: 20%;
height: 40px;
font-size: 14px;
} .border_line{
position: absolute;
bottom: 2px;
height: 6px;
background: linear-gradient(90deg, #FFA500, #FFD700 );
border-radius: 10px;
transition: all .2s;
}
// pages/tab/tab.js
Page({ /**
* 页面的初始数据
*/
data: {
tab_list: ['全部', '推荐', 'LOL', '户外', '一起看'],
tab_index: 0,
last_index: 0,
pos_list: [],
border_width: 16,
border_left: 0,
is_disable:false //禁止点击
}, /**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.getPosition();
},
getPosition() {
let tab_index = this.data.tab_index, border_width = this.data.border_width, last_index = this.data.last_index;
let tab_width2 = border_width / 2;
let pos_list = this.data.pos_list;
if (!pos_list.length) {
const query = wx.createSelectorQuery()
query.selectAll('.tab_item').boundingClientRect()
query.exec(res => {
let { width } = res[0][0];
this.setData({
border_left: width / 2 - tab_width2,
pos_list: res[0]
})
})
} else {
let current, last;
let tab_left = pos_list[tab_index].left, tab_width = pos_list[tab_index].width;
let last_left = pos_list[last_index].left, last_width = pos_list[last_index].width;
if (tab_index < last_index) {//向左
current = tab_left + tab_width / 2 - tab_width2;
last = last_left + last_width / 2 + tab_width2;
let width = Math.abs(current - last); //当前和上次的宽度
this.setData({
border_width: width,
border_left: tab_left + tab_width / 2 - tab_width2, //向左需要动画过渡
}, () => {
setTimeout(() => {
this.setData({
border_width,
is_disable:false
})
}, 200)
})
} else { //向右
current = tab_left + tab_width / 2 + tab_width2;
last = last_left + last_width / 2 - tab_width2;
let width = Math.abs(current - last);
this.setData({
border_width: width,
}, () => {
setTimeout(() => {
this.setData({
border_width,
border_left: tab_left + tab_width / 2 - tab_width2,
is_disable: false
})
}, 300)
})
}
}
},
tab(e) {
if (this.data.is_disable) return; let index = e.currentTarget.dataset.index;
let tab_index = this.data.tab_index;
if (index != tab_index) {
this.setData({
last_index:tab_index,
tab_index: index,
is_disable:true
})
this.getPosition();
}
},
})

模仿虎牙App 导航栏切换的更多相关文章

  1. 极致精简的fragment实现导航栏切换demo

    一个小demo.用button+fragment实现导航栏切换界面,适合刚接触的新手看一下. 效果图 点击第二个后 源码: 主界面 <span style="font-size:18p ...

  2. mui底部导航栏切换分页

    使用Hbuilder的mui框架开发移动端非常便利.高效: 底部导航栏切换功能也是移动APP开发中必须实现的: 引入mui文件.下面会用到jquery,同时引进 <link href=" ...

  3. Flutter - TabBar导航栏切换后,状态丢失

    上一篇讲到了 Flutter - BottomNavigationBar底部导航栏切换后,状态丢失 里面提到了TabBar,这儿专门再写一下吧,具体怎么操作,来不让TabBar的状态丢失.毕竟大家99 ...

  4. Flutter - BottomNavigationBar底部导航栏切换后,状态丢失

    如果你用过BottomNavigationBar.TabBar.还有Drawer,你就会发现,在切换页面之后,原来的页面状态就会丢失. 要是上一页有一个数据列表,很多数据,你滚动到了下头,切换页面后, ...

  5. Flutter实战视频-移动电商-04.底部导航栏切换效果

    04.底部导航栏切换效果 博客地址: https://jspang.com/post/FlutterShop.html#toc-291 我们要做的效果图: 新建四个页面 home_page.dart ...

  6. html5 导航栏切换效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. MUI底部导航栏切换效果

    首先是html代码: <nav class="mui-bar mui-bar-tab"> <a href="view/templates/home/ho ...

  8. react-native-tab-view 导航栏切换插件讲解

    首先引入插件 yarn add react-native-tab-view 如果用的原生环境要安装另外几个插件 yarn add react-native-reanimated react-nativ ...

  9. vue 导航栏切换

    <template> <footer class="menu"> <router-link to="/" class=" ...

随机推荐

  1. asp.net + MVC5 入门完整教程一

    原文链接:https://blog.csdn.net/qq_21419015/article/details/80311918原创凌霜残雪 最后发布于2018-05-14 17:26:30 阅读数 3 ...

  2. MVC HTML辅助方法

    HTML辅助方法(HTML Helper)用来辅助产生HTML,在开发View的时候会面对许多HTML标签,处理这些HTML标签非常繁琐,为了降低View的复杂度,可以使用HTML辅助方法帮助你产生一 ...

  3. 链接测试工具:Xenu

    Xenu 是一款深受业界好评,并被广泛使用的死链接检测工具.时常检测网站并排除死链接,对网站的 SEO(搜索引擎优化) 非常重要,因为大量死链接存在会降低用户和搜索引擎对网站的信任. 最大支持100线 ...

  4. 牛客多校第一场 A Equivalent Prefixes 单调栈(笛卡尔树)

    Equivalent Prefixes 单调栈(笛卡尔树) 题意: 给出两个数组u,v,每个数组都有n个不同的元素,RMQ(u,l,r)表示u数组中[l,r]区间里面的最小值标号是多少,求一个最大的m ...

  5. Go初始化结构体数组/切片

    package main import "fmt" func main() { var s []student fmt.Printf("%T\n", s) // ...

  6. SpringBoot整合Mybatis案例

    SpringBoot整合Mybatis案例 2019/7/15以实习生身份入职公司前端做Angular ,但是感觉前途迷茫,于是乎学习一下Java的框架——SpringBooot. 参照大神博客:ht ...

  7. MySQL表的操作01

    表在数据库中主要用来实现存储数据记录,其基本操作包括创建表.查看表.删除表和修改表. 表中的数据库对象包括: 1.列(COLUMNS):也称属性列,在具体创建表时,必须指定列的名字和它的数据类型. 2 ...

  8. unittest的discover方法

    转载:https://www.cnblogs.com/imyalost/p/9048386.html discover()方法 discover(start_dir, pattern ='test * ...

  9. Python记之薄暮笔记

    ——————————————————————————————接下来请欣赏与众不同的表演. Python打印所有的字符串时,都用引号将其括起. 有一些独特而有用的字符串表示方式. 可使用三引号表示很长的 ...

  10. 【js】子菜单吸顶(滚动到一定距离 容器置顶)附 无间断置顶 避免闪动

    思考逻辑:当向上滚动的高度>= 观察容器距离顶部高度 即可触发吸顶 以下代码在vue工程,作参考 handleScroll () { const scrollTop = window.pageY ...