移动端如何做出字母索引导航

这次给大家带来移动端如何做出字母索引导航,移动端做出字母索引导航的注意事项有哪些,下面就是实战案例,一起来看一下。

vue+ better-scroll 实现移动端歌手列表字母索引导航。算是一个学习笔记吧,写个笔记让自己了解的更加深入一点。

Demo:list-view,使用 chrome 手机模式查看。换成手机模式之后,不能滑动的话,刷新一下就 OK 了。

Github: 移动端字母索引导航

效果图

移动端如何做出字母索引导航 

配置环境

因为用到的是 vue-cli 和 better-scroll,所以首先要安装 vue-cli,然后再 npm 安装better-scroll。

简单介绍一下 better-scroll:

better-scroll 是一款重点解决移动端(已支持 PC)各种滚动场景需求的插件。它的核心是借鉴的 iscroll 的实现,它的 API 设计基本兼容 iscroll,在 iscroll 的基础上又扩展了一些 feature 以及做了一些性能优化。
better-scroll 是基于原生 JS 实现的,不依赖任何框架。它编译后的代码大小是 63kb,压缩后是 35kb,gzip 后仅有 9kb,是一款非常轻量的 JS lib。

除了这两,还使用 scss、vue-lazyload。scss 预处理器,大家都懂,用别的也一样。lazyload 实现懒加载,不用也可以,主要是优化一下体验。

数据直接使用了网易云的歌手榜单,偷懒就直接放在 data 里面了。

CSS 样式我就不贴了,直接看源码就可以了。

实现基本样式

直接使用 v-for 和 双侧嵌套实现歌手列表、以及右侧索引栏。

HTML 结构:

  • {{ group.title }}

    • 移动端如何做出字母索引导航 {{ item.name }}

  • {{ item }}

登录后复制

shortcutList 是通过计算属性得到的,取 title 的第一个字符即可。

shortcutList () { return this.singers.map((group) => {  return group.title.substr(0, 1) })}

登录后复制

使用 better-scroll

使用 better-scroll 实现滚动。对了,使用的时候别忘了用 import 引入。

