vue3 scroll 插件 滚动条样式 优化

安装已封装好的

npm install vuescrollnext --save

main.js/main.ts

import scroll from 'vuescrollnext'
app.use(scroll)

地址 https://www.npmjs.com/package/vuescrollnext

使用

<el-table
                        v-scrollbar="{
                            container: '.logBody>.el-table__body-wrapper',
                            'ps-y-reach-end': testEvent,
                             psScrollX: testEvent,
                        }"
                        ref="logTableREF"
                        :data="tableData"
                        :stripe="false"
                        class="logBody"
                        :border="false"
                        tooltip-effect="light"
                        style="width: 100%"
                        height="450px"
                        @selection-change="handleSelectionChange"
                    > </el-table>

或者自己封装 如下步骤....

1.安装


npm install perfect-scrollbar --save

2.使用

 <el-table
                        v-xxx="{
                            container: '.logBody>.el-table__body-wrapper',
                            'ps-y-reach-end': testEvent,
                             psScrollX: testEvent,
                        }"
                        ref="logTableREF"
                        :data="tableData"
                        :stripe="false"
                        class="logBody"
                        :border="false"
                        tooltip-effect="light"
                        style="width: 100%"
                        height="450px"
                        @selection-change="handleSelectionChange"
                    > </el-table>
// setup 
const testEvent = ()=>{}
return {
testEvent
}

不需要参数的情况,走默认配置
或者

<div v-xxx></div>

又或者

<div v-xxxx=".logBody>.el-table__body-wrapper"></div>

3. css 样式文件根据自己情况 从node_module 拷贝出来修改覆盖 或者使用他原来默认的

4. 插件内容


import { toCamelCaseSheet, toCamelCaseStyle } from "@/utils";
import { App, Directive } from "@vue/runtime-core"
import PerfectScrollbar from 'perfect-scrollbar';
import '../assets/css/scroll.css'
/**
 * @interface container  容器id 可以是 '.logBody>.el-table__body-wrapper'
 * @interface  suppressScrollX  默认false ,是否禁用X轴滚动条
 * @interface  suppressScrollY  默认false ,是否禁用Y轴滚动条
 * @interface  timeout  cure dom async render 修复dom异步呈现 (自定义配置项)
 * @interface  scrollXMarginOffset  在不启用X轴滚动条的情况下,内容宽度可以超过容器宽度的像素数。允许一些“摆动空间”或“偏移中断”,这样X轴滚动条就不会因为几个像素而启用
 * @interface  scrollYMarginOffset   在不启用Y轴滚动条的情况下,内容宽度可以超过容器宽度的像素数。允许一些“摆动空间”或“偏移中断”,这样X轴滚动条就不会因为几个像素而启用
 * @interface handlers 默认  ['click-rail', 'drag-thumb', 'keyboard', 'wheel', 'touch'], 用于滚动元素的处理程序列表
 * @interface wheelSpeed 默认1 应用于鼠标滚轮事件的滚动速度
 * @interface wheelPropagation 默认false  如果此选项为true,则当滚动到达边的末尾时,鼠标滚轮事件将传播到父元素
 * @interface swipeEasing  默认false  如果此选项为真,则轻扫滚动
 * @interface minScrollbarLength  默认 null  当设置为整数值时,滚动条的拇指部分不会缩小到该像素数以下
 * @interface maxScrollbarLength  默认 null  当设置为整数值时,滚动条的拇指部分不会扩展到该像素数
 * @interface scrollingThreshold 默认 1000  这将ps-scrolling-x和ps-scrolling-y类的阈值设置为保持不变。在默认的CSS中,无论悬停状态如何,它们都会显示滚动条。单位是毫秒
 * @interface useBothWheelAxes default false 
 * 
 */

