仿照B站制作的滑动导航功能,进行了部分优化,例如可定制默认选中元素,并将选中元素居中显示,可动态更改数据,可定制回调函数取的下标和选中元素内容,可根据需求制作N级联动

已开发成插件,使用方法与源码请前往github------传送门

注:此项目依托于swiper

vue-tabbar-slide.vue

template:

  1. <div class="tabbar-slide-wrapper">
  2. <div class="swiper-container" :class="options.container">
  3. <div class="swiper-wrapper">
  4. <div :style="[slideStyle, {'color': (index == slideOptions.slideIndex) ? slideStyle.checkedColor : slideStyle.color}]" :class="[index == slideOptions.slideIndex ? 'swiper-slide-checked' : '', 'swiper-slide']" v-for="(item, index) in options.slideData" :key="index">{{item}}</div>
  5. <!-- 下划线 -->
  6. <div :style="{width: slideStyle.width, height: downLineStyle.downLineHeight, background: downLineStyle.downLineColor}" ref="slideDownLine" class="slide-down-line"></div>
  7. </div>
  8. </div>
  9. <div class="tabbar-slide-container"></div>
  10. </div>

script:

  1. import Swiper from 'swiper'
  2. import '../../node_modules/swiper/dist/css/swiper.min.css'
  3.  
  4. export default {
  5. name: 'vueTabbarSlide',
  6. props: ['options'],
  7. data () {
  8. return {
  9. mySwiper: null,
  10. //数据
  11. slideArr: this.options.slideData || ['slide1', 'slide2', 'slide3', 'slide4', 'slide5', 'slide6', 'slide7', 'slide8', 'slide9', 'slide10', 'slide11', 'slide12', 'slide13'],
  12. //样式
  13. slideStyle: {
  14. //宽度
  15. width: this.options.width || '80px',
  16. //高度
  17. height: this.options.height || '40px',
  18. //垂直高度
  19. lineHeight: this.options.height || '40px',
  20. //文本排列方式
  21. textAlign: this.options.textAlign || 'center',
  22. //字体大小
  23. fontSize: this.options.fontSize || '14px',
  24. //字体格式
  25. fontFamily: this.options.fontFamily || 'Microsoft YaHei',
  26. //默认字体颜色
  27. color: this.options.color || '#333',
  28. //选中字体颜色
  29. checkedColor: this.options.checkedColor || '#00a0e9'
  30. },
  31. downLineStyle: {
  32. //下划线高度
  33. downLineHeight: this.options.downLineHeight || '2px',
  34. //下划线颜色
  35. downLineColor: this.options.downLineColor || '#00a0e9',
  36. },
  37. //选项
  38. slideOptions: {
  39. slideIndex: this.options.index || 0
  40. },
  41. //下划线
  42. slideDownLine: null
  43. }
  44. },
  45. watch: {
  46. options: {
  47. //此处不要用箭头函数,this会跑偏 ^_^
  48. handler: function(newValue, oldValue) {
  49. if (this.mySwiper) {
  50. this.mySwiper.destroy(true, false)
  51. }
  52. this.mySwiper = new Swiper(`.${this.options.container}`, {
  53. slidesPerView: "auto",
  54. freeMode: true,
  55. freeModeMomentumRatio: 0.5,
  56. observer: true,
  57. observeParents: false,
  58. on: {
  59. init: () => {
  60. //默认选中
  61. this.slideOptions.slideIndex = this.options.index || 0
  62. //下划线
  63. this.$refs.slideDownLine.style.transform = `translateX(${this.slideOptions.slideIndex*parseInt(this.slideStyle.width)}px)`
  64. //回调函数
  65. this.$emit("callback", event, this.slideOptions.slideIndex, this.options.slideData[this.slideOptions.slideIndex])
  66. },
  67. tap: () => {
  68. //滑动时间
  69. this.mySwiper.setTransition(300)
  70. //滑动
  71. this.slide(swiperWidth, maxTranslate, maxWidth)
  72. //更改class
  73. this.slideOptions.slideIndex = this.mySwiper.clickedIndex
  74. //下划线
  75. this.$refs.slideDownLine.style.transform = `translateX(${this.slideOptions.slideIndex*parseInt(this.slideStyle.width)}px)`
  76. //回调函数
  77. this.$emit("callback", event, this.mySwiper.clickedIndex, event.target.innerText)
  78. }
  79. }
  80. });
  81. //swiper可视宽度
  82. const swiperWidth = this.mySwiper.width
  83. //swiper最大移动距离
  84. const maxTranslate = swiperWidth - (parseInt(this.options.width) * this.options.slideData.length)
  85. //
  86. const maxWidth = -maxTranslate + swiperWidth / 2
  87.    },
  88.    deep: true
  89. }
  90. },
  91. methods: {
  92. slide(swiperWidth, maxTranslate, maxWidth) {
  93. //点击的slide
  94. const slide = this.mySwiper.slides[this.mySwiper.clickedIndex]
  95. //点击的slide offsetLeft距离浏览器左边距离
  96. const slideLeft = slide.offsetLeft
  97. //点击的slide的可视宽度
  98. const slideWidth = slide.clientWidth
  99. // 被点击slide的中心点
  100. const slideCenter = slideLeft + slideWidth / 2
  101. //当中心点距离少于一半宽度时
  102. if (slideCenter < swiperWidth / 2) {
  103.  
  104. this.mySwiper.setTranslate(0)
  105.  
  106. } else if (slideCenter > maxWidth) {
  107.  
  108. this.mySwiper.setTranslate(maxTranslate)
  109.  
  110. } else {
  111.  
  112. const nowTlanslate = slideCenter - swiperWidth / 2
  113.  
  114. this.mySwiper.setTranslate(-nowTlanslate)
  115.  
  116. }
  117. //选中颜色
  118. slide.style.color = this.downLineStyle.downLineColor
  119. }
  120. }
  121. }

