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 相关文章推荐
关于B/S判断浏览器断开的问题讨论
Oct 29 Javascript
javascript预加载图片、css、js的方法示例介绍
Oct 14 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
Dec 17 Javascript
JavaScript 异常处理 详解
Feb 06 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
Oct 14 Javascript
使用BootStrap实现用户登录界面UI
Aug 10 Javascript
微信小程序中显示html格式内容的方法
Apr 25 Javascript
Angular限制input框输入金额(是小数的话只保留两位小数点)
Jul 13 Javascript
深入剖析Express cookie-parser中间件实现示例
Feb 01 Javascript
在vue中使用公共过滤器filter的方法
Jun 26 Javascript
layui弹出层按钮提交iframe表单的方法
Aug 20 Javascript
es6 for循环中let和var区别详解
Jan 12 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
解析左右值无限分类的实现算法
2013/06/20 PHP
php后门URL的防范
2013/11/12 PHP
YII中assets的使用示例
2014/07/31 PHP
ThinkPHP实现支付宝接口功能实例
2014/12/02 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
2016/07/14 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
2017/03/25 PHP
控制打印时页眉角的代码
2007/02/08 Javascript
JS之Date对象和获取系统当前时间详解
2014/01/13 Javascript
纯js模拟div层弹性运动的方法
2015/07/27 Javascript
js window对象属性和方法相关资料整理
2015/11/11 Javascript
jQuery页面弹出框实现文件上传
2017/02/09 Javascript
详解JavaScript作用域和作用域链
2019/03/19 Javascript
el-select数据过多懒加载的解决(loadmore)
2019/05/29 Javascript
JQuery 实现文件下载的常用方法分析
2019/10/29 jQuery
react PropTypes校验传递的值操作示例
2020/04/28 Javascript
详解node.js 事件循环
2020/07/22 Javascript
Python入门_条件控制(详解)
2017/05/16 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
2018/10/14 Python
对python捕获ctrl+c手工中断程序的两种方法详解
2018/12/26 Python
python安装requests库的实例代码
2019/06/25 Python
django-allauth入门学习和使用详解
2019/07/03 Python
python 实现汉诺塔游戏
2020/11/28 Python
结合CSS3的新特性来总结垂直居中的实现方法
2016/05/30 HTML / CSS
阿玛尼美国官方网站:Armani.com
2016/11/25 全球购物
美国顶级水上运动专业店:Marine Products
2018/04/15 全球购物
MADE法国:提供原创设计师家具
2018/09/18 全球购物
Ibatis的核心配置文件都有什么
2014/09/08 面试题
公司综合部的成员自我评价分享
2013/11/05 职场文书
软件工程师岗位职责
2013/11/16 职场文书
公司新员工的演讲稿注意事项
2014/01/01 职场文书
现实表现材料范文
2014/12/23 职场文书
2016年教师政治思想表现评语
2015/12/02 职场文书
2016创先争优活动党员公开承诺书
2016/03/24 职场文书
教你做个可爱的css滑动导航条
2021/06/15 HTML / CSS
Python之Matplotlib绘制热力图和面积图
2022/04/13 Python
MySQL下载安装配置详细教程 附下载资源
2022/09/23 MySQL