最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 各种高度clientHeight/scrollHeight/offsetHeight及应用

    正文概述 掘金(hchen)   2020-11-24   678

    总结

    • clientWidth/clientHeight 返回值包含 content + padding,如有滚动条,也不包含滚动条

    • scrollWidth/scrollHeight 返回值包含 content + padding + 溢出内容的尺寸

    • offsetWidth/offsetHeight 返回值包含 content + padding + border,效果与element.getBoundingClientRect() 相同

    • window.innerHeight:获取浏览器视觉视口高度(包括垂直滚动条)。

    • window.outerHeight:获取浏览器窗口外部的高度。

    表示整个浏览器窗口的高度,包括侧边栏、窗口镶边和调正窗口大小的边框。

    • window.screen.Height:获取获屏幕取理想视口高度,这个数值是固定的,设备的分辨率/设备像素比

    • window.screen.availHeight:浏览器窗口可用的高度。

    • document.body.clientHeight:获取浏览器布局视口高度,包括内边距,但不包括垂直滚动条、边框和外边距。

    scroll client offset

    scrollWidth/scrollHeight

    element.scrollHeight/scrollWidth = content + padding + 溢出内容的尺寸

    表示一个元素内容区域的实际大小, 包括不在页面中的可滚动部分

    scrollTop

    offsetTop 是当前元素顶部距离最近父元素顶部的距离,和有没有滚动条没有关系

    scrollTop 在有滚动条的情况下,为元素可视区域距离元素顶部的像素,也就是已经滚动了多少距离

    clientWidth/clientHeight

    element.clientHeight/clientWidth = content + padding (如有滚动条,也不包含滚动条)

    内容区域的显示大小

    offsetWidth/offsetHeight

    offsetWidth/offsetHeight = content + padding + border

    box-sizing: border-box + 滚动条 box-sizing: content-box + padding + border + 滚动条

    offsetWidth 就表示元素的布局宽高,并不代表实际渲染出来的宽高

    比如,当元素的形状发生变化时(放大或缩小等)

    element.getBoundingClientRect()

    渲染的宽高请使用 getBoundingClientRect() 方法计算得到真正的 offsetWidth

    当元素的形状发生变化时(比如说放大或缩小),offsetWidth 就表示元素的布局宽高,并不代表实际渲染出来的宽高

    使用 element.getBoundingClientRect() 只能获取元素的 width / height, 但是这个值是 offsetWidth / offsetHeight ,包括边框的长度。

    所以不能获取 clientWidth / clientHeight。

    应用

    • 图片懒加载——当图片滚动到可见时才进行加载
    • 内容无限滚动——也就是用户滚动到接近内容底部时直接加载更多,而无需用户操作翻页,给用户一种网页可以无限滚动的错觉
    • 检测广告的曝光情况——为了计算广告收益,需要知道广告元素的曝光情况
    • 在用户看见某个区域时执行任务

    频繁触发问题,配合 节流/防抖。

    或者 Intersection Observer API可以自动观察元素是否在视口内。(注意兼容性)

    判定元素是否滚动到底

    element.scrollHeight - element.scrollTop === element.clientHeight

    图片懒加载位置判断

    以垂直方向滚动为例子

    imgEle.getBoundingClientRect().top > 0 && (imgEle.getBoundingClientRect().top < document.body.clientHeight)

    在视口区的范围内,没滚动到视口区的上方。

    <img src={picUrl} src={require('../xxx/default.png')} alt={name} />
    
    let images = el.querySelectorAll('img');
    if (!images || !images.length) {
        return;
    }
    images = [].slice.call(images);
    images.forEach(function(imgDom) {
        const { top } = imgDom.getBoundingClientRect()
        if (top > 0 && top < document.body.clientHeight) {
            if (imgDom.getAttribute('data-src') == null || imgDom.getAttribute('data-src') === 'done') {
                return
            }
            imgDom.src = imgDom.getAttribute('data-src');
            imgDom.setAttribute('data-src', 'done');
            imgDom.onerror = function() {
                this.src = require('../xxx/default.png');
            }
        }
    })
    

    扩展

    当容器不滚动但有溢出的子容器时,这些检查可以确定容器能否滚动: window.getComputedStyle(element).overflowY === 'visible' || window.getComputedStyle(element).overflowY !== 'hidden'


    起源地下载网 » 各种高度clientHeight/scrollHeight/offsetHeight及应用

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元