[uniapp] scroll-view 简单实现 u-tabbar效果

这篇具有很好参考价值的文章主要介绍了[uniapp] scroll-view 简单实现 u-tabbar效果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


效果图
[uniapp] scroll-view 简单实现 u-tabbar效果,uni-app

方案

官方scroll-view 进行封装

配合属性 scroll-left Number/String 设置横向滚动条位置 即可

scroll-into-view 属性尝试过,方案较难实现

踩坑

1.scroll-view 横向失败

安装官网的解释
使用竖向滚动时,需要给 <scroll-view> 一个固定高度,通过 css 设置 height;使用横向滚动时,需要给<scroll-view>添加white-space: nowrap;样式。

实际上,还需要再 v-for的子item上添加 display: inline-block;

那有人要说, 我要用display:flex怎么办?

那就在item外层再套个view, 给他设置 display: inline-block;即可

<scroll-view class="scroll-top-tab-bar-box" scroll-with-animation="true" scroll-x="true"
				enable-flex='true' :scroll-left="scrollLeft">
				<!-- 为了保scroll-top-tab-item的flex布局, 在外部套一个scroll-top-tab-item-box的inline-block布局 -->
				<view class="scroll-top-tab-item-box" v-for="(item,index) in tabs" :key="item.id">
					<view class="scroll-top-tab-item">
						<view :id="item.id" class="scroll-top-tab-item-title"
							:class="currentTag==index?'scroll-top-tab-item-title-selected':''"
							@tap="choose(index)">
							{{item.title}}
						</view>
						<image src="https://cdn.froglesson.com/static/cert/top_tab_bar_selected.png"
							v-if="index==currentTag"></image>
						<view class="scroll-top-tab-item-bottom-placeholder" v-else></view>
					</view>
				</view>
			</scroll-view>
2.点击item不滚动?

切记要配合 scroll-with-animation动画开启才有用, 这个好像官网没讲, 也是百度才知道的…

3. scrollLeft从哪里来?该方案存在bug

		data() {
			return {
				scrollLeft: 0
			}
		},
		methods: {
		
			choose(index) {

					this.idd = this.tabs[index].id
					this.getScrollLeft(index)
				
			},

			getScrollLeft(index) {
				let query = uni.createSelectorQuery().in(this)
				query.selectAll('.scroll-top-tab-item').boundingClientRect(data => {
					this.scrollLeft = data[index].left - 100
				}).exec()
			},
		},
	};

4.使用 element.scrollIntoView doucument在APP和小程序都不支持 pass

uniapp实现tab切换可以滚动的效果

