基于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. Servlet之间的关联

  2. mybatis-01-基本流程

    mybatis执行流程   1. 加载配置文件并初始化(SqlSession) 配置文件来源于两个地方,一个是配置文件(主配置文件conf.xml,mapper文件*.xml), 一个是java代码中 ...

  3. Spring系列28:@Transactional事务源码分析

    本文内容 @Transactional事务使用 @EnableTransactionManagement 详解 @Transactional事务属性的解析 TransactionInterceptor ...

  4. 汽车中的低速can和高速can的区别

    转自:https://zhuanlan.zhihu.com/p/33212308

  5. C 语言中 static 的作用

    在 C 语言中,static 的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏 当我们同时编译多个文件时,所有未加 static 前缀的全局变量和函 ...

  6. web.xml 配置 contextConfigLocation

    web.xml中classpath:和classpath*:  有什么区别? classpath:只会到你的class路径中查找找文件; classpath*:不仅包含class路径,还包括jar文件 ...

  7. 将PHPMailer整合到ThinkPHP 3.2 中实现SMTP发送邮件

    本内容转载出处:http://my.oschina.net/BearCatYN/blog/299192 并对以下内容做了一处说明. ThinkPHP没有邮件发送的功能,于是,我就想了想,就将PHPMa ...

  8. Python入门-系统模块time

    1.time模块 时间戳:1970年,1月1日开始时间元祖:包含日期,时间,保存日期结构的元祖对象格式化时间日期:按照指定的标记进行格式化处理 时间戳 import time time_num = t ...

  9. 变量 数据类型 条件if语句

    python是解释型  弱类型编程语言;  "优雅", "明确", "简单";  开发效率非常高;  可移植性;  可扩展性; 可嵌入型. ...

  10. oracle三个连接配置文件 listener.ora、sqlnet.ora、tnsnames.ora

    关于PLSQL连接ORACLE配置字符串 首先要讲一下下面的一些知识 1.ORACLE_SID:(ORACLE SYSTEM IDENTIFIER) Oracle实例是由SGA和一组后台进程组成的,实 ...