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, }); },
});