先上案例最终效果:

案例实现功能:

1.导航栏横向滚动效果

2.当前元素有下划线标识

3.点击元素,导航栏滚动到相应位置

以下将分步骤逐步完善陈述这些功能,最终会呈现所有代码

1.引用组件scroll-view,达到滚动效果

万丈高楼平地起,首先要达到横向滚动的效果

wxml

<view><scroll-view scroll-x="true" enable-flex="true" class="scroll"><block wx:for="{{ nav }}" wx:for-item="item" wx:for-index="index" wx:key="index"><view class="nav-item">{{ item }}</view></block></scroll-view>
</view>

scroll-view:小程序原生组件,使得里面的元素可以左右或上下滚动,scroll-x设置内容横向滚动,enable-flex允许内容使用flex布局(这里只是允许,还需要在相应的class中还需要添加flex布局语句,即display:flex;)

block与view:在小程序中block是不做数据渲染的,它本身在页面中不占据任何空间,它用于做逻辑处理的容器,与wx:for,wx:if等属性联用。以上代码把for放到view最终效果是一样的。

wxss

.scroll {width: 90%;height: 80rpx;line-height: 80rpx;margin: 0 auto;display: flex;/* 超出部分隐藏 */overflow: hidden;/* 文本不换行 */white-space: nowrap;
}.nav-item {margin-right: 20rpx;
}

截至到此处只引用了js代码中一个nav数组

2.点击元素时添加下划线标识,并滚动到相应位置(最终效果)

实现思路

1.添加下滑线标识:给元素添加点击事件,并动态绑定class,点击某个元素,传递此元素的下标到绑定方法中,该表变量current的值为当前下标,如此一来,在动态绑定的class中current对应某个index,触发current-nav样式

2.滚动位置:在点击元素之后,动态设置scroll-left的值,即可控制滚动条滚动距离。问题在于我们要滚动多少距离?我的设置是滚动距离为使得每个项的左边界位于手机屏幕的中间,若距离不够则保留默认滚动距离。微信小程序的特殊优势,点击事件方法的参数(events)中包含点击元素的横向滚动宽度,我们拿到这个值,再获取手机宽度即可

wxml

<view><scroll-view scroll-x="true" enable-flex="true" class="scroll" scroll-left="{{ scrollLeft }}" scroll-with-animation="true"><block wx:for="{{ nav }}" wx:for-item="item" wx:for-index="index" wx:key="index"><view class="nav-item {{ current==index?'current-nav':'' }}" bindtap="currentNav" data-index="{{ index }}" >{{ item }}</view></block></scroll-view>
</view>

scroll-left:控制滚动条向左滚动距离,默认为0;

scroll-with-animation:滚动效果

data-index="{{ index }}":传递点击元素的下标

js