created () { // 初始化 better-scroll 必须要等 dom 加载完毕 setTimeout(() => {  this._initSrcoll() }, 20)},methods: { _initSrcoll () {  console.log('didi')  this.scroll = new BScroll(this.$refs.listView, {   // 获取 scroll 事件,用来监听。   probeType: 3  }) }}

登录后复制

使用 created 方法进行 better-scroll 初始化,使用 setTimeout 是因为需要等到 DOM 加载完毕。不然 better-scroll 获取不到 dom 就会初始化失败。

这里把方法写在两 methods 里面,这样就不会看起来很乱,直接调用就可以了。

初始化的时候传入两 probeType: 3,解释一下:当 probeType 为 3 的时候,不仅在屏幕滑动的过程中,而且在 momentum 滚动动画运行过程中实时派发 scroll 事件。如果没有设置该值,其默认值为 0,即不派发 scroll 事件。

给索引添加点击事件和移动事件实现跳转

首先需要给索引绑定一个 touchstart 事件(当在屏幕上按下手指时触发),直接使用 v-on 就可以了。然后还需要给索引添加一个 data-index 这样就可以获取到索引的值,使用 :data-index=”index” 。

  • {{ item }}

登录后复制

绑定一个 onShortcutStart 方法。实现点击索引跳转的功能。再绑定一个 onShortcutMove 方法,实现滑动跳转。

created () { // 添加一个 touch 用于记录移动的属性 this.touch = {} // 初始化 better-scroll 必须要等 dom 加载完毕 setTimeout(() => {  this._initSrcoll() }, 20)},methods: { _initSrcoll () {  this.scroll = new BScroll(this.$refs.listView, {   probeType: 3,   click: true  }) }, onShortcutStart (e) {  // 获取到绑定的 index  let index = e.target.getAttribute('data-index')  // 使用 better-scroll 的 scrollToElement 方法实现跳转  this.scroll.scrollToElement(this.$refs.listGroup[index])  // 记录一下点击时候的 Y坐标 和 index  let firstTouch = e.touches[0].pageY  this.touch.y1 = firstTouch  this.touch.anchorIndex = index }, onShortcutMove (e) {  // 再记录一下移动时候的 Y坐标,然后计算出移动了几个索引  let touchMove = e.touches[0].pageY  this.touch.y2 = touchMove    // 这里的 16.7 是索引元素的高度  let delta = Math.floor((this.touch.y2 - this.touch.y1) / 18)  // 计算最后的位置  // * 1 是因为 this.touch.anchorIndex 是字符串,用 * 1 偷懒的转化一下  let index = this.touch.anchorIndex * 1 + delta  this.scroll.scrollToElement(this.$refs.listGroup[index]) }}

登录后复制

这样就可以实现索引的功能了。

当然这样是不会满足我们的对不对,我们要加入炫酷的特效呀。比如索引高亮什么的~~

移动内容索引高亮

emmm,这个时候就有点复杂啦。但是有耐心就可以看懂滴。

我们需要 better-scroll 的 on 方法,返回内容滚动时候的 Y轴偏移值。所以在初始化 better-scroll 的时候需要添加一下代码。对了,别忘了在 data 中添加一个 scrollY,和 currentIndex (用来记录高亮索引的位置)因为我们需要监听,所以在 data 中添加。

_initSrcoll () { this.scroll = new BScroll(this.$refs.listView, {  probeType: 3,  click: true }) // 监听Y轴偏移的值 this.scroll.on('scroll', (pos) => {  this.scrollY = pos.y })}

登录后复制

然后需要计算一下内容的高度,添加一个 calculateHeight() 方法,用来计算索引内容的高度。

_calculateHeight () { this.listHeight = [] const list = this.$refs.listGroup let height = 0 this.listHeight.push(height) for (let i = 0; i < list.length; i++) {  let item = list[i]  height += item.clientHeight  this.listHeight.push(height) }}// [0, 760, 1380, 1720, 2340, 2680, 2880, 3220, 3420, 3620, 3960, 4090, 4920, 5190, 5320, 5590, 5790, 5990, 6470, 7090, 7500, 7910, 8110, 8870]// 得到这样的值

登录后复制

然后在 watch 中监听 scrollY,看代码:

watch: { scrollY (newVal) {  // 向下滑动的时候 newVal 是一个负数,所以当 newVal > 0 时,currentIndex 直接为 0  if (newVal > 0) {   this.currentIndex = 0   return  }  // 计算 currentIndex 的值  for (let i = 0; i = height1 && -newVal  最后一个高度的时候  // 因为 this.listHeight 有头尾,所以需要 - 2  this.currentIndex = this.listHeight.length - 2 }}

登录后复制

得到 currentIndex 的之后,在 html 中使用。

给索引绑定 class –>  :class=”{‘current’: currentIndex === index}”

最后再处理一下滑动索引的时候改变 currentIndex。

因为代码可以重复利用,且需要处理边界情况,所以就把

this.scroll.scrollToElement(this.$refs.listGroup[index])

重新写了个函数,来减少代码量。

// 在 scrollToElement 的时候,改变 scrollY,因为有 watch 所以就会计算出 currentIndexscrollToElement (index) { // 处理边界情况 // 因为 index 通过滑动距离计算出来的 // 所以向上滑超过索引框框的时候就会 < 0,向上就会超过最大值 if (index  this.listHeight.length - 2) {  index = this.listHeight.length - 2 } // listHeight 是正的, 所以加个 - this.scrollY = -this.listHeight[index] this.scroll.scrollToElement(this.$refs.listGroup[index])}

登录后复制

lazyload

lazyload 插件也顺便说一下哈,增加一下用户体验。

使用方法

先 npm 安装

在 main.js 中 import,然后 Vue.use

import VueLazyload from 'vue-lazyload'Vue.use(VueLazyload, { loading: require('./common/image/default.jpg')})

登录后复制

添加一张 loading 图片,使用 webpack 的 require 获取图片。

然后在需要使用的时候,把 :src=”” 换成 v-lazy=”” 就实现了图片懒加载的功能。

总结

移动端字母索引导航就这么实现啦,感觉还是很有难度的哈(对我来说)。

主要就是使用了 better-scroll 的 on 获取移动偏移值(实现高亮)、scrollToElement 跳转到相应的位置(实现跳转)。以及使用 touch 事件监听触摸,来获取开始的位置,以及滑动距离(计算最后的位置)。

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

JS callback回调函数使用案例详解

React Navigation实战中有哪些注意事项

以上就是移动端如何做出字母索引导航的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2762341.html

(0)
上一篇 2025年3月8日 09:55:04
下一篇 2025年3月8日 09:55:10

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 怎样用Vue+better-scroll实现字母索引导航

    这次给大家带来怎样用Vue+better-scroll实现字母索引导航,用Vue+better-scroll实现字母索引导航的注意事项有哪些,下面就是实战案例,一起来看一下。 Demo:list-view,使用 chrome 手机模式查看。…

    2025年3月8日
    200
  • 怎样使用BubbleTransition做出页面切换效果

    这次给大家带来怎样使用BubbleTransition做出页面切换效果,使用BubbleTransition做出页面切换效果的注意事项有哪些,下面就是实战案例,一起来看一下。   CodePen 地址 前端使用 SPA 之后,能获得更多的控…

    2025年3月8日
    200
  • 怎样做出JS中E-mail 地址格式验证

    这次给大家带来怎样做出JS中E-mail 地址格式验证,做出JS中E-mail 地址格式验证的注意事项有哪些,下面就是实战案例,一起来看一下。 1:代码 利用JavaScript验证是否符合电子邮箱地址 // 创建第一个函数validate…

    2025年3月8日
    200
  • 如何使用jQuery做出文字超过规定行数自动加省略号

    这次给大家带来如何使用jQuery做出文字超过规定行数自动加省略号,使用jQuery做出文字超过规定行数自动加省略号的注意事项有哪些,下面就是实战案例,一起来看一下。 jQuery自动添加省略号 $(function () { $(“.fi…

    编程技术 2025年3月8日
    200
  • 怎样操作Vue做出高德地图搭建实时公交应用

    这次给大家带来怎样操作Vue做出高德地图搭建实时公交应用,操作Vue做出高德地图搭建实时公交应用的注意事项有哪些,下面就是实战案例,一起来看一下。 最近项目要使用高德地图写了一个实时公交的应用,这边分享一个小应用主要熟悉下高德地图在vue中…

    2025年3月8日
    200
  • Angular+RouterLink做出不同的花式跳转

    这次给大家带来Angular+RouterLink做出不同的花式跳转,Angular+RouterLink做出花式跳转的注意事项有哪些,下面就是实战案例,一起来看一下。 前言 除了使用Router的navigate()方法切换路由,Angu…

    编程技术 2025年3月8日
    200
  • 使用Vue做出分页器(附代码)

    这次给大家带来使用Vue做出分页器(附代码),使用Vue做出分页器的注意事项有哪些,下面就是实战案例,一起来看一下。 之前一直想要自己试着实现一个分页器,但是一直拖,今天写完,大概照着网易云音乐的样子来完成。这个小例子很简单,通过这个小例子…

    2025年3月8日 编程技术
    200
  • 如何做出node.js界面

    这次给大家带来如何做出node.js界面,做出node.js界面的注意事项有哪些,下面就是实战案例,一起来看一下。 最近要写一个工具界面整合项目的功能属性,方便其他部门的人进行编辑,有点类似后台。会有部分数据上的交互。于是学习了下node.…

    2025年3月8日
    200
  • 使用JS实做出加密解密操作

     这次给大家带来使用JS实做出加密解密操作,使用JS实做出加密解密操作的注意事项有哪些,下面就是实战案例,一起来看一下。 JavaScript实现对内容的加密和解密。加密,转成编码。解密则是编码转字符串。 JS加密解密 加密解密 // 加密…

    编程技术 2025年3月8日
    200
  • 怎样利用node做出可读流动模式

    这次给大家带来怎样利用node做出可读流动模式,利用node做出可读流动模式的注意事项有哪些,下面就是实战案例,一起来看一下。 node的可读流基于事件 可读流之流动模式,这种流动模式会有一个”开关”,每次当&#82…

    2025年3月8日
    200

发表回复

登录后才能评论