元素的大小

 

获取元素的大小

Element接口提供了众多属性用于获取元素的各种大小值(单位像素),这些属性通常为只读,并且只有元素已经在DOM树中且CSS属性的display不为none时才有效。

元素的实际大小

元素的实际大小就是元素在页面中实际所占控件的大小,包括边框,滚动条,但不包括外边距。

  • Element.offsetHeight
    元素的高度。
  • Element.offsettWidth
    元素的宽度。

另外,通过调用Element.getBoundingClientRect()方法也可以获得元素的实际大小,该方法同时还返回元素其相对于视口的位置。

元素客户区的大小

元素的客户区的大小就是指元素内容及其内边距所占空间的大小,包含内边距,但不包括水平滚动条、边框和外边距

  • Element.clientHeight
    元素的客户区高度。
  • Element.clientWidth
    元素的客户区宽度。

元素滚动区域的大小

如果元素的CSS属性overflow没有被设置成none,元素的内容多至显示不下时将会被滚动显示。 使用scrollWidth和scrollHeight属性可以获取元素的滚动区域即整个内容的大小。

  • Element.scrollHeight
    元素的滚动区域高度。
  • Element.scrollWidth
    元素的滚动区域宽度。

另外scrollLeft和scrollTop属性可以用来获取和设定的元素的滚动位置。

页面和视口

页面的大小

页面的大小指的是整个页面文档的大小,标准方法是利用document.documentElement(HTML元素)的scrollWidth和scrollHeight属性。

  • document.documentElement.scrollWidth
    整个文档的宽度
  • document.documentElement.scrollHeight
    整个文档的高度

视口的大小

视口指浏览器窗口中看到的那部分网页面积,标准方法是利用document.documentElement(HTML元素)的clientWidth和clientHeight属性。 这两个属性的返回值不包括整个文档的滚动条,也不包括<html>元素的边框和外边距,但包括<html>元素的内边距。

  • document.documentElement.clientWidth
    视口的宽度
  • document.documentElement.clientHeight
    视口的高度

其他还有以下方法,不过获取的值可能与标准方法获取的值的范围有所差别。

  • document.body.clientHeight/document.body.clientWidth
    不包括整个文档的滚动条,也不包括<html>元素的边框,也不包括<body>的边框和滚动条。
  • document.body.offsetHeight/document.body.offsetWidth
    不包括整个文档的滚动条,也不包括<html>元素的边框,包括<body>的边框和滚动条。
  • window.innerHeight/window.innerWidth
    包括整个文档的滚动条及<html>元素的边框。

工具函数列表

uDOMlib所提供的工具函数之中,有一部分与元素大小相关,下面列出部分函数的源代码实现以供参考。

boundingRect

boundingRect : function(node,coords) {
    if (coords === undefined) {
        return node.getBoundingClientRect()
    } else {
        this.boundingPosition(node,coords);
        this.size(node,coords);
        return this;
    }
}

clientSize

clientSize : function(node) {
    return {
        width: node.clientWidth, 
        height: node.clientHeight
    };
}

contentRect

contentRect : function(node) {
     var cs = this.clientSize(node),
         pex = this.paddingExtents(node);
     return {
        left: pex.left, 
        top: pex.top, 
        width: cs.width - pex.left - pex.right, 
        height: cs.height - pex.top - pex.bottom
     };
}

height

height : function(node,value) {
    if (value == undefined) {
        return this.size(node).height;
    } else {
        return this.size(node,{
            height : value
        });
    }
}

pageRect

pageRect : function(node,coords) {
    if (coords === undefined) {
        var obj = node.getBoundingClientRect()
        return {
            left: obj.left + window.pageXOffset,
            top: obj.top + window.pageYOffset,
            width: Math.round(obj.width),
            height: Math.round(obj.height)
        }
     } else {
        this.pagePosition(node,coords);
        this.size(node,coords);
        return this;
     }
}

rect

rect : function(node,coords) {
    if (coords === undefined) {
        var // Get *real* offsetParent
            offsetParent = this.offsetParent(node),
            // Get correct offsets
            offset = this.boundingRect(node),
            parentOffset = this.boundingPosition(offsetParent),
            mex = this.marginExtents(node),
            pbex = this.borderExtents(offsetParent);

        // Subtract parent offsets and element margins
        return {
            top: offset.top - pbex.top - mex.top,
            left: offset.left - pbex.left - mex.left,
            width: offset.width,
            height: offset.height
        }
    } else {
        this.position(node,coords);
        this.size(node,coords);
        return this;
    }
}

size

size : function(node,dimension) {
    if (value == undefined) {
        return {
            width : node.offsetWidth,
            height : node.offsetHeight
        }
    } else {
        var isBorderBox = this.css(node, "boxSizing") === "border-box",
            props = Object.clone(dimension);
            if (!isBorderBox) {
                var pex = this.paddingExtents(node),
                    bex = this.borderExtents(node);
                if (props.width !== undefined) {
                     props.width = props.width-pex.left-pex.right-bex.left-bex.right;
                }

                if (props.height !== undefined) {
                    props.height = props.height-pex.top-pex.bottom-bex.top-bex.bottom;
                }
           }
           styler.css(props);
           return this;
    }
}

width

width : function(node,value) {
    if (value == undefined) {
        return this.size(node).width;
    } else {
        return this.size(node,{
             width : value
        });
    }
}