Vue.js+cube-ui(Scroll组件)实现类似头条效果的横向滚动导航条


Posted in Javascript onJune 24, 2019

本博主在一次个人移动端项目中,遇到这么一个需求:希望自己的项目中,头部导航条的效果可以像今日头条那样,横向滚动!

对于这样的效果,在各大移动端项目中几乎是随处可见,为什么呢?

       我们都知道,对于移动端也就是手机上,我们页面的宽度并不像PC端那样大,可以显示很长的导航项,但对于我们移动端来说,由于功能的拓展,或者业务的细分,往往导航项也会随之增多,一旦超过移动端在一行的页面显示宽度,那便会出现导航项换行的现象,虽说也有这样布局,但一旦导航项增多到一定程度的时候,我们的页面(首页)将均被导航项霸占,这样不仅影响重点内容的展示同时对用户的体验度也有很大程度的影响!所以,为了解决这相关问题,出现了横向滚动条,主要有几点好处:

•毫无疑问的一点,用户体验好:用户可以根据自己的需要,滑动导航的方式选择自己的方式
•便于管理与维护
•使得页面变得更为美观
•突出主体业务

那么这么一个用户体验好,然后又实用的效果是怎么实现的呢?

为了坚持“不重复造轮子,在理解研究轮子的基础上进行改革创新”的原则,我选择了滴滴团队的开源框架 —— cube-ui

cube-ui 框架的官方文档地址:https://didi.github.io/cube-ui/#/zh-CN/docs/introduction

在开始实现之前,本博主也是踩了不少坑啊,吐槽就不说了,说多了都是泪啊!下面进入主题:

cube-ui 所提供的组件中,有个 Scroll 的组件,是一个基于better-scroll进行封装的组件.其实现原理我就不过多赘述了,去看了文档或者平时弄过相关效果的大家都知道.

大概的一个 HTML 结构就是:一个大的盒子套了两个小盒子,一个是滚动导航,另一个是额外拓展(对本效果不影响,可以忽略)

<div class="nav-scroll-list-wrap">
   <cube-scroll ref="navScroll" direction="horizontal">
     <ul class="nav-wrapper">
      <li v-for="(item, index) in labels" :key="index" class="nav-item">{{ item }}</li>
     </ul>
   </cube-scroll>
   <div class="search-icon">
     <span class="iconfont icon"></span>
   </div>
 </div>

这里说下 labels 是我传入的导航项数据,是一个本地 mock 数据,共八项

样式部分:这里是实现的重点!因为对于 Scroll 组件,内容元素.cube-scroll-content在滚动方向上的长度必须大于容器元素,分为纵向滚动和横向滚动,这里实现的是横向滚动,纵向的原理也是大同小异,取决于滚动的方向采取不同的样式.

.nav-scroll-list-wrap
   position relative
   padding-right 120px

大盒子部分的样式对于该需求几乎无影响,这里主要是想说下,设置为相对定位,是为了子元素的定位,子绝父相,而内边距是为了腾出一部分位置给采用绝对定位的子元素(搜索图标),同时这也是一个布局技巧和滚动的关键,为什么这么说呢?

首先,布局技巧:可以腾出一部分位置给拓展功能项用,其次可以解决拓展功能项因为增加 z-index 而将滚动的最后一个导航项遮挡住的问题;

滚动的关键:假如没有这个内边距,那么我八个导航项根据其占据的宽度将不能大于容器元素,从而出现无法滚动的现象,而这个内边距的出现正好是可以减小容器元素的宽度,那么只要导航项足够且不少的情况下是可以实现内容元素在滚动方向上的长度大于容器元素的,但如果在项目初期,导航项过少,只有四五个的情况下不建议使用这个方法,这种情况一般都是采取传统的解决方法:在传入数组导航的长度基础上乘以一个数值来动态增加内容元素的宽度,具体做法:

<cube-scroll ref="navScroll" direction="horizontal">
   <ul class="nav-wrapper" :style="{width:navWidth+'px'}">
     <li v-for="(item, index) in navTxts" :key="index" class="nav-item">{{ item }}</li>
   </ul>
 </cube-scroll>

 methods: {
   widthComputed() {
    this.navWidth=this.navTxts.length*520
   }
  },
  created() {
   this.widthComputed()
  }

