基于svelte3.0自定义pc端虚拟滚动条组件svelteScrollbar

svelte-scrollbar:运用svelte3.x创建的桌面pc版自定义美化滚动条组件。支持是否原生滚动条、自动隐藏、水平+垂直滚动(滚轮滑动)、自定义滚动条大小、背景色、间距及动态实时更新等功能。

svelteScrollbar功能及效果有些类似elementUI组件库中的el-scrollbar组件。

◆ 引入使用

在需要使用虚拟滚动条的页面引入组件。

import Scrollbar from '$lib/Scrollbar'

◆ 快速使用

使用 <Scrollbar></Scrollbar> 包住的内容,即可快速生成一个虚拟滚动条组件。

<!-- //原生滚动条 -->
<Scrollbar native>
<div>自定义内容信息。</div>
</Scrollbar> <!-- //自动隐藏滚动条 -->
<Scrollbar autohide={true}>
<div>自定义内容信息。</div>
</Scrollbar> <!-- //水平滚动条(支持滚轮滑动) -->
<Scrollbar mousewheel>
<div>自定义内容信息。</div>
</Scrollbar> <!-- //自定义高度/最大高度 -->
<Scrollbar height="200" maxHeight="350">
<div>自定义内容信息。</div>
</Scrollbar> <!-- //自定义大小/间隙/颜色 -->
<Scrollbar size="10px" gap="5" color="#09f">
<div>自定义内容信息。</div>
</Scrollbar>

◆ 实现过程

svelteScrollbar支持如下自定义参数配置。

<script>
// 是否开启原生滚动条
export let native = false
// 是否自动隐藏滚动条
export let autohide = false
// 滚动条尺寸
export let size = undefined
// 滚动条颜色
export let color = ''
// 滚动条层叠
export let zIndex = null
// 滚动条区域高度
export let height = undefined
// 滚动条区域最大高度
export let maxHeight = undefined
// 滚动条间隙
export let gap = 0
// 是否开启水平滚轮滚动控制
export let mousewheel = false ...
</script>

组件模板及js逻辑处理部分。

