美文网首页
巧妙监测元素尺寸变化

巧妙监测元素尺寸变化

作者: 孤泉冷月 | 来源:发表于2020-08-06 10:39 被阅读0次

巧妙监测元素尺寸变化----原文地址

public onelresize(el: HTMLElement, handler: Function) {
  if (!(el instanceof HTMLElement)) {
    throw new TypeError("Parameter 1 is not instance of 'HTMLElement'.")
  }
  // https://www.w3.org/TR/html/syntax.html#writing-html-documents-elements
  if (
    /^(area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr|script|style|textarea|title)$/i.test(el.tagName)
  ) {
    throw new TypeError(
      'Unsupported tag type. Change the tag or wrap it in a supported tag(e.g. div).'
    )
  }
  if (typeof handler !== 'function') {
    throw new TypeError("Parameter 2 is not of type 'function'.")
  }
  let lastWidth = el.offsetWidth || 1
  let lastHeight = el.offsetHeight || 1
  const maxWidth = 10000 * lastWidth
  const maxHeight = 10000 * lastHeight

  // expand 监听 变大变化
  // shrink 监听 变小变化
  const expand = document.createElement('div')

  //隐藏辅助元素
  expand.style.cssText =
    'position:absolute;top:0;bottom:0;left:0;right:0;z-index=-10000;overflow:hidden;visibility:hidden;pointer-events: none;'
  const shrink = expand.cloneNode(false)

  const expandChild: HTMLElement = document.createElement('div')
  expandChild.style.cssText = 'transition:0s;animation:none;'
  const shrinkChild = expandChild.cloneNode(false)

  expandChild.style.width = maxWidth + 'px'
  expandChild.style.height = maxHeight + 'px'
  ;(shrinkChild as HTMLElement).style.width = '250%'
  ;(shrinkChild as HTMLElement).style.height = '250%'

  expand.appendChild(expandChild)
  shrink.appendChild(shrinkChild)
  el.appendChild(expand)
  el.appendChild(shrink)

  // 让 expand和shrink的父元素为el
  if (expand.offsetParent !== el) {
    el.style.position = 'relative'
  }

  expand.scrollTop = (shrink as HTMLElement).scrollTop = maxHeight
  expand.scrollLeft = (shrink as HTMLElement).scrollLeft = maxWidth

  let newWidth = 0
  let newHeight = 0

  function onScroll() {
    newWidth = el.offsetWidth || 1
    newHeight = el.offsetHeight || 1
    if (newWidth !== lastWidth || newHeight !== lastHeight) {
      requestAnimationFrame(onResize)
    }
    expand.scrollTop = (shrink as HTMLElement).scrollTop = maxHeight
    expand.scrollLeft = (shrink as HTMLElement).scrollLeft = maxWidth
  }

  function onResize() {
    if (newWidth !== lastWidth || newHeight !== lastHeight) {
      lastWidth = newWidth
      lastHeight = newHeight
      handler()
    }
  }

  expand.addEventListener('scroll', onScroll, false)
  shrink.addEventListener('scroll', onScroll, false)
}

相关文章

  • 巧妙监测元素尺寸变化

    巧妙监测元素尺寸变化----原文地址

  • 巧妙监测元素尺寸变化

    巧妙监测元素尺寸变化----原文地址

  • Array的变化侦测(二)

    侦测数组中元素变化 侦测数组的变化类比对Object的递归处理,我们也需要监测子项的变化。另外,数组与对象的使用需...

  • px、 em 、rem的特点

    px px是像素,表示绝对单位,不会因其他元素的尺寸变化而变化。 em em是根据父元素来对应大小,是一种相对值,...

  • 移动web页面布局研究

    常用移动布局方法 百分比布局 特点:所有的元素都根据其占父元素的百分比来设定尺寸大小。最终屏幕尺寸的变化会带来页面...

  • 重排和重绘

    重排(回流):当我们对 DOM 的修改引发了 DOM 几何尺寸的变化(比如修改了元素的宽、高或隐藏元素等)时,浏览...

  • css中常见的单位

    css中常见的单位 1. px表示像素,是绝对单位,不会因为其他元素的尺寸变化而变化,页面按照精确像素展示。div...

  • 打造付费社群课程学习4/21逍遥哥的骁骑营拆解

    一、巧妙设计海报,提升转化率 1、尺寸 1440*256 1220*720 刷屏的尺寸 2、背景颜色 ...

  • canvas基础部分

    一、canvas的绘图表面 canvas有两种尺寸 canvas元素自身元素的尺寸 canvas绘图表面的尺寸 如...

  • 元素尺寸位置

    offsetWidth/offsetHeight包括padding和border clientWidth/clie...

网友评论

      本文标题:巧妙监测元素尺寸变化

      本文链接:https://www.haomeiwen.com/subject/vvkzrktx.html