JavaScript中clientWidth,offsetWidth,scrollWidth的区别


Posted in Javascript onJanuary 25, 2021

一、概念

它们都是Element的属性,表示元素的宽度:

Element.clientWidth    内容+内边距-滚动条-----不包括边框和外边距  == 可视内容
Element.scrollWidth    内容+内边距+溢出尺寸-----不包括边框和外边距  ==实际内容
Element.offsetWidth   元素的宽度(内容+内边距+边框+滚动条)==整体,整个控件

二、举例

1、仅有横向滚动条的情况

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>测试scrollWidth、clientWidth、offsetWidth</title>
 <style type="text/css">
  body, html {
   margin: 0px;
   padding: 0px;
  }

  #father {
   width: 300px;
   overflow: auto;
   padding: 10px;
   background: rebeccapurple;
   border: 10px solid red;
   margin: 20px;
  }

  #child {
   height: 100px;
   width: 1000px;
   padding: 10px;
   border: 20px solid #ffcc99;
   margin: 30px;
  }
 </style>
</head>
<body>

<div id="father">
 <div id="child"></div>
</div>

<script type="text/javascript">
 var child = document.getElementById("child");
 console.log("child.width:", window.getComputedStyle(child).width); //内容的宽度:1000px
 console.log("child.clientWidth:", child.clientWidth); //内容+内边距-滚动条-----不包括边框和外边距 == 可视内容 1020px
 console.log("child.scrollWidth:", child.scrollWidth); //内容+内边距+溢出尺寸-----不包括边框和外边距 ==实际内容 1020px
 console.log("child.offsetWidth:", child.offsetWidth); //元素的宽度(内容+内边距+边框+滚动条)==整体,整个控件  1060px

 var father = document.getElementById("father");
 console.log("father.width:", window.getComputedStyle(father).width); //内容的宽度:300px
 console.log("father.clientWidth:", father.clientWidth); //内容+内边距-滚动条-----不包括边框和外边距 == 可视内容 320px
 console.log("father.scrollWidth:", father.scrollWidth); //内容+内边距+溢出尺寸-----不包括边框和外边距 ==实际内容 1100px
 console.log("father.offsetWidth:", father.offsetWidth); //元素的宽度(内容+内边距+边框+滚动条)==整体,整个控件  340px
</script>
</body>
</html>

仅有横向滚动条的情况时,父元素收受到子元素宽度的影响,其他比较特别的是scrollWidth。

父元素的scrollWidth是:子元素的content+padding+border+子元素一边的margin+父元素一边的padding。

2、有横向滚动条和竖向滚动条的情况

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>测试scrollWidth、clientWidth、offsetWidth</title>
 <style type="text/css">
  body, html {
   margin: 0px;
   padding: 0px;
  }

  #father {
   height: 50px;
   width: 300px;
   overflow: auto;
   padding: 10px;
   background: rebeccapurple;
   border: 10px solid red;
   margin: 20px;
  }

  #child {
   height: 100px;
   width: 1000px;
   padding: 10px;
   border: 20px solid #ffcc99;
   margin: 30px;
  }
 </style>
</head>
<body>

<div id="father">
 <div id="child"></div>
</div>

<script type="text/javascript">
 var child = document.getElementById("child");
 console.log("child.width:", window.getComputedStyle(child).width); //内容的宽度:1000px
 console.log("child.clientWidth:", child.clientWidth); //内容+内边距-滚动条-----不包括边框和外边距 == 可视内容 1020px
 console.log("child.scrollWidth:", child.scrollWidth); //内容+内边距+溢出尺寸-----不包括边框和外边距 ==实际内容 1020px
 console.log("child.offsetWidth:", child.offsetWidth); //元素的宽度(内容+内边距+边框+滚动条)==整体,整个控件  1060px

 var father = document.getElementById("father");
 console.log("father.width:", window.getComputedStyle(father).width); //内容的宽度:285px
 console.log("father.clientWidth:", father.clientWidth); //内容+内边距-滚动条-----不包括边框和外边距 == 可视内容 305px
 console.log("father.scrollWidth:", father.scrollWidth); //内容+内边距+溢出尺寸-----不包括边框和外边距 ==实际内容 1100px
 console.log("father.offsetWidth:", father.offsetWidth); //元素的宽度(内容+内边距+边框+滚动条)==整体,整个控件  340px
