在写实例理解scrollWidth,clientWidth,innearWidth,availWidth及offsetWidth等的时候,意外的又发现了margin值合并的问题,在这里同时记录下

1.偏移量的区别

  • html文件(自己写的示例)
  1. <div id="root">
  2. <div class="box">
  3. <div class="content"></div>
  4. </div>
  5. </div>
  • css样式
  1. <style>
  2. body, html{
  3. padding: 0;
  4. margin: 0;
  5. }
  6. #root{
  7. /*position: relative;*/
  8. margin: 0 auto;
  9. width: 1200px;
  10. /*border: 1px solid black;*/
  11. }
  12. .box{
  13. overflow: scroll;
  14. margin: 5px;
  15. padding: 20px;
  16. width: 500px;
  17. height: 600px;
  18. border: 2px solid blueviolet;
  19. /*box-sizing: border-box;*/
  20. background: linear-gradient(to right, rgb(85, 181, 255), rgb(207, 224, 232));
  21. }
  22. .content{
  23. width: 530px;
  24. height: 600px;
  25. }
  26. </style>
  • 较多见的属性
  1. clientWidth: 指可见区的宽度(网页,或者元素)
  2. clientHeight: 指可见区的高度(网页,或者元素)
  3. offsetWidth: 指元素的宽度(网页,或者元素)
  4. offsetHeight: 指元素的高度(网页,或者元素)
  5. scrollTop: 滚动条的滚动距离
  6. scrollLeft: 滚动条的滚动距离
  7. availWidth: 屏幕可用区宽度
  8. availHeight: 屏幕可用区高度
  • script
  1. <script>
  2. (function() {
  3. let elementName = document.getElementsByClassName('box')[0];
  4. let elementContent = document.getElementsByClassName('content')[0];
  5. /* offsetWidth为元素的宽度,返回数值,只读属性(可以读取css文件里的值,也可以读取内联样式里的值)
  6. * 当box-sizing为content-box时,offsetWidth=(padding-left)+(padding-right)+(border-left)+(border-right)+width
  7. * 当box-sizing为border-box时,offsetWidth=width
  8. * 当元素本身未设置宽时,读取的是父元素的宽度减去元素本身设置的margin值
  9. * */
  10. let elementWidth = elementName.offsetWidth;
  11. console.log(elementWidth);
  12. /* clientWidth为元素的宽度,返回数值,只读属性(可以读取css文件里的值,也可以读取内联样式里的值)
  13. * 在元素未溢出时:
  14. * 当box-sizing为content-box时,clientWidth=(padding-left)+(padding-right)+width
  15. * 当box-sizing为border-box时,clientWidth=width-(border-left)-(border-right)
  16. * 当元素本身未设置宽时,读取的是父元素的宽度减去元素本身设置的border值
  17. * 元素溢出时(子元素宽度大于父元素宽度):
  18. * clientWidth为除了边框及X、Y向滚动条的宽度(可视区)
  19. * */
  20. let elemClientWidth = elementName.clientWidth;
  21. console.log(elemClientWidth);
  22. /* style.width为元素的宽度,返回字符串(包含单位),可读写
  23. * 原样的输出内联style里设置的width值,必须显示的设置,否则为空
  24. * */
  25. let styleWidth = elementName.style.width;
  26. console.log(styleWidth);
  27. /* scrollWidth为元素的宽度,返回数值(包含padding值,不包含边框宽度值)
  28. * 当元素没有溢出时(子元素宽度小于父元素宽度):此时与clientWidth值一样
  29. * 当元素溢出时:(溢出值=子元素offsetWidth-[父元素offsetWidth-(父padding-left)-(父border-left)])
  30. * 当子元素box-sizing为content-box时,scrollWidth=子元素offsetWidth+(父padding-right)
  31. * 当子元素box-sizing为border-box时,
  32. * scrollWidth=子元素offsetWidth+(父padding-right)-(子border-left)-(子border-right)-(子padding-right)-(子padding-left)
  33. * */
  34. let elemScrollWidth = elementName.scrollWidth;
  35. console.log(elemScrollWidth);
  36. /* offsetTop为元素的上外缘距离最近采用定位的父元素内壁的距离,返回数值,只读
  37. * 如果父元素中没有采用定位的,则是获取元素的上外边缘距离文档对象内壁的距离
  38. * 定位只能为position:relative,其他定位值获取的是文档对象内壁的距离
  39. * */
  40. let elemOffsetTop = elementName.offsetTop;
  41. console.log(elemOffsetTop);
  42. /* offsetLeft为元素的左外缘距离最近采用定位的父元素内壁的距离,返回数值,只读
  43. * 如果父元素中没有采用定位的,则是获取元素的左外边缘距离文档对象内壁的距离
  44. * 定位只能为position:relative,其他定位值获取的是文档对象内壁的距离
  45. * */
  46. let elemOffsetLeft = elementName.offsetLeft;
  47. console.log(elemOffsetLeft);
  48. /* scrollHeight为元素内容的实际高度
  49. * 包括元素高度、内边距和溢出尺寸,不包括边框和外边距
  50. * 无溢出的情况,与clientHeight相同
  51. * */
  52. let elemScrollHeight = elementName.scrollHeight;
  53. console.log(elemScrollHeight);
  54. /* scrollTop可以获取或者设置对象的最顶部到对象所在当前窗口显示的范围内的顶边的距离
  55. * 也就是元素滚动条被向下拉动的距离
  56. * 返回数值,可读写
  57. * */
  58. let documentScrollTop = document.documentElement.scrollTop || document.body.scrollTop;
  59. console.log(documentScrollTop);
  60. /* scrollLeft可以获取或者设置对象的最左边到对象在当前窗口显示的范围内的左边的距离
  61. * 也就是元素被滚动条向左拉动的距离
  62. * 返回数值,可读写
  63. * */
  64. let documentScrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
  65. console.log(documentScrollLeft);
  66. /* innerWidth窗口的文档显示区的宽度(不包含工具条与滚动条),返回一个数值 */
  67. let windowInnerWidth = window.innerWidth;
  68. console.log(windowInnerWidth);
  69. /* availWidth为浏览器屏幕的可用宽度,返回数值 */
  70. let screenAvailWidth = screen.availWidth;
  71. console.log(screenAvailWidth);
  72. /* clientWidth为可视区的宽度,不包含滚动条的宽度 */
  73. let documentClientWidth = document.documentElement.clientWidth || document.body.clientWidth;
  74. console.log(documentClientWidth);
  75. elementName.onmousemove = function(event) {
  76. /* eventX为鼠标相对于浏览器有效区域(除去工具栏等非html文档的区域)左上角x轴的坐标,不随滚动条滚动而改变 */
  77. let eventX = event.clientX;
  78. console.log(eventX);
  79. /* pageX为鼠标相对于浏览器有效区域(除去工具栏等非html文档的区域)左上角x轴的坐标,随滚动条滚动而改变 */
  80. let pageX = event.pageX;
  81. console.log(pageX);
  82. /* screenX为鼠标相对于显示器屏幕左上角x轴的坐标 */
  83. let screenX = event.screenX;
  84. console.log(screenX);
  85. /* offsetX为鼠标相对于事件源左上角X轴的坐标 */
  86. let offsetX = event.offsetX;
  87. console.log(offsetX);
  88. }
  89. })()
  90. </script>



  • 下面这个的话是我百度找的图片

