51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

「Web 前端」Vue 使用滚动条插件

PerfectScrollbar {#menu_index_1}

import PerfectScrollbar from 'perfect-scrollbar';
import 'perfect-scrollbar/css/perfect-scrollbar.css';

/\*\*




* 
  @description 初始化 PerfectScrollbar





* 
  @param {HTMLElement} el DOM 元素





* 
  @param {object} \[options\] 配置选项





* 
  @param {boolean} \[options.x\] 是否启用水平滚动条,默认为 false





* 
  @param {boolean} \[options.y\] 是否启用垂直滚动条,默认为 false
  \*/
  const fnInitScrollbar = (el, options = {}) =\> {
  if (!el) {
  return;
  }



  /\*\* 自定义属性名称,保存实例 \*/
  const attrName = 'ps';


  /\*\* @type {PerfectScrollbar} \*/
  const instance = el\[attrName\];


  if (instance instanceof PerfectScrollbar) {
  // 已存在,更新
  instance.update();
  } else {
  // 不存在,创建
  el\[attrName\] = new PerfectScrollbar(el, {
  suppressScrollX: !options.x,
  suppressScrollY: !options.y,
  swipeEasing: true,
  });
  }
  };






// 注册自定义指令 v-scrollbar
Vue.directive('scrollbar', {
// 被绑定元素插入父节点时
inserted: function (el, binding) {
const rules = \['fixed', 'absolute', 'relative', 'sticky'\];
const { modifiers } = binding;


        // 判断元素是否已设置定位
        //   滚动条需要相对于父元素进行绝对定位
        if (rules.includes(getComputedStyle(el).position)) {
            fnInitScrollbar(el, {
                x: modifiers.x,
                y: modifiers.y,
            });
        } else {
            console.error('PerfectScrollbar 所在的元素未设置有效的定位');
            console.error('元素', el);
        }
    },
    // 指令所在组件的 VNode 及其子 VNode 全部更新后
    componentUpdated: function (el, binding, vnode) {
        // vnode.context 为 Vue 实例
        //   也可以写成为 Vue.$nextTick()
        vnode.context.$nextTick(() => {
            fnInitScrollbar(el);
        });
    },



`});`

SimpleBar {#menu_index_2}

/**
 * @description 初始化 SimpleBar
 * @param {HTMLElement} el DOM 元素
 * @param {object} [options] 配置选项
 * @param {object} [options.keep] 保持显示,不自动隐藏
 */
const fnInitScrollbar = (el, options = {}) => {
    if (!el) {
        return;
    }

    /** 自定义属性名称,保存实例 */
    const attrName = '__scrollbar__';

    /** @type {SimpleBar} */
    const instance = el[attrName];

    // 移除已存在
    if (instance instanceof SimpleBar) {
        instance.unMount();
    }

    // 初始化
    el[attrName] = new SimpleBar(el, {
        autoHide: !options.keep,
        timeout: 2000,
    });




};


// 注册自定义指令 v-scrollbar
Vue.directive('scrollbar', {
// 元素插入父节点时
inserted: function (el, binding) {
const { modifiers } = binding;


        fnInitScrollbar(el, {
            keep: modifiers.keep,
        });
    },



`});`

赞(0)
未经允许不得转载:工具盒子 » 「Web 前端」Vue 使用滚动条插件