详细了解 clientWidth、clientHeight、clientLeft、clientTop 以及几个常用的场景

详细了解 clientWidth、clientHeight、clientLeft、clientTop 以及几个常用的场景clientLeft、clientHeight、clientWidth、clientHeightclientWidth、clientHeight元素内部宽度和高度,clientLeft、clientTop获取元素内边距边框到边框的距离.大概如下图所示:clientWidth属性表示元素的内部宽度,以像素计。该属性包括内边距,但不包括垂直滚动条(如果有)、边框和外边距。如上图所示,计算方式为,分为如下两种:存在垂直滚动条 contentwidth+paddin…

大家好,又见面了,我是你们的朋友全栈君。

clientLeft、clientHeight、clientWidth、clientHeight

clientWidthclientHeight 元素内部宽度和高度, clientLeftclientTop 获取元素内边距边框到边框的距离.

大概如下图所示:

图片描述

clientWidth

属性表示元素的内部宽度,以像素计。该属性包括内边距,但不包括垂直滚动条(如果有)、边框和外边距。

如上图所示, 计算方式为, 分为如下两种:

  • 存在垂直滚动条

    content width + padding – scollbarWidth

  • 不存在滚动条

    content width + padding

clientHeight

属性表示元素内部的高度(单位像素),包含内边距,但不包括水平滚动条、边框和外边距。

如上图所示, 计算方式为如下两种:

  • 存在水平滚动条

    content height + padding – scollbarWidth

  • 不存在滚动条

    content height + padding

clientLeft

表示一个元素的左边框的宽度.

计算方式为如下两种情况:

  • 如果文字方向从右往左(默认从左往右,通过设置 direction: rtl;)进行排列,且存在垂直滚动条的情况下

    border width + scollbar width

  • 默认情况下

    border width

注意:

如果当前元素是行内元素(inline)时, clientLeft将返回 0;

clientTop

表示一个元素的上边框的宽度.

把基本的情况介绍完了看看具体实例,代码如下:


<style>
    .box {
        width: 200px;
        height: 200px;
        overflow: hiddle;
        margin: 10px;
        padding: 10px;
        border: 5px solid black;
        background-color: #ccc;
        direction: rtl;
    }
</style>
<div class="box" id="box">
</div>

<script>
    var ele = document.querySelector("#box");
    var clientWidth = ele.clientWidth;
    var clientHeight = ele.clientHeight;
    var clientLeft = ele.clientLeft;
    var clientTop = ele.clientTop;

    console.log(clientWidth, clientHeight, clientLeft, clientTop);
    // 220 , 220, 5, 5
</script>

这是不存在水平和垂直,以及文字按照默认情况下排列.

下面我将对上面实例进行如下修改:

  • 给元素 .box 添加 overflow:scroll 让它显示滚动条, 再来看看每个值:

    <style>
        .box {
            ...
            overflow: scroll;
        }
    </style>

   <script>
        console.log(clientWidth, clientHeight, clientLeft, clientTop);
        // 203, 203, 5, 5
   </script>

如下图所示:

图片描述

从输出答应结果来看, clientWidth 、clientHeight 变小了,也就是说不包含其滚动条.

  • 改变容器文字输出方向,看看 clientLeft 值会不会像之前说的会加上滚动条的width ?

    <style>
        .box {
            ...
            overflow: scroll;
            direction: rtl;
        }
    </style>

   <script>
        console.log(clientWidth, clientHeight, clientLeft, clientTop);
        // 203, 203, 22, 5
   </script>

如下图所示:

图片描述

从打印结果来看, 改变文字方向(rtl)并且存在处置滚动条情况下:clientLeft = scrollbarWidth + borderLeftWidth

使用场景

计算滚动条宽度

默认情况下(没有滚动条情况下) 
clientWidth = content width + paddingLeftWidth + paddingRightWidth;
对上面示例来说 clientWidth = 200 + 10 + 10;

有滚动条情况下:
clientWidth = (content width + paddingLeftWidth + paddingRightWidth) - scrollbarWidth

可以推断出滚动条计算方式:
scrollbarWidth = (content width + paddingLeftWidth + paddingRightWidth) - clientWidth;

clientWidth 已知, 从上面公式来看只要知道内容区域大小和左右padding值即可


    var ele = document.querySelector("#box");
    var computedStyle = window.getComputedStyle(ele);
    var offsetWidth = ele.offsetWidth; // content widht + padding width + border width (包含滚动条)
    var ceil = function(v){
        return Math.ceil(parseFloat(v))
    }
    var maxClientWidth = offsetWidth
        - ceil(computedStyle.borderLeftWidth)
        - ceil(computedStyle.borderRightWidth);  // ClientWidth 最大值(理想情况下, 也就是不存在滚动条)

    var scrollbarWidth = maxClientWidth          // 滚动条大小
        - ceil(ele.clientWidth);

    console.log(scrollbarWidth); // 17

这样就计算出滚动条的 width, 高度同理可得.

上面因为使用 getComputedStyle 只能兼容到 IE9+、Chrome、Firefox、Safari 等 , 需要兼容IE8以及以下版本,可以作下兼容处理:


    // 这里如果IE8以下则需要改为 getElementById
    var selector = function (selectorName) {
        if (!selectorName && !(typeof selectorName === "string")) { return {} };
        var prefix = /^#/;
        if (document.querySelector) {
            selectorName = prefix.test(selectorName) ? selectorName.substr(1) : selectorName;
            return document.querySelector(selectorName);
        } else if(document.getElementById) {
            selectorName = prefix.test(selectorName) ? selectorName : "#" + selectorName;
            return document.getElementById(selectorName);
        }
    }

    var selector = selector("box");  
    var computedStyle = window.getComputedStyle === undefined ? ele.currentStyle : window.getComputedStyle(ele);
    var offsetWidth = ele.offsetWidth; // content widht + padding width + border width (包含滚动条)
    var ceil = function (v) {
        return Math.ceil(parseFloat(v))
    }
    var maxClientWidth = offsetWidth
        - ceil(computedStyle.borderLeftWidth)
        - ceil(computedStyle.borderRightWidth);  // ClientWidth 最大值(理想情况下, 也就是不存在滚动条)

    var scrollbarWidth = maxClientWidth          // 滚动条大小
        - ceil(ele.clientWidth);

    console.log(scrollbarWidth); // 17

