PerfectScrollbar
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
/**
* @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,
});
},
});
隐私政策和规则
点击此处查看详情
转载说明
欢迎任何网络媒体和网站转载本站的内容,转载时请注明作者和博客文章链接。
其他说明
本站部分内容可能已过时,仅供参考,请留意内容发布日期。