// pages/nav/nav.js
Page({/*** 页面的初始数据*/data: {nav: ['全部','水果蔬菜','家电','图书','生活用品','测试','还是测试','依然是测试'],// 当前项目current: 0,// 滚动栏滚动距离scrollLeft: 0,// 窗体宽度windowWidth: 0},onLoad: function (options) {// 设置标题wx.setNavigationBarTitle({title: '导航栏案例',});// 获取窗体宽度wx.getSystemInfo({success: (result) => {this.setData({windowWidth: result.windowWidth})},})},/*** * 导航栏点击响应事件* * 1.点击项目出现下滑线* 2.点击项目,导航栏滚动,使得项目出现再屏幕固定位置* */currentNav: function (e) {console.log(e);let index = e.currentTarget.dataset.index;let scrollLeft =  e.currentTarget.offsetLeft - ( this.data.windowWidth * 0.9 ) / 2;this.setData({current: index,scrollLeft: scrollLeft})}})

因为我的滚动条设置宽度为屏幕的90%,所以计算滚动位置时略有不同,逻辑跟上面的陈述一致

打印currentNav的参数:

offsetLeft:点击元素的横向距离

index:元素的下标(我点击了第二个元素)

wxss

.scroll {width: 90%;height: 80rpx;line-height: 80rpx;margin: 0 auto;display: flex;/* 超出部分隐藏 */overflow: hidden;/* 文本不换行 */white-space: nowrap;
}.nav-item {margin-right: 20rpx;
}// 添加下边界
.current-nav {border-bottom: 1px solid #f86442;
}

无论是小程序还是web项目,做相似的功能时,实现的思路是一致的,只是使用的工具不同。解决问题的思路是一切的开始,也是最重要的部分。

小程序 横向滚动导航栏相关推荐

  1. 微信小程序,自定义导航栏组件

    微信小程序,自定义导航栏组件,可兼容iPhone 11及以上留海屏显示,关于参数获取设置参照微信小程序-收藏_羽筠的博客-CSDN博客 可定义设置的内容如下: 文字及返回箭头颜色 背景图片(优先级高于 ...

  2. 微信小程序 自定义顶部导航栏标题 navigationStyle

    微信小程序 自定义顶部导航栏标题 单页面自定义导航栏 修改需要自定义的页面,的页面配置.json文件 全部页面自定义导航 修改公共页面配置app.json 单页面自定义导航栏 修改需要自定义的页面,的 ...

  3. 微信小程序制作顶部导航栏

    1问题描述 使用微信小程序开发者工具制作顶部导航栏. 2算法描述 首先就是对微信小程序开发者工具的配置,官网搜索后进入,选择稳定版,Windows64位下载. 然后点开开发者工具,选择小程序,点击图片 ...

  4. 微信小程序之顶部导航栏(选项卡)实例 —— 微信小程序实战系列(1)

    需求:顶部导航栏 效果图: wxml: <!--导航条--> <view class="navbar"><text wx:for="{{na ...

  5. uni-app实现小程序沉浸式导航栏/顶部组件占满导航栏

    uni-app实现小程序沉浸式导航栏/顶部组件占满导航栏 如果你只是想单纯的让屏幕最上方的那个组件(比如swiper)将通知栏(导航栏)填充满,那么你只需要在page.json文件中加入以下代码到你想 ...

  6. 微信小程序——沉浸式导航栏实现

    微信小程序--沉浸式导航栏实现 微信小程序中导航栏一般来说是默认的展示标题等等,可以做的样式改变仅仅能通过配置一些官方提供的属性来实现.除此之外小程序还提供了navigationStyle这个属性可以 ...

  7. 微信小程序的自定义导航栏

    微信小程序的导航栏主要分为两个部分:状态栏和标题栏. 关于微信小程序的自定义导航栏也就是通过微信小程序官方提供的API接口来算出状态栏和标题栏的高度. 注意获取到的数值单位都是px. 首先要开启自定义 ...

  8. 微信小程序在底部导航栏使用扫一扫功能【代码可用】

    微信小程序在底部导航栏使用扫一扫功能 解决方案 uni-app 微信原生代码 在家躺着也能遇到奇奇怪怪的需求,这不,需要在微信小程序底部的导航栏中加一个扫一扫功能⭐╮( ̄﹏ ̄)╭⭐. 解决方案 在导航 ...

  9. 小程序解决自定义导航栏--刘海屏自适应问题

    小程序解决自定义导航栏–刘海屏自适应问题 今天做一个自定义的导航栏.iPhoneX和安卓的样式一直都是不一样,后面看了一些方法,解决了这个问题. 第一步(Json) "navigationS ...

最新文章

  1. 分布式锁的三种实现方式_基于 redis 的分布式锁实现
  2. Storm【压力测试】- 系列1: 进行简单的压力测试
  3. oracle 当前年到指定年的年度范围求取
  4. tensorflow(4)踩过的一些坑
  5. 【版本工具】cvs,svn,git等版本工具区别
  6. golang 1.9 sp MySQL_Golang-使用mysql
  7. command not found Operation not permitted
  8. 如何兼容html在不同分辨力的问题,现代教育技术练习题
  9. mysql列属性auto(mysql笔记四)
  10. mysql不兼容_mysql5.7 不兼容问题
  11. 黑客秘笈-渗透测试实用指南 第三版
  12. 工作五年的UI设计师,现在混的怎么样?不看是你的损失
  13. 用python画简单的图案-使用 Python Turtle 设计简单而又美丽的图形
  14. 基于GPU的大规模图计算系统与应用
  15. 一天入门Tableau详细教程(上)
  16. uniapp上拉加载
  17. 合肥工业大学计算机网络期中考试,计算机网络实验报告合肥工业大学
  18. class ts 扩展方法_ts各种类型和用法
  19. 截取指定字符前面或后面的字符串
  20. 内核驱动隐藏【绕过PatchGuard】

热门文章

  1. 朴素贝叶斯 二项式 伯努利
  2. 恩格尔注塑机数据采集
  3. 区块链技术如何赋能医学成像?
  4. 基于JAVA医保局综合办公系统计算机毕业设计源码+系统+数据库+lw文档+部署
  5. html 设置min height,CSS中min-height使用技巧
  6. 实例演示Nginx重写(Rewrite)类型last、break、redirect和permanent的区别
  7. 卓懿9.0正式版来袭
  8. java mvn命令行_Maven命令行使用:mvn clean package(打包)
  9. [转]Go在谷歌:以软件工程为目的的语言设计
  10. python爬虫东方财富网_Python爬虫入门:以东方财富网为例