这里针对上面的说一下, 在判断
[uniapp] scroll-view 简单实现 u-tabbar效果,uni-app
是否是上一个的时候, 我们对element的选择还是要用目标element的下一个element,(实测用上一个element无滚动效果, 只能借助nextElementSibling)

			getScrollLeft(index) {
				// let query = uni.createSelectorQuery().in(this)
				// query.selectAll('.scroll-top-tab-item').boundingClientRect(data => {
				// 	this.scrollLeft = data[index].left - 100
				// }).exec()



				setTimeout(() => {

					// if (this.oldIndex == index) return;
					// uni.showToast({
					// 	title: index + "?"
					// })

					const activeNode = document.querySelector('.scroll-top-tab-item-title-selected')
					let element = index > this.oldIndex ?
						activeNode.nextElementSibling : activeNode.nextElementSibling
					element && element.scrollIntoView({
						behavior: "smooth",
						block: "nearest",
						inline: "center"
					})
					this.oldIndex = index
				}, 0)
			}
			```

5. 利用scroll-into-view (实测最终方案)

这个方案其实是利用了 scroll-into-view的特性
同时也结合了 第4条中的方向判断
比如:
[uniapp] scroll-view 简单实现 u-tabbar效果,uni-app

我们只要取对应的id更换siv的值即可, 这会非常容易.

但同时,会发现, 向左点击下一个 或多个, 滚动都OK
但是反向点击上一个, 最终都会出现,上一个仅仅就贴在屏幕最左边, 这就导致再想点击上上一个, 就点不到

对于该问题的解决, 就需要我们通过对index于oldIndex进行比对, 判断下一次的点击的 方向

如果向左: 那就取 index对应的id 即可
如果向右: 那就去index -1 对应的id即可, 这里我采用 idnex-2 的更大范围,
当然, 需要你作好边际处理文章来源地址https://www.toymoban.com/news/detail-673816.html

			getScrollLeft(index) {
				if (index == this.oldIndex) return;
				let isRight = index > this.oldIndex ? true : false
				//if -> index 正常触发位移
				//if <- index -2 , 并对 index-2做边际判断(index在2以内的,直接按0位移), 
				this.siv = isRight ? this.tabs[index].cname : this.tabs[index >= 2 ? index - 2 : 0].cname;
				this.oldIndex = index;
			},

到了这里,关于[uniapp] scroll-view 简单实现 u-tabbar效果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp使用自带【刷新方法】与使用【scroll-view】实现下拉刷新上拉加载

    前言:uniapp自带下拉刷新,上拉加载功能基本可以满足刷新需求,但是顶部有状态栏的页面就得进行特殊处理,使用scroll-view解决,状态栏会连带被下拉问题   1、uniapp自带下拉刷新、上拉加载 在page.json中对应页面路由设置【enablePullDownRefresh】值为true(开启下拉刷新) 代码:

    2024年02月11日
    浏览(48)
  • uniapp scroll-view横向滚动无效,scroll-view子元素flex布局不生效

    要素排查: 1.scroll-x属性需要开启,官方类型是Boolean,实际字符串也行。   2scroll-view标签需要给予一个固定宽度,可以是百分百也可以是固定宽度或者100vw。    3.子元素需要设置display: inline-block(行内块元素)属性,scroll-view需要设置white-space: nowrap(不换行) 当使用scroll

    2024年02月12日
    浏览(45)
  • uniapp scroll-view基础用法

            在uniapp日常开发的过程中经常会有局部滚动的需求,而scroll-view组件正好可以满足这一需求。需注意在webview渲染的页面中,区域滚动的性能不及页面滚动。         将scroll-view组件中的属性scroll-y设定为true开启纵向滚动功能,给scroll-view设置一个高度,当内容高

    2023年04月10日
    浏览(36)
  • #Uniapp:内置组件scroll-view

    内置组件 scroll-view 属性名 类型 默认值 说明 平台差异说明 scroll-x Boolean false 允许横向滚动 scroll-y Boolean false 允许纵向滚动 upper-threshold Number/String 50 距顶部/左边多远时(单位px),触发 scrolltoupper 事件 lower-threshold Number/String 50 距底部/右边多远时(单位px),触发 scrolltolower

    2024年01月24日
    浏览(35)
  • uniapp scroll-view 隐藏滚动条

     

    2024年02月14日
    浏览(55)
  • 微信小程序 uniapp 电商项目使用scroll-view实现左右菜单联动,点击菜单子分类联动对应商品

    最近写了个微信小程序项目,一开始不理解scroll-view用法,用的另外一种方法写的,虽然实现了效果,但是代码层面来说,不大合理,后来又通过努力,用scroll-view实现了效果。现写个文章做个记录,方便自己和大家学习记录。 效果图请看第一张。布局:左右布局,右边又分

    2024年02月14日
    浏览(81)
  • uniapp中scroll-view去除滚动条

    uniapp中我们使用scroll-view实现横向或者竖向滑动时,我们会发现横向或者竖向是有一个滚动条的,不是很美观,那么我们就可以尝试去去除一下滚动条(如果采用以下官方方法无法去除时,那么请向官方反馈信息) 不过它默认是false,那就是本身不显示,可以忽略这个方法 代

    2024年02月14日
    浏览(59)
  • uniapp/微信小程序 scroll-view 设置scroll-x 失效问题解决

    实现一个横向滑动的scrollview,直接给scroll-view设置 scroll-x ,但是并没有实现想药实现横向滑动的效果,先看代码 仔细看了官网后发现有这样一句话, 然而加上也并没有实现,直接说解决方案吧! 使用横向滚动时,不仅仅需要给 scroll-view 添加 white-space: nowrap; 样式,还要给他

    2024年02月16日
    浏览(57)
  • uniapp scroll-view用法[下拉刷新,触底事件等等...](4)

    话不多说 直接上官网属性  官网示例  讲一下常用的几个 @scroll  滚动时触发  @scrolltoupper 滚动到顶部或左边,会触发 scrolltoupper 事件 @scrolltolower   滚动到底部或右边,会触发 scrolltolower 事件 1.纵向滚动 设置scroll-y=\\\"true\\\"  开启纵向滚动功能 2.横向滚动 设置scroll-x=\\\"true\\\"  开

    2024年01月25日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包