App.vue

template:

  1. <div id="app">
  2. <vue-tabbar-slide :options="options" @callback="callback"></vue-tabbar-slide>
  3. <vue-tabbar-slide1 :options="options1" @callback="callback1"></vue-tabbar-slide1>
  4.  
  5. <div @click="getData">点击获取数据</div>
  6. <div>第一行下标及数据{{callbackHtml}},<br>第二行下标及数据{{callbackHtml1}}</div>
  7. </div>

script:

  1. import vueTabbarSlide from './lib/vueTabbarSlide'
  2.  
  3. export default {
  4. name: 'app',
  5. data () {
  6. return {
  7. options: {
  8. container: 'mySlide1',
  9. slideData: [],
  10. width: '80px',
  11. index: 1
  12. },
  13. options1: {
  14. container: 'mySlide2',
  15. slideData: [],
  16. width: '80px',
  17. index: 1
  18. },
  19. callbackHtml: '',
  20. callbackHtml1: ''
  21. }
  22. },
  23. components: {
  24. vueTabbarSlide: vueTabbarSlide,
  25. vueTabbarSlide1: vueTabbarSlide
  26. },
  27. methods: {
  28. getData () {
  29. this.options.slideData = ['data1', 'data2', 'data3', 'data4', 'data5', 'data6', 'data7', 'data8', 'data9', 'data10']
  30. this.options1.slideData = ['data11', 'data21', 'data31', 'data41', 'data51', 'data61']
  31. },
  32. callback (event, index, val) {
  33. this.callbackHtml = index + ';' + val
  34. },
  35. callback1 (event, index, val) {
  36. this.callbackHtml1 = index + ';' + val
  37. },
  38. }
  39. }

在使用中有问题请先去github中查看是否更新到最新版本

如果在新版本中未解决,欢迎您在此或github中给我issure,这样会让我开心很长时间,我也会在第一时间认真解决您的问题

最后,感谢您阅读至此。

