下拉组件 父DOM滚动事件 下拉面板坐标问题

util.js

/**
 * 获取给定元素的 CSS 计算属性
 * @function
 * @ignore
 * @argument {Eement} element 给定的元素
 * @argument {String} property 属性
 */
export function getStyleComputedProperty(element, property) {
    // 注:这里会访问 DOM
    var css = window.getComputedStyle(element, null);
    return css[property];
}

/**
 * 返回给定元素用来计算滚动的父元素
 * @function
 * @ignore
 * @argument {Element} element
 * @returns {Element} scroll parent
 */
export function getScrollParent(element) {
    var parent = element.parentNode;

    if (!parent) {  // 没有父级
        return element;
    }

    if (parent === window.document) {
        // Firefox 会将 scrollTop的判断放置的 `documentElement` 而非 `body` 上
        // 我们将判断二者谁大于0来返回正确的元素
        if (window.document.body.scrollTop) {
            return window.document.body;
        } else {
            return window.document.documentElement;
        }

    }

    // Firefox 要求我们也要检查 `-x` 以及 `-y`
    if (
        ['scroll', 'auto'].indexOf(getStyleComputedProperty(parent, 'overflow')) !== -1 ||
        ['scroll', 'auto'].indexOf(getStyleComputedProperty(parent, 'overflow-x')) !== -1 ||
        ['scroll', 'auto'].indexOf(getStyleComputedProperty(parent, 'overflow-y')) !== -1
    ) {
        // 如果检测到的 scrollParent 是 body,我们将对其父元素做一次额外的检测
        // 这样在 Chrome 系的浏览器中会得到 body,其他情况下会得到 documentElement
        // 修复 issue #65
        return parent;
    }
    return getScrollParent(element.parentNode);
}

dropdown.vue

directives: {
      clickoutside: {
        bind(el, binding, vnode) {
       
          function resetRect() {
            // 修正dropdown坐标
            vnode.context.rect = el.getBoundingClientRect();
            console.log('vnode.context.rect>>>>', vnode.context.rect)
          }
          el.__vueScroll__ = resetRect;
          document.addEventListener('scroll', el.__vueScroll__);

        },
        inserted(el){
            let target = getScrollParent( el );
            target.addEventListener('scroll', el.__vueScroll__);
        },
        unbind(el, binding) {
          let target = getScrollParent( el );
          target.removeEventListener('scroll', el.__vueScroll__);
          document.removeEventListener('scroll', el.__vueScroll__);
          delete el.__vueScroll__;
        }
      }
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Vue2.0+组件库总结 UI组件 element - 饿了么出品的Vue2的web UI工具套件 Vux - 基...
    szch阅读 1,985评论 1 52
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    小姜先森o0O阅读 9,702评论 0 72
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    35eeabfa0772阅读 3,307评论 7 12
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    王喂马_阅读 6,495评论 1 77
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    流觞小菜鸟阅读 1,866评论 2 8