<div class="vui__scrollbar" bind:this={el} on:mouseenter={handleMouseEnter} on:mouseleave={handleMouseLeave}>
<div class="vscroll__wrap" class:hidenative={!bool(native)} bind:this={wrap} on:scroll={handleScroll} on:mousewheel={handleMouseWheel} style="{wrapStyle}">
<slot />
</div>
<div class="vscroll__bar vertical" class:ishide={!data.isShowBar} on:mousedown={e => handleClickTrack(e, 0)} >
<div class="vscroll__thumb" bind:this={barY} style="background: {color}; height: {data.barHeight}px; width: {addUnit(size)}" on:mousedown={e => handleDragThumb(e, 0)}></div>
</div>
<div class="vscroll__bar horizontal" class:ishide={!data.isShowBar} on:mousedown={e => handleClickTrack(e, 1)}>
<div class="vscroll__thumb" bind:this={barX} style="background: {color}; width: {data.barWidth}px; height: {addUnit(size)}" on:mousedown={e => handleDragThumb(e, 1)}></div>
</div>
</div> <script>
/**
* @Desc svelte3.x桌面端虚拟滚动条组件SvelteScrollbar
* @Time andy by 2022-05
* @About Q:282310962 wx:xy190310
*/ // ... import { onMount, afterUpdate, createEventDispatcher, tick } from 'svelte'
const dispatch = createEventDispatcher() import util from './util' $: data = {
// 滚动条宽度
barWidth: 0,
// 滚动条高度
barHeight: 0,
// 滚动条水平偏移率
ratioX: 1,
// 滚动条垂直偏移率
ratioY: 1,
// 鼠标是否按住滚动条
isTaped: false,
// 鼠标是否悬停于滚动区域
isHover: false,
// 显示滚动条
isShowBar: !bool(autohide)
} const bool = (boolean) => JSON.parse(boolean) ? true : false
const addUnit = (val) => val ? parseInt(val) + 'px' : null let observeTimer = null
let c = {}
// 滚动条对象
let el
let wrap
let barX
let barY $: wrapStyle = `height: ${addUnit(height)}; max-height: ${addUnit(maxHeight)}`
$: GAP = addUnit(gap) onMount(() => {
console.log('监听滚动条开启...') updated() let observer = new MutationObserver(mutation => {
updated()
}) observer.observe(wrap, {
attributes: true,
childList: true,
subtree: true,
attributeFilter: [
'style', 'class'
]
}) window.addEventListener('resize', util.throttle(updated)) return () => {
observer.disconnect()
window.removeEventListener('resize', updated)
console.log('监听滚动条关闭...')
}
}) afterUpdate(() => {
// console.log('监听dom更新...')
}) // 鼠标滑入
function handleMouseEnter() {
data.isHover = true
data.isShowBar = true
updated()
} // 鼠标滑出
function handleMouseLeave() {
data.isHover = false
if(!data.isTaped && bool(autohide)) {
data.isShowBar = false
}
} // 拖动滚动条
function handleDragThumb(e, index) {
// ...
} // 点击滚动条插槽
function handleClickTrack(e, index) {
if(index == 0) {
wrap.scrollTop = (Math.abs(e.target.getBoundingClientRect().top - e.clientY) - barY.offsetHeight / 2) * data.ratioY
barY.style.transform = `translateY(${wrap.scrollTop / data.ratioY}px)`
}else {
wrap.scrollLeft = (Math.abs(e.target.getBoundingClientRect().left - e.clientX) - barX.offsetWidth / 2) * data.ratioX
barX.style.transform = `translateX(${wrap.scrollLeft / data.ratioX}px)`
}
} // 更新滚动区
async function updated() {
// ...
} // 鼠标滚动事件
function handleScroll(e) {
let target = e.target
let status
if(target.scrollTop == 0) {
status = 'top' // 滚动至顶部
}else if(target.scrollTop + target.offsetHeight >= target.scrollHeight) {
status = 'bottom' // 滚动至底部
} /**
* 父组件调用 const { target, status, scrollTop, scrollLeft } = e.detail
*/
dispatch('scroll', {
target, // 滚动对象
status, // 滚动状态(记录滚动位置)
scrollTop: target.scrollTop,
scrollLeft: target.scrollLeft
})
updated()
} // 控制滚轮水平滚动
function handleMouseWheel(e) {
if(!bool(mousewheel)) return
e.preventDefault()
if(wrap.scrollWidth > wrap.offsetWidth) {
wrap.scrollLeft += e.deltaY
}
} // 滚动到一组特定坐标
export async function scrollTo(arg1, arg2) {
await tick() if(typeof arg1 == 'object') {
wrap.scrollTo(arg1)
}else if(!isNaN(arg1) && !isNaN(arg2)) {
wrap.scrollTo(arg1, arg2)
}
} // 设置滚动条到顶部的距离
export async function setScrollTop(value) {
await tick() wrap.scrollTop = value == 'top' ? 0 : value == 'bottom' ? wrap.scrollHeight : parseInt(value)
barY.style.transform = `translateY(${wrap.scrollTop / data.ratioY}px)`
} // 设置滚动条到左边的距离
export async function setScrollLeft(value) {
await tick() wrap.scrollLeft = value == 'left' ? 0 : value == 'right' ? wrap.scrollWidth : parseInt(value)
barX.style.transform = `translateX(${wrap.scrollLeft / data.ratioX}px)`
}
</script> <style>
@import 'Scrollbar.scss';
</style>

如上图:支持监听scroll滚动事件。

<Scrollbar on:scroll={handleScroll}>
<div>自定义内容信息。</div>
</Scrollbar> <script>
// 监听滚动事件
function handleScroll(e) {
const { target, status, scrollTop, scrollLeft } = e.detail
scrollTopVal = scrollTop
scrollLeftVal = scrollLeft // 判断滚动状态(方法1)
/*if(scrollTop == 0) {
scrollStatus = '滚动至顶部'
}else if(scrollTop + target.offsetHeight >= target.scrollHeight) {
scrollStatus = '滚动底部'
}else {
scrollStatus = '滚动中'
}*/ // // 判断滚动状态(方法2)
if(status == 'top') {
scrollStatus = '滚动至顶部'
}else if(status == 'bottom') {
scrollStatus = '滚动底部'
}else {
scrollStatus = '滚动中'
}
}
</script>

Okay,基于svelte.js开发自定义虚拟滚动条组件就分享到这里。希望对大家有些帮助哈~~

最后附上一个Svelte3自定义pc端对话框组件

svelte-layer基于svelte3.x自定义弹窗组件:https://www.cnblogs.com/xiaoyan2017/p/16158044.html

