vue 内容滚动组件

这是一个介绍Vue滚动插件的博客,插件支持上下左右滚动,可自定义滚动速度、字体大小、起始位置等。通过props参数如mouseMethod、fontSize、wrapWidth等实现不同功能,例如鼠标移入移出控制、延迟滚动、内部滚动等。示例代码展示了不同滚动方向和控制方式的用法。插件还包括了鼠标滚轮滚动速度控制和暂停功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整理的一个vue滚动插件,挺好用的共享一下

  • 可上下左右滚动
  • 控制滚动速度
  • 字体大小
  • 鼠标移入移出
  • 自定义滚动起始位置
  • 鼠标移入后可以内部滚动 (滚动方向可通过参数控制)

代码很简单,大佬勿喷。不完善的地方可自行优化


props参数

|参数                     | 说明                              | 类型      |默认值     |

| mouseMethod     | 启用鼠标移入移出事件 | Boolean | false |

| fontSize               | 字体大小 | Number      | 14 |

| wrapWidth           | 横向移动 | Boolean | false |

| reverse                | 反向滚动 | Boolean | false |

| freeTime              | 延迟时间 | Number | 0 |

| textSpeed            | 文本速度 | Number | 0.5 |

| textWrapping       | 文本换行 | Boolean | false |

| initPosition           | 滚动起始位置 | Number | 0 |

| idlerWheelSpeed | 滚轮速度, 0为不开启滚动。将自动开启mouseMethod效果 | Number | 0 |

| reIdlerWheel        | 与idlerWheelSpeed配合使用,控制手动滚轮的方向 | Boolean | false |


使用例子

  1. 左边正常滚动
    <template>
        <div style="width: 100%; height: 50px;">
            <marquee-wrap wrapWidth :textSpeed="1.2" :fontSize="16" mouseMethod
                style="color: red;font-weight: 600;">
                <span>滚动测试</span>
            </marquee-wrap>
        </div>
    </template>
  2. 右边加速滚动
    <template>
        <div style="width: 100%; height: 50px;">
            <marquee-wrap wrapWidth :textSpeed="2" :fontSize="16" mouseMethod reverse 
                style="color: red;font-weight: 600;">
                <span>滚动测试</span>
            </marquee-wrap>
        </div>
    </template>
  3. 向上滚动延迟
    <template>
        <div style="width: 100%; height: 50px;">
            <marquee-wrap :textS
### Vue3 中实现滚动功能的组件及相关解决方案 #### 自定义滚动条组件 `vue-custom-scrollbar` `vue-custom-scrollbar` 是一个专为 Vue.js 设计的轻量级自定义滚动条组件[^1]。该组件可以轻松集成到 Vue 项目中,提供高度定制化的滚动体验。以下是其基本使用方法: 安装依赖: ```bash npm install vue-custom-scrollbar --save ``` 引入并注册组件: ```javascript import VueCustomScrollbar from 'vue-custom-scrollbar'; import 'vue-custom-scrollbar/dist/vue-scrollbar.css'; export default { components: { VueCustomScrollbar }, }; ``` 模板部分: ```html <template> <div> <vue-custom-scrollbar class="scroll-area"> <!-- 插槽内容 --> <p v-for="(item, index) in items" :key="index">{{ item }}</p> </vue-custom-scrollbar> </div> </template> <style scoped> .scroll-area { height: 300px; } </style> ``` 此方案适用于需要替换默认浏览器滚动条样式的情况。 --- #### 基于 Vue 3 的无限滚动组件 对于需要动态加载数据的应用场景,可以通过组合式 API 创建一个无限滚动组件[^2][^3]。核心逻辑在于监听滚动事件,并在接近页面底部时触发加载更多操作。 ##### 组件结构设计 以下是一个简单的无限滚动组件实现示例: ```javascript <script setup> import { ref, onMounted } from 'vue'; const isLoading = ref(false); const hasMoreData = ref(true); const containerRef = ref(null); // 模拟异步请求数据函数 async function fetchData() { if (isLoading.value || !hasMoreData.value) return; isLoading.value = true; await new Promise((resolve) => setTimeout(resolve, 1000)); // 模拟延迟 console.log('Loading more data...'); isLoading.value = false; } function handleScroll() { const scrollTop = containerRef.value.scrollTop; const clientHeight = containerRef.value.clientHeight; const scrollHeight = containerRef.value.scrollHeight; if ( scrollTop + clientHeight >= scrollHeight - 5 && !isLoading.value && hasMoreData.value ) { fetchData(); } } </script> <template> <div ref="containerRef" @scroll.passive="handleScroll" style="height: 400px; overflow-y: auto;" > <slot></slot> <!-- 动态内容区域 --> <div v-if="isLoading">正在加载...</div> <div v-else-if="!hasMoreData">没有更多数据了。</div> </div> </template> ``` 通过以上代码,开发者可以在父组件中传递插槽内容,并利用 `@scroll` 事件检测滚动位置变化。当用户滚动至接近容器底部时,自动调用 `fetchData()` 方法获取新数据。 --- #### 高度可控的拖拽滚动组件 如果需求涉及更复杂的交互行为(如拖拽滚动),则可以参考另一种实现方式[^4]。此类组件通常包含两个主要部分:`scroll-container` 和 `scroll-content`。前者负责绑定事件监听器,后者容纳实际展示的数据列表。 关键点如下: 1. **CSS 样式控制** 使用 `white-space: nowrap` 禁止内容换行;设置固定宽度以确保水平滚动生效。 2. **事件监听机制** 在 `mounted` 生命周期阶段挂载必要的鼠标或触摸事件处理器,捕获用户的拖拽动作。 实例代码片段: ```javascript <script setup> import { ref } from 'vue'; const isDragging = ref(false); let startX, scrollLeft; function onMouseDown(event) { isDragging.value = true; startX = event.pageX - this.$refs.container.scrollLeft; } function onMouseMove(event) { if (!isDragging.value) return; event.preventDefault(); this.$refs.container.scrollLeft = event.pageX - startX; } function onMouseUp() { isDragging.value = false; } </script> <template> <div ref="container" class="scroll-container" @mousedown="onMouseDown" @mousemove="onMouseMove" @mouseup="onMouseUp" > <ul class="scroll-content"> <li v-for="n in 20" :key="n">Item {{ n }}</li> </ul> </div> </template> <style scoped> .scroll-container { width: 300px; overflow-x: auto; white-space: nowrap; cursor: grab; } .scroll-content li { display: inline-block; margin-right: 10px; } </style> ``` 这种设计方案适合用于横向滑动菜单或其他类似场景。 --- #### 总结 针对不同业务需求,可以选择合适的滚动组件实现策略。无论是基础的自定义滚动条、高效的无限滚动还是灵活的手势拖拽滚动,Vue 3 提供的强大工具链都能帮助开发人员快速完成目标。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值