元素内部实际可用区域

可用区域其实就是内容可以排放的空间, 其可见区域宽度其实就是 clientWidth - paddingLeftWidth - paddingRightWidth 的值. 

比求滚动条宽度相对简单点, 只需要知道左右内边距的大小即可.


     var selector = function (selectorName) {
        if (!selectorName && !(typeof selectorName === "string")) { return {} };
        var prefix = /^#/;
        if (document.querySelector) {
            selectorName = prefix.test(selectorName) ? selectorName.substr(1) : selectorName;
            return document.querySelector(selectorName);
        } else if(document.getElementById) {
            selectorName = prefix.test(selectorName) ? selectorName : "#" + selectorName;
            return document.getElementById(selectorName);
        }
    }

    var selector = selector("box");  
    var computedStyle = window.getComputedStyle === undefined ? ele.currentStyle : window.getComputedStyle(ele);
    var ceil = function (v) {
        return Math.ceil(parseFloat(v))
    }
    console.log(ele.clientWidth - ceil(computedStyle.paddingLeft) - ceil(computedStyle.paddingRight));

上面计算方式没有什么固定,仅供参考. 更好计算方式也可以推荐下. ~ 比如通过 getBoundingClientRect()

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/163068.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 网络爬虫原理

    目录1网络爬虫原理2写网络爬虫的原因3网络爬虫的流程4网络抓包5HTTP状态码说明6Java网络爬虫需要的基础知识1、网络爬虫原理网络爬虫指按照一定的规则(模拟人工登录网页的方式),自动抓取网络上的程序。简单的说,就是讲你上网所看到页面上的内容获取下来,并进行存储。网络爬虫的爬行策略分为深度优先和广度优先。如下图是深度优先的一种遍历方式是A到B到D到E到C

  • Wix 安装部署(五) Bootstrapper 捆绑安装

    Wix 安装部署(五) Bootstrapper 捆绑安装原文:Wix安装部署(五)Bootstrapper捆绑安装   Wix的xml配置确实很费劲,忍不住有点像吐槽一下,前四篇完成的功能在WindowsInstaller中通过配置能很快的弄出来。可惜有很多加了锁的功能在InstallShieldLimitedEdition版本中是用不了的。但基本满足安装需求了。按照这个目录(下图)一个一个去配,配出来的也像样了(这里就不说了)。…

  • 启动马达接线实物图_星三角降压启动电路图实物接线图「建议收藏」

    启动马达接线实物图_星三角降压启动电路图实物接线图「建议收藏」星三角降压启动实物接线第一个交流接触器输出U1V1W1接在电机的U1V1W1上,第二个交流接触器输出U2V2W2上就好了,关于倒电机方向,第一个交流接触器输出U1V1倒换,第二个交流接触器输出U2V2也同时倒换就行了。原理告诉你:星线启动时KM1和KM3吸合,形成星型启动,这时电机每相绕组电压是210V左右,所以降压。一定时间后KM3释放,KM2吸合,这时电机每相绕组电压是38…

  • 【云原生】第十二篇–docker容器镜像仓库Harbor部署[通俗易懂]

    【云原生】第十二篇–docker容器镜像仓库Harbor部署[通俗易懂]由于国内访问国外的容器镜像仓库速度比较慢,因此国内企业创建了容器镜像加速器,以方便国内用户使用容器镜像。Harbor是VMware公司开源的企业级DockerRegistry项目,其目标是帮助用户迅速搭建一个企业级的Dockerregistry服务。它以Docker公司开源的registry为基础,提供了管理UI,基于角色的访问控制(RoleBasedAccessControl),AD/LDAP集成、以及审计日志(Auditlogging)等企业用户需求的功能,同时还原生支持中文。…

    2022年10月25日
  • pci接口千兆网卡_千兆汇聚 和万兆网卡

    pci接口千兆网卡_千兆汇聚 和万兆网卡pcie接口是一种高速串行计算机扩展总线标准,是高速串行点对点双通道高带宽传输,所连接的设备分配独享通道带宽,不共享总线带宽,是替代旧的PCI,PCI-X和AGP总线标准的,主要支持主动电源管理,错误报告,端对端的可靠性传输,热插拔以及服务质量(QOS)等功能。PCIE接口的优势:相对于传统PCI总线在单一时间周期内只能实现单向传输,PCIE的双单工连接能提供更高的传输速率和质量。PCI-E插槽是…

  • 小米9刷面具和模块[通俗易懂]

    小米9刷面具和模块[通俗易懂]准备工作:没解BL锁的需要先解锁1.按住音量键下和关机键进入Fastboot模式连接电脑2.这里使用奇兔刷机连接手机,中途会自动安装驱动,若安装驱动失败可使用驱动精灵或驱动人生手动安装驱动.安装完驱动后奇兔刷机会显示已经连接到手机开启root:1.下载twrphttps://twrp.me/xiaomi/xiaomimi9.html2.1.把Magisk-v20.4.zip和magisk-taichi

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号