svelte组件:svelte3.x自定义美化虚拟滚动条组件svelte-scrollbar的更多相关文章

  1. vue3系列:vue3.0自定义虚拟滚动条V3Scroll|vue3模拟滚动条组件

    基于Vue3.0构建PC桌面端自定义美化滚动条组件V3Scroll. 前段时间有分享一个Vue3 PC网页端弹窗组件,今天带来最新开发的Vue3.0版虚拟滚动条组件. V3Scroll 使用vue3. ...

  2. Vue.js 桌面端自定义滚动条组件|vue美化滚动条VScroll

    基于vue.js开发的小巧PC端自定义滚动条组件VScroll. 前段时间有给大家分享一个vue桌面端弹框组件,今天再分享最近开发的一个vue pc端自定义滚动条组件. vscroll 一款基于vue ...

  3. 网站美化:CSS3自定义修改浏览器滚动条

    滚动条组件 ::-webkit-scrollbar //滚动条整体部分 ::-webkit-scrollbar-thumb //滚动条里面的小方块,能向上向下移动(或往左往右移动,取决于是垂直滚动条还 ...

  4. 使用VUE组件创建SpreadJS自定义单元格(一)

    作为近五年都冲在热门框架排行榜首的Vue,大家一定会学到的一部分就是组件的使用.前端开发的模块化,可以让代码逻辑更加简单清晰,项目的扩展性大大加强.对于Vue而言,模块化的体现集中在组件之上,以组件为 ...

  5. Combo( 自定义下拉框) 组件

    本节课重点了解 EasyUI 中 Combo(自定义下拉框)组件的使用方法,这个组件依赖于ValidateBox(验证框)组件 一. 加载方式自定义下拉框不能通过标签的方式进行创建.<input ...

  6. 第2篇:用as3.0制作一个滚动条组件

    本实例演示了实现一个滚动条基本功能的制作方法,没有添加改变皮肤,修改滚动条视框大小等功能,有兴趣的朋友可根据自己要求自行添加.使用时只需要通过以下一行代码创建滚动条组件: var myScrollba ...

  7. vue初级学习--组件的使用(自定义组件)

    一.导语 突然冒出四个字,分即是合,嗯,优点道理....................... 二.正文 在搞的仿淘宝demo,之前加入购物车是与商品详情一块的,今天把它单独拆出来,复用性高点,那这样 ...

  8. 【Android 应用开发】 自定义 圆形进度条 组件

    转载著名出处 : http://blog.csdn.net/shulianghan/article/details/40351487 代码下载 : -- CSDN 下载地址 : http://down ...

  9. 使用 Vue 开发 scrollbar 滚动条组件

    Vue 应该说是很火的一款前端库了,和 React 一样的高热度,今天就来用它写一个轻量的滚动条组件: 知识储备:要开发滚动条组件,需要知道知识点是如何计算滚动条的大小和位置,还有一个问题是如何监听容 ...

随机推荐

  1. HTML、JavaScript、Java、CSS它们的注释有哪些相同和不同?

    <!--html--> /*css*/ //javascript /*javascript*/

  2. Spring IoC 的实现机制?

    Spring 中的 IoC 的实现原理就是工厂模式加反射机制. 示例: interface Fruit { public abstract void eat(); } class Apple impl ...

  3. pandas - drop()函数

    函数形式:DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors ...

  4. TCP 重传、滑动窗⼝、流量控制、拥塞控制

    重传机制 TCP 会在以下两种情况发⽣超时重传: 数据包丢失 确认应答丢失 重传超时 重传超时是TCP协议保证数据可靠性的另一个重要机制,其原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果 ...

  5. 手把手教你学vue-4(vuex)

    1.首先明白vuex是做什么用的. 管理统一组件状态state.每个应用将仅仅包含一个 store 实例.单一状态树让我们能够直接地定位任一特定的状态片段,在调试的过程中也能轻易地取得整个当前应用状态 ...

  6. 【前端Talkking】CSS系列——CSS深入理解之line-height

    1.写在前面 两个多周的时间没有写文章了,手好痒好痒,趁着公司在装修,从上周末到本周都在家办公,同时公司的项目并不紧急,于是抽着时间梳理了一下CSS中关于行高line-height的理解,今天发布出来 ...

  7. JavaScript 工作原理之七-Web Workers 分类及 5 个使用场景

    Web Workers 分类及 5 个使用场景 原文请查阅这里,略有删减,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland. 这是 JavaScript 工作原理的第七章. 本系列 ...

  8. 使用 ssm 实现登录日志记录

    使用 ssm 实现登录日志记录 学习总结 一.基础准备 1. 实现效果 2. 数据表 2.1 登陆日志信息表 2.3 员工表 二.代码实现 1. SysLogLogin 实体类 2. LogAspec ...

  9. 利用Docker快速部署Mysql

    写在前面 我又来更新了~~~,今天内容较少,主要是利用Docker快速部署Mysql和初始化数据 利用Docker下载Mysql 简洁明了,在命令提示符中输入 docker pull mysql:8. ...

  10. git设置忽略提交文件

    直接在idea进行操作 1.找到想要忽略提交的文件,点击右键,然后如下操作: 2.然后就会发现被忽略的文件名变成了灰色,在项目最下方会生成ignore文件夹 3.文件夹内可以看到我们忽略的文件 4.注 ...