plh97/vue.preventMacBackScroll

avatarplhDigital nomad

vue.preventMacBackScroll

vue 指令引入方式

import * as directives from './directives'
// register global utility directives
Object.keys(directives).forEach(key => {
  Vue.directive(key, directives[key])
})

指令内容

/**
 * preventMacBackScroll
 * 当滚动到右边顶点的时候禁止右滑
 * 当滚动到左边顶点的时候禁止左滑
 * 起因, mac 下 Chrome/Safari 内嵌了手势操作, 当横向滚动条滚动到最后的时候, 会触发浏览器的向前一页向后一页的操作.
 * 为了用户体验, 理应禁止此操作.
 * 目前已在 mac 上测试 [Chrome✅, Safari✅, Firfox✅]
 * @example
 * v-preventMacBackScroll 不传参数, 默认阻止当前绑定指令的组件默认滚动事件.
 * v-preventMacBackScroll="'.el-table__body-wrapper'" 传参数, 则阻止传入的class 类名的 dom 元素
 */
export const preventMacBackScroll = {
  /**
   * 组件插入插槽的时候触发
   *
   * @param {*} el
   * @param {*} direct 当前指令内容
   */
  inserted(el, direct) {
    el.wheelEventFunc = (e) => {
      let scrollDiv = e.currentTarget
      if (direct.value) {
        scrollDiv = e.currentTarget.querySelector(direct.value)
      }
      // 当滚动到右边顶点的时候禁止滑
      if (scrollDiv && scrollDiv.scrollLeft + e.deltaX > scrollDiv.scrollWidth - scrollDiv.offsetWidth) {
        e.preventDefault()
      }
      // 当滚动到左边顶点的时候禁止左滑
      if (scrollDiv && scrollDiv.scrollLeft === 0 && e.deltaX < 0) {
        e.preventDefault()
      }
    }
    el.addEventListener('wheel', el.wheelEventFunc)
  },
  /**
   * 组件销毁的时候触发
   *
   * @param {*} el
   */
  unbind(el) {
    el.removeEventListener('wheel', el.wheelEventFunc)
  }
}