其余样式:基本在官方的文档中均有说明,我改动了部分,具体的我就不过多赘述了

.cube-scroll-content
    display inline-block
    .nav-wrapper
     display inline-block
     white-space nowrap
     line-height 80px
     .nav-item
      display: inline-block
      padding: 0 30px
      font-size 40px

总结

以上所述是小编给大家介绍的Vue.js+cube-ui(Scroll组件)实现类似头条效果的横向滚动导航条,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
JavaScript中this关键词的使用技巧、工作原理以及注意事项
May 20 Javascript
js实现图片点击左右轮播
Jul 08 Javascript
使用Script元素发送JSONP请求的方法
Jun 12 Javascript
基于CSS3和jQuery实现跟随鼠标方位的Hover特效
Jul 25 Javascript
javascript读取文本节点方法小结
Dec 15 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
Jan 19 Javascript
Vuex实现计数器以及列表展示效果
Mar 10 Javascript
JS实现二维数组元素的排列组合运算简单示例
Jan 28 Javascript
VuePress 静态网站生成方法步骤
Feb 14 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
Dec 13 Javascript
Vue+abp微信扫码登录的实现代码示例
Jan 06 Javascript
vue项目或网页上实现文字转换成语音播放功能
Jun 09 Javascript
JavaScript学习教程之cookie与webstorage
Jun 23 #Javascript
React组件对子组件children进行加强的方法
Jun 23 #Javascript
vue使用websocket的方法实例分析
Jun 22 #Javascript
JS实现简单的文字无缝上下滚动功能示例
Jun 22 #Javascript
js图片查看器插件用法示例
Jun 22 #Javascript
JS实现继承的几种常用方式示例
Jun 22 #Javascript
让 babel webpack vue 配置文件支持智能提示的方法
Jun 22 #Javascript
You might like
简单的用PHP编写的导航条程序
2006/10/09 PHP
利用discuz自带通行证整合dedecms的方法以及文件下载
2007/03/06 PHP
php面向对象全攻略 (八)重载新的方法
2009/09/30 PHP
hessian 在PHP中的使用介绍
2010/12/13 PHP
使用php语句将数据库*.sql文件导入数据库
2014/05/05 PHP
php实现的二分查找算法示例
2017/06/20 PHP
js关闭模态窗口刷新父页面或跳转页面
2012/12/13 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
2014/06/24 Javascript
如何解决ligerUI布局时Center中的Tab高度大小
2015/11/24 Javascript
JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例
2016/01/26 Javascript
javascript执行环境及作用域详解
2016/05/05 Javascript
jQuery插件formValidator实现表单验证
2016/05/23 Javascript
JS组件Bootstrap Select2使用方法解析
2016/05/30 Javascript
VUEJS实战之利用laypage插件实现分页(3)
2016/06/13 Javascript
JS 对java返回的json格式的数据处理方法
2016/12/05 Javascript
jQuery实现遍历XML节点和属性的方法示例
2018/04/29 jQuery
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
Vue实现购物车的全选、单选、显示商品价格代码实例
2019/05/06 Javascript
vue.js实现三级菜单效果
2019/10/19 Javascript
Python json 错误xx is not JSON serializable解决办法
2017/03/15 Python
python实现RabbitMQ的消息队列的示例代码
2018/11/08 Python
Python实现队列的方法示例小结【数组,链表】
2020/02/22 Python
Django框架静态文件处理、中间件、上传文件操作实例详解
2020/02/29 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
2020/08/17 Python
python安装第三方库如xlrd的方法
2020/10/31 Python
Django用内置方法实现简单搜索功能的方法
2020/12/18 Python
实现CSS3中的border-radius(边框圆角)示例代码
2013/07/19 HTML / CSS
法国房车租赁网站:Yescapa
2019/08/26 全球购物
Java程序员面试90题
2013/10/19 面试题
开会迟到检讨书
2014/01/08 职场文书
学校三八妇女节活动情况总结
2014/03/09 职场文书
乡镇网格化管理实施方案
2014/03/23 职场文书
党的群众路线批评与自我批评发言稿
2014/10/16 职场文书
2015年财务人员个人工作总结
2015/07/27 职场文书
宝塔更新Python及Flask项目的部署
2022/04/11 Python
virtualenv隔离Python环境的问题解析
2022/06/21 Python