scroll-view 实现滑动显示,确保超出正常显示,小程序app,h5兼容

news/2024/12/15 19:01:25/

在uniapp 开开发的项目中,滑动操作是很多的
1.在插件市场使用了几款插件,但是都不太好用,要么是 显示的tab 过多,滑动到最后一个,当前显示那个跑左边显示不全,要么是滑动到最后一个后面的无法自动滑动,
2.基于借鉴别人写的以及自己处理了一下,目前感觉还行
3.使用需知道,显示的名字字段名字必须为name自己循环处理一下即可, 并且不能为空(实际情况也不会为空),目前发现bug
4.若有其他需求,请自行修改
在这里插入图片描述
第一步
新建组件scroll-easy.vue

<template><view class="mianbox"><scroll-view scroll-x="true" :style="{  height: defH + 'rpx',background: `${debg}` }" class="contentMain"scroll-with-animation :scroll-left="scrollLeft"><view :style="{  height: defH + 'rpx',lineHeight: defH + 'rpx'}" v-for="(item, index) in getList":key="index" class="scroll-item" @click="handItem(item,index)"><view :style="curIndex === index ? getActiveStyle : getDefaultStyle">{{ item.name }}</view></view></scroll-view></view>
</template>
<script>export default {props: {list: { // 循环的数据type: Array,required: true,default: () => ([])},// 选中的下标index: {type: Number,default: 0},// 默认传入样式itemStyleDefault: {type: Object,default: () => ({})},// 默认传入选中样式itemStyleActive: {type: Object,default: () => ({})},// 切换部分高度defH: {type: String,default: '100'},// 切换整块的背景颜色debg: {type: String,default: '#f1f1f1'},// 名字过长是否缩写isNameEllipsis: {type: Boolean,default: false},// 超过数量exceed: {type: String,default: "4"},},data() {return {father_W: 0, // 导航区宽度scrollLeft: 0, // 横向滚动条位置curIndex: 0,// 这里是最初的样式 如果父组件不传下来defcss: {'color': '#999','font-size': '14px','height': '100%',},actcss: {'color': '#333','font-size': '16px','font-weight': 'bold','height': '98%','margin': '0 auto',}}},computed: {getList() {let arr = this.listif (this.isNameEllipsis) {arr.map((item) => {item.name = this.formatwordlimit(item.name, this.exceed)})} return arr},getDefaultStyle() {return this.setStyle(this.defcss, this.itemStyleDefault)},getActiveStyle() {return this.setStyle(this.actcss, this.itemStyleActive)}},watch: {index: {handler(newVal, oldVal) {this.scrollLf(newVal)if (newVal) {this.scrollLf(newVal)}},immediate: true}},mounted() {//  初始化this.init()},methods: {formatwordlimit(cname, wordlength) {let nowLength = cname.lengthif (nowLength > wordlength) {return cname = cname.substr(0, wordlength) + '..'} else {return cname}},setStyle(target1, target2) {// 传进来的覆盖当前的 属性名要一致Object.assign(target1, target2)let style = ''Object.keys(target1).forEach((e) => {style += `${e}: ${target1[e]};`})return style},init() {// 返回一个 SelectorQuery 对象实例。可以在这个实例上使用 select 等方法选择节点,并使用 boundingClientRect 等方法选择需要查询的信息。const query = uni.createSelectorQuery().in(this);// 获取到循环父级盒子的宽度query.select('.contentMain').boundingClientRect(data => {// 拿到 scroll-view 组件宽度this.father_W = data.width}).exec();// 获取标题区域宽度,和每个子元素节点的宽度以及元素距离左边栏的距离query.selectAll('.scroll-item').boundingClientRect(data => {let len = data.length;for (let i = 0; i < len; i++) {//获取到每个元素距离最左边的距离this.getList[i].left = data[i].left;//  获取到每个元素 宽度this.getList[i].width = data[i].width}}).exec()},handItem(item, index) {this.scrollLf(index)this.$emit('handItem', item, index);},scrollLf(index) {this.curIndex = index;this.scrollLeft = this.getList[index].left - this.father_W / 2 + this.getList[index].width / 2;}}}
</script><style scoped>.mianbox {width: 100%;height: 100%;}.contentMain {white-space: nowrap;}.scroll-item {display: inline-block;margin: 0 20rpx;text-align: center;}
</style>

直接使用
例如在index.vue
import scrollEasy from '../../components/scroll-easy.vue'注意路径


<template><view>1.默认样式<view><scrollEasy :index='currindex' :list='category' @handItem='handthis' /></view><view>1.默认选中下标<scrollEasy :index='currindex1' :list='category' @handItem='handthis' /></view><view>2.自定义背景颜色<scrollEasy :list='category' debg='pink' :index='currindex' @handItem='handthis' /></view><view>3.自定义tab 默认样式<scrollEasy :list='category' :index='currindex' @handItem='handthis':item-style-default="{ 'font-size': '32rpx','color': 'red'}" /></view><view>4.自定义tab 选中样式<scrollEasy :list='category' :index='currindex' @handItem='handthis':item-style-active="{ 'font-size': '40rpx','font-weight': 'bold','color': 'red','border-bottom': '1px solid red'}" /></view><view>5.自定义 是否开启名字过长限制字数....<scrollEasy :list='categoryOther' exceed='5' isNameEllipsis :index='currindex' @handItem='handthis' /></view><view>6.自定义高度<scrollEasy debg='green' defH='180' :list='category' :index='currindex' @handItem='handthis' /></view>7.自定义布局<view class='combox'><view class="left"><scrollEasy :list='category' :index='currindex' @handItem='handthis' /></view><view class="right">站位部分</view></view><view style="display: flex;"><view v-for="(item,index) in category" :key="index" @click="addcurrindex(index)"><button style="flex: 1;">{{index}}</button></view></view></view>
</template><script>import scrollEasy from '../../components/scroll-easy.vue'export default {components: {scrollEasy},data() {return {currindex: 0,currindex1: 2,category: [{id: 1,name: '面试信息1'},{id: 2,name: '面试信息2'},{id: 3,name: '面试信息3'},{id: 4,name: '面试信息4'},{id: 6,name: '面试信息5'},{id: 7,name: '面试信息6'},{id: 81,name: '充值中心7'}, {id: 62,name: '火车司机8'},{id: 73,name: '销售专员9'},{id: 84,name: '娱乐主播10'}],categoryOther: [{id: 1,name: '面试信息1'},{id: 2,name: '面试信息水电费2'},{id: 3,name: '面试信息3'},{id: 4,name: '面试信息4'},{id: 6,name: '面试信息四大分卫二5'},{id: 7,name: '面试信息6'},{id: 81,name: '充值中心7'}, {id: 62,name: '火车司机8'},{id: 73,name: '销售专员9'},{id: 84,name: '娱乐主播10'}]}},methods: {addcurrindex(index) {this.currindex = index},handthis(item, index) {console.log(item)console.log(index)this.currindex = index}}}
</script><style lang="scss" scoped>.combox {width: 100%;display: flex;}.left {flex: 1;width: 0;}.right {min-width: 100px;width: 100rpx;background: greenyellow;text-align: center;line-height: 100rpx;}
</style>

http://www.ppmy.cn/news/1555377.html

相关文章

基于Vue3的组件封装技巧分享

1、需求说明 需求背景&#xff1a;日常开发中&#xff0c;我们经常会使用一些UI组件库诸如and design vue、element plus等辅助开发&#xff0c;提升效率。有时我们需要进行个性化封装&#xff0c;以满足在项目中大量使用的需求。 错误示范&#xff1a;基于a-modal封装一个自定…

集合(全)

1.集合体系结构&#xff08;分为单列和双列&#xff09; 单列集合是指添加数据时只能添加一个&#xff0c;双列集合是每次添加一对集合。 2.单列集合&#xff08;collections) &#xff08;1&#xff09;List系列&#xff1a;添加的元素是有序&#xff0c;可重复&#xff0c;…

Elasticsearch 集群部署

Elasticsearch 是一个分布式的搜索和分析引擎&#xff0c;广泛应用于日志分析、全文搜索、实时数据分析等场景。它以其高性能、高可用性和易用性而著称。本文档将引导您完成一个基本的 Elasticsearch 集群配置&#xff0c;包括节点间的通信、客户端访问、安全设置等关键步骤。我…

JDK8新特性 --instant

Instant 前言demo 前言 java.time.Instant 类是 Java 8 新增的日期时间 API 的一部分&#xff0c;用于表示时间线上的一个瞬时点。它是不可变的、线程安全的&#xff0c;并且设计用来代替 java.util.Date。 Instant 可以被用来记录事件发生的时间戳&#xff0c;以及进行时间戳…

PWM调节DCDC参数计算原理

1、动态电压频率调整DVFS SOC芯片的核电压、GPU电压、NPU电压、GPU电压等&#xff0c;都会根据性能和实际应用场景来进行电压和频率的调整。 即动态电压频率调整DVFS&#xff08;Dynamic Voltage and Frequency scaling&#xff09;&#xff0c;优化性能和功耗。 比如某SOC在…

【Innodb阅读笔记】之 本地搭建多个MYSQL

一、背景 在开展工作与学习任务的进程中&#xff0c;时常会涉及到运用多个 MySQL 实例执行特定操作的需求。例如&#xff0c;在深入研习主从复制机制时&#xff0c;借助多个 MySQL 实例能够更为直观地观察数据的传输与同步过程&#xff0c;有效加深对其原理及应用场景的理…

MFC学习笔记专栏开篇语

MFC&#xff0c;是一个英文简写&#xff0c;全称为 Microsoft Foundation Class Library&#xff0c;中文翻译为微软基础类库。它是微软开发的一套C类库&#xff0c;是面向对象的函数库。 微软开发它&#xff0c;是为了给程序员提供方便&#xff0c;减少程序员的工作量。如果没…

3D 生成重建039-Edify 3D:Nvidia的3D生成大模型

3D 生成重建039-Edify 3D:Nvidia的3D生成大模型 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 文档介绍了Edify 3D&#xff0c;一种为高质量的3D资产生成而设计的高级解决方案。首先在多个视点上合成了所描述对象的RGB和表面法线图像正在使用扩散模型。然后使用多视图…