本博主在一次个人移动端项目中, 遇到这么一个需求: 希望自己的项目中, 头部导航条的效果可以像今日头条那样, 横向滚动!
对于这样的效果, 在各大移动端项目中几乎是随处可见, 为什么呢?
我们都知道, 对于移动端也就是手机上, 我们页面的宽度并不像 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
这样, 一个横向滚动条就实现了, 如果有不足或者错误的地方, 欢迎大家指出, 一起交流解决哈!
来源: https://www.cnblogs.com/hq-fighting/p/11074504.html