当前位置: 首页 > Web前端 > HTML

详细了解offsetWidth、Height、Top、Left和偏移基准offsetParent

时间:2023-04-02 22:28:42 HTML

offsetWidth,Height,Top,Left,offsetParent前者计算元素的大小,后两者返回元素相对于offsetParent元素的偏移量。offsetWidth返回元素的布局宽度;计算方式:内容宽度(CSS设置的宽度)+padding+border+scrollBarWidth如果有垂直滚动条(scrollbar),offsetHeight返回元素的布局高度;计算方式:contentheight(css设置的高度)+padding+border+scrollbarHeight如果有横向滚动条(scrollbar),可以看到content+padding+border你熟悉吗?盒子模型中提到了它。在IE盒子模型中,盒子大小的计算方式相同。我们来看看offsetTop和offsetLeft。在理解它们之前,我们先来了解一下offsetParentoffsetParent可以理解为偏移基准,有点类似于定位属性(绝对偏移距离最近的祖先元素容器和设置了定位属性的元素的位置。)是什么样的元素是offsetParent?具有定位属性的元素显示为默认情况下,表格或表格单元格的根元素从内到外搜索。如果没有,默认是根元素作为offsetParent,也就是偏移引用。当元素设置属性display:none时,其对应的offsetParent属性返回null。注意:如果元素是隐藏的(元素或其祖先的style.display为“none”),或者元素的style.position为设置为“fixed”时,offsetParent属性返回null。display:none在IE9中无效。offsetLeft返回元素(border边框)到offsetParent元素左边框的距离(边框可以是边框或填充)。offsetTop返回一个元素(borderborder)到offsetParent元素的上边界(border可能是border或padding的距离)。让我们在实践中做到这一点。<样式>html{边距:10px;填充:10px;边框:1px纯蓝色;}body{边距:10px;填充:10px;边框:1px纯红色;}.contanier{显示:内联块;背景色:#F7EED6;}.box{宽度:200px;高度:200px;边距:10px;填充:5px;边框:5px纯黑色;背景色:#ccc;}

这里分为两种情况:当不存在定位属性时:IE、Edge、Chrome和Firefox显示不同的值:在IE和Edge中:offsetLeft=boxmargin+bodypadding+bodyborder+bodymargin+htmlpadding+htmlborder+htmlmargin可以理解为相对于视口的偏移在Chrome中:offsetLeft=boxmargin+bodypadding+bodyborder+htmlpadding+htmlborder可以理解为相对于HTML元素的边框(包括borders)在Firefox中:offsetLeft=boxmargin+bodypadding+bodyborder+htmlpadding可以理解为相对于HTML元素边框(不包括边框)。其实我这里有疑惑,为什么在没有指定定位等属性的情况下,ele.offsetParent===document.body为true。从结果来看,实际的offset计算是基于HTML或者visual口头的,如果你知道,请告诉我。当有定位属性时,将HTML代码改为:IE,Edge,Firefox:offsetLeft=boxmargin+bodypadding+bodyborder+htmlpadding可以理解为相对于HTML边框的偏移量(不含边框)Chrome:offsetLeft=boxmargin+bodypadding+bodyborder+htmlpadding+htmlborder可以理解为相对于HTMLborder(包括border)的偏移量。如果没有边框,在IE、Edge、Chrome、Firefox中渲染方式是一样的。