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 相关文章推荐
js 获取浏览器高度和宽度值(多浏览器)
Sep 02 Javascript
javascript学习笔记(二) js一些基本概念
Jun 18 Javascript
判断在css加载完毕后执行后续代码示例
Sep 03 Javascript
Jsonp post 跨域方案
Jul 06 Javascript
基于jquery日历价格、库存等设置插件
Jul 05 jQuery
vue对storejs获取的数据进行处理时遇到的几种问题小结
Mar 20 Javascript
vuex 的简单使用
Mar 22 Javascript
详解webpack的proxyTable无效的解决方案
Jun 15 Javascript
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
Apr 02 Javascript
详解小程序设置缓存并且不覆盖原有数据
Apr 15 Javascript
layui 动态设置checbox 选中状态的例子
Sep 02 Javascript
js实现转动骰子模型
Oct 24 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
php trim 去除空字符的定义与语法介绍
2010/05/31 PHP
php设计模式 FlyWeight (享元模式)
2011/06/26 PHP
thinkPHP使用post方式查询时分页失效的解决方法
2015/12/09 PHP
Laravel的throttle中间件失效问题解决方法
2016/10/09 PHP
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
2016/10/26 PHP
PHP基于回溯算法解决n皇后问题的方法示例
2017/11/07 PHP
javascript不同页面传值的改进版
2008/09/30 Javascript
js身份证验证超强脚本
2008/10/26 Javascript
Dom在ajax技术中的作用说明
2010/10/25 Javascript
jQuery表格行换色的三种实现方法
2011/06/27 Javascript
Node.js重新刷新session过期时间的方法
2016/02/04 Javascript
原生js三级联动的简单实现代码
2016/06/07 Javascript
用JS实现轮播图效果(二)
2016/06/26 Javascript
jQuery内容筛选选择器实例代码
2017/02/06 Javascript
利用nodejs监控文件变化并使用sftp上传到服务器
2017/02/18 NodeJs
javascript实现数字配对游戏的实例讲解
2017/12/14 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
2018/01/26 Javascript
基于mpvue搭建微信小程序项目框架的教程详解
2019/04/10 Javascript
python链接Oracle数据库的方法
2015/06/28 Python
python3+PyQt5实现使用剪贴板做复制与粘帖示例
2017/01/24 Python
python 第三方库的安装及pip的使用详解
2017/05/11 Python
python通过伪装头部数据抵抗反爬虫的实例
2018/05/07 Python
利用Python将每日一句定时推送至微信的实现方法
2018/08/13 Python
用Python批量把文件复制到另一个文件夹的实现方法
2019/08/16 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
2020/02/03 Python
以SQLite和PySqlite为例来学习Python DB API
2020/02/05 Python
Python3.x+pyqtgraph实现数据可视化教程
2020/03/14 Python
Python3以GitHub为例来实现模拟登录和爬取的实例讲解
2020/07/30 Python
英国休闲奢华的缩影:Crew Clothing
2019/05/05 全球购物
英国羊皮鞋类领先品牌:Just Sheepskin
2019/12/12 全球购物
Python如何实现单例模式
2016/06/03 面试题
小学生家长寄语
2014/04/02 职场文书
德育标兵事迹材料
2014/08/24 职场文书
农业项目建议书
2014/08/25 职场文书
2014年设计师工作总结
2014/11/25 职场文书
2017年大学生寒假社会实践活动总结
2016/04/06 职场文书