Vue 仿B站滑动导航的更多相关文章

  1. iOS仿今日头条滑动导航

    之前写了篇博客网易首页导航封装类.网易首页导航封装类优化,今天在前两个的基础上仿下今日头条. 1.网易首页导航封装类中主要解决了上面导航的ScrollView和下面的页面的ScrollView联动的问 ...

  2. 2017年11月8日最新仿互站导航t5友价商城-9套模板首页都增加微信登陆

    今天测试效果如下,直接看图吧,入口在下方,点击图片直达 把9套餐模板都添加了微信首页登陆,仿互站的导航,操作比互站还要方便,官方一直对https 支持不太友好,索性把所有的https bug都修复了, ...

  3. 仿腾讯QQ竖直滑动导航菜单

    菜单就像qq软件的分组,鼠标经过自动显示相应组的内容. 效果体验网址:http://keleyi.com/a/bjad/nf86w2dv.htm 以下是源代码: <html> <he ...

  4. (https专业版)2018年1月5日高仿互站仿友价T5虚拟交易+实物交易商城-站长交易源码送手机版程序10套模版+首页微信登陆+头部下拉导航

    (https专业版)2018年1月5日高仿互站仿友价T5虚拟交易+实物交易商城-站长交易源码送手机版程序10套模版+首页微信登陆+头部下拉导航 首页支持微信登陆,只有第8套模板支持(endv模板),后 ...

  5. Nuxt|Vue仿探探/陌陌卡片式滑动|vue仿Tinder拖拽翻牌效果

    探探/Tinder是一个很火的陌生人社交App,趁着国庆假期闲暇时间倒腾了个Nuxt.js项目,项目中有个模块模仿探探滑动切换界面效果.支持左右拖拽滑动like和no like及滑动回弹效果. 一览效 ...

  6. vue 仿今日头条

    vue 仿今日头条 为了增加移动端项目的经验,近一周通过 vue 仿写今日头条,以下就项目实现过程中遇到的问题以及解决方法给出总结,有什么不正确的地方,恳请大家批评指正^ _ ^!,代码仓库地址为 g ...

  7. 我的Vue之旅、05 导航栏、登录、注册 (Mobile)

    第一期 · 使用 Vue 3.1 + TypeScript + Router + Tailwind.css 构建手机底部导航栏.仿B站的登录.注册页面. 代码仓库 alicepolice/Vue-05 ...

  8. jquery仿天猫商城左侧导航菜单

    之前看到有博友写了一个仿天猫商城左侧导航菜单,可惜不提供免费下载,也没有代码.以前自己也写过类似的效果,只是都是一小块一小块的,现在重新拼凑.我将一步一步的实现拼凑过程,希望对你有所帮助. Demo在 ...

  9. 一款基于jQuery的仿百度首页滑动选项卡

    今天给大家分享一款基于jQuery的仿百度首页滑动选项卡.这款选项卡适用浏览器:IE8.360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗.效果图如下: 在线预览   ...

随机推荐

  1. Android开发技巧——PagerAdapter的再次简单封装

    这次再对内容为View的ViewPager的适配器PagerAdapter进行简单的封装,支持List数据和SparseArray的数据,带更新视图功能. 首先,先贴上最上面的抽象类代码: /* * ...

  2. UNIX环境高级编程——管道和FIFO的额外属性

    一个描述符能以两种方式设置成非阻塞. (1)调用open时可以指定O_NONBLOCK标志. writefd = open(FIFO1,O_WRONLY | O_NONBLOCK,0); (2)如果一 ...

  3. Mybatis插件原理分析(一)

    我们首先介绍一下Mybatis插件相关的几个类,并对源码进行了简单的分析. Mybatis插件相关的接口或类有:Intercept.InterceptChain.Plugin和Invocation,这 ...

  4. 怎样写一个与Windows10 IE11兼容的标准BHO?

    p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; f ...

  5. Chapter 3 Protecting the Data(2):分配列级权限

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/39577861,专题目录:http://blog.csdn.net/dba_huangzj ...

  6. 总账balance表

    SELECT gb.period_net_dr, --期间发生额        gb.period_net_cr, --期间发生额        gb.project_to_date_dr, --账户 ...

  7. cocos2D v3.x 中action的回调block变化

    cocos2D v2.x中有带参数的回调block: id blk = [CCCallBlockN actionWithBlock:^(CCNode *node){ node.position = o ...

  8. Erlang cowboy 入门参考

    Erlang cowboy 入门参考 cheungmine,2014-10-28 本文翻译自: http://ninenines.eu/docs/en/cowboy/HEAD/guide/gettin ...

  9. 采购,接收数据收集SQL汇总(从订单->接收->INVOICE所有数据关联SQL)

    INDEX OF QUERIES Source Document: Purchase Order: 1: po_headers_all (sql) 2: po_lines_all (sql) 3: p ...

  10. Leetcode_278_First Bad Version

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/49719255 You are a product mana ...