interface scrollBarOptions {
    container?: string
    suppressScrollX?: boolean
    suppressScrollY?: boolean
    scrollXMarginOffset?: number
    scrollYMarginOffset?: number
    handlers?: string[]
    timeout?: number
    wheelSpeed?: number,
    wheelPropagation?: boolean
    swipeEasing?: boolean
    minScrollbarLength?: number
    maxScrollbarLength?: number
    scrollingThreshold?: number
    useBothWheelAxes?: boolean
    testEvent?: Function
}
/**
 * 参数可以写成 驼峰格式 当前已经做好了 兼容
 * @param el  
 * @event ps-scroll-y
 * This event fires when the y-axis is scrolled in either direction.
 * @event ps-scroll-x
 * This event fires when the x-axis is scrolled in either direction.
 * @event ps-scroll-up
 * This event fires when scrolling upwards.
 * @event ps-scroll-down
 * This event fires when scrolling downwards.
 * @event ps-scroll-left
 * This event fires when scrolling to the left.
 * @event ps-scroll-right
 * This event fires when scrolling to the right.
 * @event ps-y-reach-start
 * This event fires when scrolling reaches the start of the y-axis.
 * @event ps-y-reach-end
 * This event fires when scrolling reaches the end of the y-axis (useful for infinite scroll).
 * @event ps-x-reach-start
 * This event fires when scrolling reaches the start of the x-axis.
 * @event ps-x-reach-end
 * This event fires when scrolling reaches the end of the x-axis.
 * You can also watch the reach state via the reach property.
 * 更多详情 [https://github.com/mdbootstrap/perfect-scrollbar]
 */


/**
 * @param el 容器
 * @param options 配置项 
 */
const el_scrollBar = (el: any, options?: scrollBarOptions | any) => {
    if (el._ps_ instanceof PerfectScrollbar) {
        el._ps_.update();
    } else {
        const ps = new PerfectScrollbar(el, options || {});
        for (let handler in options) {
            if (typeof options[handler] === 'function') {
                el.addEventListener(toCamelCaseStyle(handler), options[handler])
            }
        }
        el._ps_ = ps
    }
};
/**
 * @param rules 容器 规则
 */
// 自定义指令
const Direcive: Directive = {
    mounted: function (el, binding) {
        if (typeof binding.value == "object") {
            let dom
            console.log(binding.value)
            setTimeout(() => {
                dom = el.querySelector(binding.value.container) || el;
                if (!dom) {
                    return console.warn(`未找到可供绑定的dom${binding.value}`);
                }
                const rules = ["fixed", "absolute", "relative"];
                if (!rules.includes(window.getComputedStyle(dom, null).position)) {
                    console.error(`perfect-scrollbar所在的容器的position属性必须是以下之一:${rules.join("、")}`)
                }
                el_scrollBar(dom, binding.value);
            }, binding.value.timeout || 0)
        } else {
            let dom
            dom = el.querySelector(binding.value) || el;
            el_scrollBar(dom);
        }
    },
    beforeMount: function (el, binding) { },
    updated: function (el, binding, vnode) {
        if (!el) {
            return console.warn(`未找到可供绑定的dom,${binding.value}`);
        }
        if (typeof binding.value == "object") {
            el = el.querySelector(binding.value.container) || el;
            el_scrollBar(el, binding.value);
        } else {
            el = el.querySelector(binding.value) || el;
            el_scrollBar(el)
        }
    }
}

// 名称自己定义
export default {
    install(app: App) {
        app.directive('xxxx', Direcive)
    }
}

驼峰转换


/**
 * 
 * @param str aBot => a-bot
 * @returns 
 */
export const toCamelCaseStyle = (str: string) => {
  return str.replace(/([A-Z])/g, "-$1").toLowerCase();
};
/**
 * 
 * @param str x-yaa-zxx =>xYaaZxx
 * @returns 
 */
export const toCamelCaseSheet = (str: string) => {
  return str.replace(/\-(\w)/g, (all, letter) => letter.toUpperCase());
};

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容