当前位置: 首页 > news >正文

小程序 自动导航

导航:横向导航 竖向导航 在很多业务场景中都会用到,那今天我们今天基于微信小程序平台,分析下导航的制作处理

先看例子

平台都是大家常用的平台

首先呢, 导航 确实方便了用户更快更准确的获取需求信息,使整个产品 有一个很清晰的 交互流程

导航需要手动滑动切换,小程序的操作流程度只能说优与 浏览器,还是比不上native,有时候滑动出现卡顿,最可怕的是出现滚动条,顿时会觉得有点 low

言归正传,直接看demo

利用 scroll-view 监听更新 滚动条的位置,让选中模块自动滚动进入视图,同时开启scroll-with-animation达到缓动的动画效果

wxml

<scroll-view class="navBar-box" scroll-x="true"
scroll-with-animation="true" scroll-left="{{scrollL}}">
    <view class="cate-item {{curIndex == index ? 'active':''}}"
    wx:for="{{category}}" wx:key="{{item.id}}" data-id="{{item.id}}"
    data-index="{{index}}" bindtap="switchCategory">
        {{item.name}}
    </view>
</scroll-view>
复制代码
数据解释:
  1. scrollL滚动条滚动位置,用于更新滚去距离,达到导航模块 视图进入视口
  2. curIndex 当前选中的导航子类,用于定位当前模块的active样式区分
  3. category 导航子类数组,遍历展示
  4. switchCategory 捕获点击导航子类的位置等相关信息
data 数据
data: {
    title: 'NavBar',
    curIndex:0,  // 当前选中的索引值
    category:[  // 导航集合数据信息
        {
            name:'推荐',
            id:1,
        },
        ******
    ],
    wWidth: 0, // 视口宽度
    wHeight:0, // 视口高度
    scrollL: 0, // 导航滚动的数值
},
复制代码
初始化 获取视口信息
show(){
    let wData = wx.getSystemInfoSync();
    this.setData({ 
        wWidth:wData.windowWidth,
        wHeight:wData.windowHeight,
    })  
},
复制代码
即时捕获更新导航位置
switchCategory:function(e){
    let idx = e.currentTarget.dataset.index; // 获取点击元素的索引
    this.setData({curIndex:idx}) 
    let offsetL = e.target.offsetLeft; // 点击的item距离适口view左边界距离
    /**
     * 获取点击元素距离中心的偏移量
     * 滚动距离 = 偏移数值 - 视口/2 (稍微增加一些元素的中间数值)
     */
    let scrollL = offsetL - this.data.wWidth/2 + 20;
    scrollL = scrollL > 0 ? scrollL : 0;
    this.setData({ scrollL:scrollL }) 
},
复制代码

具体偏移数据目前还不能达到一个自动化计算的程度,当然可以按照当前item中的 (字数 * 字体大小 + 左右偏移)/2 达到一个准确的数据,使得 导航选中的子类如有条件居中时,更加准确

ps: 隐藏滚动条

::-webkit-scrollbar{
  width: 0;
  height: 0;
  color: transparent;
}
复制代码

开启弹性滚动

page{
    -webkit-overflow-scrolling: touch;    
}
复制代码

一开始说到竖直滚动条,实现方式跟横向雷同,没有什么特殊,反而不需要考虑 item 自我宽度的居中

如有任何问题,请留言,会及时更正,谢谢

源码地址:github

如果喜欢给个start,哈哈hahahahahahahah

转载于:https://juejin.im/post/5b347fba6fb9a00e80276f21

相关文章:

  • Spark: 基本架构及原理
  • Android上的文件操作
  • Eureka微服务实战-服务提供者
  • Python入门教程之安装MyEclipse插件和安装Python环境
  • Windows系统下类UNIX环境---Cygwin安装
  • MySQL Desc指令相关
  • 一个优秀的软件测试工程师需具备的技能
  • Mozilla正在SpiderMonkey中测试JavaScript并行计算
  • [剑指offer] 二叉树的镜像
  • PHP下用B/S编程模式去实现C/S软件编程模式下的插件引擎功能!
  • Vue创建五:导出及配置文件解析
  • 监测谁用了SQL Server的Tempdb空间
  • JavaScript面向对象程序设计(7): 闭包
  • Java NIO系列教程(十二) Java NIO与IO
  • Session,cookie,localStorage
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • ComponentOne 2017 V2版本正式发布
  • GraphQL学习过程应该是这样的
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Python打包系统简单入门
  • Spring-boot 启动时碰到的错误
  • 阿里研究院入选中国企业智库系统影响力榜
  • 阿里云前端周刊 - 第 26 期
  • 不上全站https的网站你们就等着被恶心死吧
  • 初探 Vue 生命周期和钩子函数
  • 基于游标的分页接口实现
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 你真的知道 == 和 equals 的区别吗?
  • 使用parted解决大于2T的磁盘分区
  • 提醒我喝水chrome插件开发指南
  • 线性表及其算法(java实现)
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​用户画像从0到100的构建思路
  • $.each()与$(selector).each()
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (1)Android开发优化---------UI优化
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (第一天)包装对象、作用域、创建对象
  • (二)JAVA使用POI操作excel
  • (二)windows配置JDK环境
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (七)理解angular中的module和injector,即依赖注入
  • (十六)串口UART
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)项目管理杂谈-我所期望的新人
  • (转)一些感悟
  • .mysql secret在哪_MySQL如何使用索引
  • .NET Remoting学习笔记(三)信道