盒子模型中的尺寸问题

css中盒子模型

一般对块元素,做布局和做动画的时候,往往我们需要通过dom api去获取dom的长度和宽度

通过DOM元素的尺寸

在宽度方向上相似的三个属性, 高度方向上同理

序号 属性 意义
1 offsetWidth width + padding-left +padding-right + border-left-width+border-right-width, 实际看到的值
2 clientWidth width + padding-left +padding-right, 实际看到的值
3 scrollWidth 元素的实际宽度,包括被滚动条隐藏的宽度
4 offsetLeft 该元素的左上角(边框外边缘)与已定位的父容器(offsetParent对象)左上角的距离
5 clientLeft 内边距的边缘和边框的外边缘之间的水平距离,即左边框的距离
6 scrollLeft 做滚动条隐藏的尺寸
  • 注意
    scrollLeft, 是指滚动条的位置,是是可写的
    offsetLeft, 对应的有一个属性(offsetParent),是指元素相对于哪个父元素有定位

文档尺寸和视口坐标

当我们计算一个DOM元素位置也就是坐标时候,往往会有两个坐标, 文档坐标视口坐标

  • 文档尺寸:是指document.body 或者 document.documentElement的整个大小包括滚动条默认隐藏的部分
  • 视口尺寸:是指现实文档内容的一部分,不包括浏览器的外壳, 不包括浏览器滚动条隐藏的部分

如果文档比视口小,没有出现滚动条,此时文档的左上角和视口的左上角是相同,两者转换需要减去滚动条的scrollLeft 或者scrollTop 即可

获取一个元素的 scrollOffset值的函数封装

function getScrollOffset () {
   const dom = w || window
  if (w.pageXoffset != null) {
    return {x: w.pageXoffset, y: w.pageYoffset}
   }
  const d = w.document
  if (document.compatMode === 'CSS1Compat') {
   return {x: d.documentElement.scrollLeft, y: d.documentElement.scrollTop} 
  }
  return {x: d.body.scrollLeft, y: d.body.scrollTop}
}

获取视口的尺寸

function getViewPortSize (w) {
  const w = w || window
  if (w.innerWidth != null)
    return {w: w.innerWidth, h: w.innerHeight}
 var d = d.document
  if (document.compatMode === 'CSS1Compat') 
    return {w: d.documentElement.clientWidth, h: d.documentElement.clientHeight}
  return {w: d.body.clientWidth, h: d.body.clientHeight}
}

获取文档的文档尺寸

function getElementPosition(e) {
  var x = 0
  var y = 0
  while(e != null) {
    x += e.offsetLeft
    y += e.offsetTop
    e = e.offsetParent
  }
  return {x, y}
}

获取元素的视口坐标

万能的DOM,提供了jsapi, 通过dom的getBoundingClientRect方法,返回一个left, right, top, bottom, 分别表示四个位置相对于视口的坐标, 它返回的数值,包元素的内边距和边框,不包括外边距

定位与尺寸的问题

定位影响元素尺寸的,文档流信息
absolute: 脱离正常文档流, 需要通过width,height, left, bottom right top 等属性来确定文档的大小
fixed: 脱离正常文档流, 需要通过width,height, left, bottom right top 等属性来确定文档的大小 相对于窗口定位
relative: 不脱离正常的文档流, 块元素依然保持块属性 left, bottom, right, top 只影响定位属性

你可能感兴趣的:(盒子模型中的尺寸问题)