这个图我感觉有点复杂的样子,

2.margin值合并的问题

  • 当两个垂直外边距相遇时,它们将形成一个外边距。合并的外边距的高度等于两个发生合并的外边距的高度中的较大者
  • 还有一种就是:当父元素没有设置内边距或边框,以及触发BFC时,如果子元素的值大于父元素时,它会带着父元素一起偏移,此时子元素是相对除了它父级之外的离它最近的元素偏移的
  • 解决方法的话,可以改变两者的margin值,或者对元素设置border、padding,或者形成BFC

3.关于BFC(块格式化上下文)

  • 内部的box会在垂直方向,一个接一个的放置
  • Box垂直方向的距离由margin决定,属于同一个bfc的两个相邻box的margin会发生重叠
  • 每个元素的margin box 的左边,与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此
  • Bfc的区域不会与float box重叠
  • Bfc就是页面上的一个隔离的独立的容器,容器里面的元素不会影响到外面的元素,反之也是如此
  • 计算bfc的高度时,浮动元素也会参与计算

4.形成bfc的条件

  • 浮动元素,float除none外的值
  • 绝对定位元素,position(absolute,flxed)
  • display:inline-block,table-cells,table-captions
  • overflow除了visible以外的值

正在努力学习中,若对你的学习有帮助,留下你的印记呗(点个赞咯^_^)

关于scroll,client,innear,avail,offset等的理解的更多相关文章

  1. JavaScript 特效之四大家族(offset/scroll/client/event)

      三大系列:offset.scroll.client 事件对象:event(事件被触动时,鼠标和键盘的状态)(通过属性控制)   三大系列都是以DOM元素节点的属性形式存在的. 类比访问关系,也是以 ...

  2. client系列、offset系列、scroll系列

    一.client系列 clientWidth/clientHeight    是我们设置的宽和高加上内边距(没有边框) clientLeft/clientTop 就是我们设置的边框值 二.offset ...

  3. offset / scroll / client Left / Top

    1.offsetHeight / Width (只读) offsetHeight:表示该元素在垂直方向占用的空间大小,包含元素的高度+上边框高度+下边框高度 offsetWidth:表示该元素在水平方 ...

  4. 三大家族,offset,scroll,client

    1.client 1.1主要成员 1.clientWidth 获取网页可视区域宽度(两种用法)    clientHeight 获取网页可视区域高度 (两张用法) 盒子调用: 指盒子本省 浏览器调用: ...

  5. offset,scroll,client系列

    offsetHeight: 元素高,height+border+paddingoffsetWidth: 元素宽,width+border+paddingoffsetTop: 距离offsetParen ...

  6. offset/client/scroll一些总结

    offset/client/scroll一些总结 1.offset 首先offset共有五个值 1.offsetParent 2.offsetTop 3.offsetLeft 4.offsetWidt ...

  7. 三大家族(offset、scroll、client)

    offset.scroll.client三大家族 offset家族 offsetWidth 与 offsetHeight offset 偏移 用于获取元素自身的位置和大小 offsetWidth和of ...

  8. 第52天:offset家族、scroll家族和client家族的区别

    一.offset家族 1.offsetWidth offsetHeight offsetLeft offsetTop offsetParent共同组成了offset家族,用来获取元素尺寸. offse ...

  9. JavaScript-client、offset、scroll、定时器

    client offset scroll client.offset.scroll系列 他们的作用主要与计算盒模型,盒子的偏移量和滚动有关 clientTop 内容区域到边框顶部的距离, 说白了, 就 ...

随机推荐

  1. 解决IDEA中自动生成返回值带final修饰的问题

    修改配置文件: Editor--Code Style--Java--Code Generation--将Make generated local variables final勾选上

  2. java 覆盖

    作者:又见那斯 java中覆盖基于面向对象三大特征之:继承,同时又和另一特征:多态有重要的联系,本文中讨论的有关java中覆盖的一些知识,其实在写代码的时候或许不会用到,不过知道的话总会有用处.如有错 ...

  3. 微信小程序css篇----flex模型

    一.Flex布局是什么? Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为Flex布局. .box{displ ...

  4. ThinkPHP5 支付宝支付扩展库(超级简单,超级好用!)

    ThinkPHP5 支付宝支付扩展库, 一个静态方法的调用就可以实现,包括手机网站支付.电脑网站支付.支付查询.退款.退款查询.对账单所有功能,而且是2017年7月20日最新版~我的想法是,调用一个静 ...

  5. maven多模块tomcat启动报 NoClassDefFoundError:com/test/main/message

    maven多模块tomcat启动报 NoClassDefFoundError:com/test/main/message 扫描不到 添加子模块jar包

  6. 46. Permutations (JAVA)

    Given a collection of distinct integers, return all possible permutations. Example: Input: [1,2,3] O ...

  7. AFNetworking2.0源码解析<二>

    本篇我们继续来看看AFNetworking的下一个模块 — AFURLRequestSerialization.   AFURLRequestSerialization用于帮助构建NSURLReque ...

  8. C# Base64加解密

    using System; using System.Collections.Generic; using System.Text; using System.Security.Cryptograph ...

  9. 利用mysql中if函数排序

    格式:IF(Condition,A,B) 意义:当Condition为TRUE时,返回A:当Condition为FALSE时,返回B. 作用:作为条件语句使用. select if(`from_use ...

  10. dll和ocx的区别

    ActiveX,OLE是基于COM的一种应用,其文件后缀一般以dll和ocx结尾:ocx作为一种特殊的dll文件,具有一定的用户界面和事件响应,而dll文件只是方法和属性的集合. 一.关于DLL的介绍 ...