</script>
</body>
</html>

父元素的width为:父元素的content宽度-滚动条的宽度(大约为15px)

父元素的clientWidth为:父元素的content宽度+父元素padding宽度-滚动条宽度(大约为15px)

以上就是Element中clientWidth,offsetWidth,scrollWidth的区别的详细内容,更多关于clientWidth,offsetWidth,scrollWidth的区别的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
for 循环性能比较 提高for循环的效率
Mar 19 Javascript
菜鸟javascript基础整理1
Dec 06 Javascript
jQuery实现内容定时切换效果完整实例
Apr 06 Javascript
jQuery中设置form表单中action值的实现方法
May 25 Javascript
JS中动态创建元素的三种方法总结(推荐)
Oct 20 Javascript
javascript ES6中箭头函数注意细节小结
Feb 17 Javascript
微信小程序图片选择、上传到服务器、预览(PHP)实现实例
May 11 Javascript
bootstrap的工具提示实例代码
May 17 Javascript
node简单实现一个更改头像功能的示例
Dec 29 Javascript
详解如何从零开始搭建Express+Vue开发环境
Jul 17 Javascript
vue+echarts实现动态绘制图表及异步加载数据的方法
Oct 17 Javascript
JS实现的碰撞检测与周期移动完整示例
Sep 02 Javascript
vue keep-alive的简单总结
Jan 25 #Vue.js
JS实现简易日历效果
Jan 25 #Javascript
javascript代码实现简易计算器
Jan 25 #Javascript
js简单粗暴的发布订阅示例代码
Jan 23 #Javascript
JS中循环遍历数组的四种方式总结
Jan 23 #Javascript
vue form表单post请求结合Servlet实现文件上传功能
Jan 22 #Vue.js
原生js实现自定义难度的扫雷游戏
Jan 22 #Javascript
You might like
增加反向链接的101个方法 站长推荐
2007/01/31 PHP
php中json_encode不兼容JSON_UNESCAPED_UNICODE的解决方案
2016/05/31 PHP
PHP实现带重试功能的curl连接示例
2016/07/28 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
PHP实现的mongoDB数据库操作类完整实例
2018/04/10 PHP
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
2010/04/18 Javascript
setTimeout和setInterval的深入理解
2013/11/08 Javascript
解决jquery实现的radio重新选中的问题
2015/07/03 Javascript
基于JQuery实现仿网易邮箱全屏动感滚动插件fullPage
2015/09/20 Javascript
Javascript实现代码折叠功能
2016/08/25 Javascript
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
利用vue + koa2 + mockjs模拟数据的方法教程
2017/11/22 Javascript
vue.js内置组件之keep-alive组件使用
2018/07/10 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
如何在JavaScript中优雅的提取循环内数据详解
2019/03/04 Javascript
ES6 Array常用扩展的应用实例分析
2019/06/26 Javascript
vue 内联样式style中的background用法说明
2020/08/05 Javascript
swiper实现导航滚动效果
2020/12/13 Javascript
python格式化字符串实例总结
2014/09/28 Python
Python实现类的创建与使用方法示例
2017/07/25 Python
Python对列表去重的多种方法(四种方法)
2017/12/05 Python
python 从文件夹抽取图片另存的方法
2018/12/04 Python
Python配置虚拟环境图文步骤
2019/05/20 Python
Python自定义一个异常类的方法
2019/06/27 Python
Pygame的程序开始示例代码
2020/05/07 Python
详解Pycharm与anaconda安装配置指南
2020/08/25 Python
css3实现针线缝合效果(图解步骤)
2013/02/04 HTML / CSS
html5 跨文档消息传输示例探讨
2013/04/01 HTML / CSS
采购部部门职责
2013/12/15 职场文书
竞选学习委员演讲稿
2014/04/28 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
效能风暴心得体会
2014/09/04 职场文书
辛亥革命观后感
2015/06/02 职场文书
大卫科波菲尔读书笔记
2015/06/30 职场文书
Pytorch中Softmax与LogSigmoid的对比分析
2021/06/05 Python
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL