浏览器的各种位置值获取

获取网页的大小

一张网页的全部面积,就是它的大小,通常是由内容和css样式表决定的。
浏览器窗口的大小,是在浏览器中看到的那部分网页面积。又叫做viewport(视口)。
如果网页的内容能够在浏览器窗口中全部显示(也就是不出现滚动条),那么网页的大小和浏览器窗口的大小是相等的。如果不能全部显示,则滚动浏览器窗口,可以显示出网页的各个部分。

  • 浏览器窗口可视区大小,浏览器窗口尺寸 (不含工具栏和滚动条,只读模式,不能赋值)

    function getViewport(){
    if (document.compatMode == "BackCompat"){//(兼容quirks模式)
        //document.compatMode用来判断当前浏览器采用的渲染方式。
           //BackCompat:标准兼容模式关闭。CSS1Compat:标准兼容模式开启。
      return {
        width: document.body.clientWidth,
        height: document.body.clientHeight
      }
    } else {
      return {
        width: document.documentElement.clientWidth,
        height: document.documentElement.clientHeight
      }
    }
  }
             浏览器窗口内部高 window.innerHeight
                      内部宽 window.innerWidth

    IE 5 6 7 8      //一般返回的是正确值,documentElement代表根元素,一般指html             
     html文档所在窗口的当前高度 document.documentElement.clientHeight
                          宽度 document.documentElement.clientWidth             
   或者Document对象的body属性对应HTML文档的Body标签
                    document.body.clientHeight
                    document.body.clientWidth 
  • 网页大小
    function getPagearea(){
     if (document.compatMode == "BackCompat"){
       return {//判断网页内容刚好在浏览器中全部显示,取最大值
         width: Math.max(document.body.scrollWidth,
                  document.body.clientWidth),
         height: Math.max(document.body.scrollHeight,
                   document.body.clientHeight)
       }
     } else {
       return {
         width: Math.max(document.documentElement.scrollWidth,
                  document.documentElement.clientWidth),
         height: Math.max(document.documentElement.scrollHeight,
                   document.documentElement.clientHeight)
       }
     }       
    }

网页实际内容的宽度和高度(包含滚动条在内的该元素的视觉面积,滚动条滚过的所有长度和宽)

      scrollHeight             
      scrollWidth           
 网页内容宽高(包含滚动条等边线,会随着窗口的显示大小改变)             
          offsetHeight
          offsetHeight=clientHeight+滚动条+边框             
          offsetWidth

元素绝对位置

网页元素的绝对位置,指该元素的左上角相对于整张网页左上角的坐标。这个绝对位置要通过计算才能得到。
首先,每个元素都有offsetTop和offsetLeft属性,表示该元素的左上角与父容器(offsetParent对象)左上角的距离。所以,只需要将这两个值进行累加,就可以得到该元素的绝对坐标。

     function getElementLeft(element){
     var actualLeft = element.offsetLeft;
     var current = element.offsetParent;
     while (current !== null){
       actualLeft += current.offsetLeft;
       current = current.offsetParent;
     }
     return actualLeft;       
    }   
 
    function getElementTop(element){ //元素距顶部文档的距离
     var actualTop = element.offsetTop;
     var current = element.offsetParent;
     while (current !== null){
       actualTop += current.offsetTop;
       current = current.offsetParent;
     }
     return actualTop;       
    }
 
 

元素的相对位置

网页元素的相对位置,指该元素左上角相对于浏览器窗口左上角的坐标。
有了绝对位置以后,获得相对位置就很容易了,只要将绝对坐标减去页面的滚动条滚动的距离就可以了。滚动条滚动的垂直距离,是document对象的scrollTop属性;滚动条滚动的水平距离是document对象的scrollLeft属性。

     function getElementViewLeft(element){//offset包括border
     var actualLeft = element.offsetLeft;
     var current = element.offsetParent;
     while (current !== null){
       actualLeft += current.offsetLeft;
       current = current.offsetParent;
     }
     if (document.compatMode == "BackCompat"){
       var elementScrollLeft=document.body.scrollLeft;
     } else {
       var elementScrollLeft=document.documentElement.scrollLeft; 
     }
     return actualLeft-elementScrollLeft;   
    }   

    function getElementViewTop(element){
     var actualTop = element.offsetTop;
     var current = element.offsetParent;
     while (current !== null){
       actualTop += current. offsetTop;
       current = current.offsetParent;
     }
      if (document.compatMode == "BackCompat"){
       var elementScrollTop=document.body.scrollTop;
     } else {
       var elementScrollTop=document.documentElement.scrollTop; 
     }
     return actualTop-elementScrollTop;   
    }

scrollTop和scrollLeft属性是可以赋值的,并且会立即自动滚动网页到相应位置,因此可以利用它们改变网页元素的相对位置。另外,element.scrollIntoView()方法也有类似作用,可以使网页元素出现在浏览器窗口的左上角。

网页元素的位置

那就是使用getBoundingClientRect()方法。它返回一个对象,其中包含了left、right、top、bottom四个属性,分别对应了该元素的左上角和右下角相对于浏览器窗口(viewport)左上角的距离。
所以,网页元素的相对位置就是this=ele
  

 var X= this.getBoundingClientRect().left;   
 var Y=this.getBoundingClientRect().top;

再加上滚动距离,就可以得到绝对位置
  

 var X=this.getBoundingClientRect().left+document.documentElement.scrollLeft;
 var Y=this.getBoundingClientRect().top+document.documentElement.scrollTop;

滚动条的位置

    function getScrollTop() {
        if (window.pageYOffset) {
            scrollPos = window.pageYOffset;//
        }
        else if (document.compatMode && document.compatMode != 'BackCompat') {
            scrollPos = document.documentElement.scrollTop;
        }
        else if (document.body) {
            scrollPos = document.body.scrollTop;
        }
        return scrollPos;
    }

滚动距离和偏移量

    scrollLeft 设置或者取位于给定对象左边界与窗口中目前可见内容的最左端之间的距离
    scrollTop 设置或取位于对象最顶端与窗口中可见内容的最顶端之间的距离
    offsetLeft 获取指定对象位于版面或由offsetParent属性指定的父坐标的计算左侧位置
    offsetTop 获得指定对象相对于版面或由offsetParent属性指定的父坐标的计算顶端位置    

    offsetParent指的是布局中设置position属性 Relative Absolute Fixed的父容器,
                从最近的父节点开始,一层层向上找,直到html的body
                

屏幕的宽高

 1. 整个屏幕的宽高: screen对象: 封装当前屏幕的信息
      完整屏幕宽高: screen.width/height
      去掉任务栏后,可用的宽高: 
      screen.availWidth/availHeight
              : 如何判断用户现在使用设备的种类: 
       1. screen.width/height
       
2. 获得鼠标的坐标位置: 
      获得鼠标相对于屏幕的位置: e.screenX/screenY

图片描述
HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth 

ele.scrollHeight: 获取对象的滚动高度。 
ele.scrollWidth:获取对象的滚动宽度
ele.scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离 
ele.scrollTop:设置或获取元素到文档顶部的距离,滚动条拉动的距离 

//可用style.width,height,left,top来设置
offsetWidth:获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的宽度
offsetHeight:获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的高度 
offsetLeft:获取对象相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置 
offsetTop:获取对象相对于版面或由 offsetTop 属性指定的父坐标的计算顶端位置 

event.clientX 相对文档的水平座标 
event.clientY 相对文档的垂直座标 
event.offsetX 相对容器的水平坐标 
event.offsetY 相对容器的垂直坐标 

document.documentElement.scrollTop 垂直方向滚动的值 
event.clientX+document.documentElement.scrollTop 相对文档的水平座标+垂直方向滚动的量
这里是JavaScript中建造迁移转变代码的常用属性
页可见区域宽: document.body.clientWidth;
网页可见区域高: document.body.clientHeight;
网页可见区域宽: document.body.offsetWidth   (包含边线的宽);
网页可见区域高: document.body.offsetHeight (包含边线的宽);
网页正文全文宽: document.body.scrollWidth;
网页正文全文高: document.body.scrollHeight;
网页被卷去的高: document.body.scrollTop;
网页被卷去的左: document.body.scrollLeft;
网页正文项目组上: window.screenTop;
网页正文项目组左: window.screenLeft;
屏幕辨别率的高: window.screen.height;
屏幕辨别率的宽: window.screen.width;
屏幕可用工作区高度: window.screen.availHeight;

2、clientHeight
都认为是内容可视区域的高度,也就是说页面浏览器中可以看到内容的这个区域的高度,一般是最后一个对象条以下到状况栏以上的这个区域,与页面内容无关。

clientHeight 就是透过浏览器看内容的这个区域高度。
offsetHeightscrollHeight 都是网页内容高度,只不过当网页内容高度< clientHeight 时,scrollHeight = clientHeight,而 offsetHeight 可以< clientHeight

offsetHeight = 可视区域 clientHeight + 滚动条 + 边框。scrollHeight 则是网页内容实际高度。

3、scrollLeft
scrollTop 是“卷”起来的高度值,示例:

 <p style="width:100px;height:100px;background-color:#FF0000;overflow:hidden;id="p">
     <span style="width:50px;height:300px;background-color:#0000FF;" id="t">
         若是为 p 设置了scrollTop,这些内容可能不会完全显示。
     </span>
 </p> 
 <script type="text/javascript"> 
    var p = document.getElementById("p"); 
    p.scrollTop = 10; 
 </script>

因为为外层元素 p 设置了 scrollTop,所以内层元素会向上卷。

我们已经知道 offsetHeight 是自身元素的宽度。
scrollHeight 是内部元素的绝对宽度,包含内部元素的隐蔽的项目组。
上述中 pscrollHeight 为 300(内部元素撑起来的高度),而 poffsetHeight 为 100(自身的高度)。

1.offsetTop :
当前对象到其上级层顶部的间隔.
不可对其进行赋值.设置对象到页面顶部的间隔请用style.top属性.
2.offsetLeft :
当前对象到其上级层左边的间隔.
不可对其进行赋值.设置对象到页面左部的间隔请用style.left属性.
3.offsetWidth :
当前对象的宽度.
style.width属性的差别在于:如对象的宽度设定值为百分比宽度,则无论页面变大还是变小,style.width都返回此百分比,而offsetWidth则返回在不合页面中对象的宽度值而不是百分比值
4.offsetHeight :
style.height属性的差别在于:如对象的宽度设定值为百分比高度,则无论页面变大还是变小,style.height都返回此百分比,而offsetHeight则返回在不合页面中对象的高度值而不是百分比值
5.offsetParent   :
当前对象的上级层对象.
重视.若是对象是包含在一个DIV中时,此DIV不会被当做是此对象的上级层,(即对象的上级层会跳过DIV对象)上级层是Table时则不会有题目.
哄骗这个属性,可以获得当前对象在不合大小的页面中的绝对地位.
6.scrollLeft :
对象的最左边到对象在当前窗口显示的局限内的左边的间隔.
便是在呈现了横向滚动条的景象下,滚动条拉动的间隔.
7.scrollTop
对象的最顶部到对象在当前窗口显示的局限内的顶边的间隔.
便是在呈现了纵向滚动条的景象下,滚动条拉动的间隔.

 一、jQuery获取的相关方法
jquery 获取滚动条高度

获取浏览器显示区域的高度 :

$(window).height(); 

获取浏览器显示区域的宽度 :

$(window).width(); 

获取页面的文档高度 :
$(document).height();
获取页面的文档宽度 :$(document).width();

获取滚动条到顶部的垂直高度 :

$(document).scrollTop(); 

获取滚动条到左边的垂直宽度 :

$(document).scrollLeft();

计算元素位置和偏移量:

$(id).offset();

offset方法是一个很有用的方法,它返回包装集中第一个元素的偏移信息。默认情况下是相对body的偏移信息。结果包含 topleft两个属性。

offset(options, results)

options.relativeTo指定相对计算偏移位置的祖先元素。这个元素应该是relativeabsolute定位。省略则相对body

options.scroll是否把滚动条计算在内,默认TRUE
options.padding  是否把padding计算在内,默认false
options.margin是否把margin计算在内,默认true

options.border是否把边框计算在内,默认true

VUE一个滚动切换监听的实例


    <template>
        <div class="tab-scroll">
            <div class="tab-main">
                <ul>
                    <li v-for="(tabInfo,index) in config.tabList" class="offsetEle" :key="index">
                        <div>
                            <a><h3 class="tab-title">{{tabInfo.name}}</h3></a>
                            <!--组件html标签都可以,调用tab-scroll的时候,在第几个里面放代码的,要写slot=几-->
                            <slot :name="tabInfo.slotInd" v-if="tabInfo.slotInd">{{index}}</slot>
                            <!--只绑定组件-->
                            <div :is="tabInfo.content" ref="tabScrollItem" :config="tabInfo.config" v-else></div>
                        </div>
                    </li>
                </ul>
            </div>
            <div class="tab-nav">
                <ul>
                    <li :class="{focus:index ==config.selectIndex}" :key="index" v-for="(tabInfo,index) in config.tabList" @click="selectHandle(index,$event)">
                        <a href="#"><span>{{tabInfo.name}}</span></a>
                    </li>
                </ul>
            </div>
        </div>
    </template>
    
    <script>
        export default {
            name:'tab-scroll',
            props:['config'],
            methods:{
                selectHandle (index,event) {
                    this.config.onOff=false;
                    this.config.selectIndex=index;
                    let offsetElement = event.target.parentNode.parentNode.parentNode.parentNode.parentNode.firstChild.firstChild.childNodes[index];
                    let eleTop = offsetElement.offsetTop;//当前元素距顶部距离
                    let scrTop = document.documentElement.scrollTop || document.body.scrollTop;//滚动条距顶部距离
                    // 平滑滚动,设置图片自动位移速度为总帧数20帧.600除以20,每帧位移30px,时长200ms,每10ms一跳,共20跳
                    let speed = eleTop / 20
                    if (eleTop > scrTop) {
                        smoothDown()
                    } else {
                        let newTotal = scrTop - eleTop
                        speed = newTotal / 20
                        smoothUp()
                    }
                    this.config.onOff=true;
                    function smoothDown () {
                        if (scrTop < eleTop) {
                            scrTop += speed
                            document.body.scrollTop = scrTop
                            document.documentElement.scrollTop = scrTop
                            setTimeout(smoothDown, 10)
                        } else {
                            document.body.scrollTop = eleTop
                            document.documentElement.scrollTop = eleTop
                        }
                    }
                    function smoothUp () {
                        if (scrTop > eleTop) {
                            scrTop -= speed
                            document.body.scrollTop = scrTop
                            document.documentElement.scrollTop = scrTop
                            setTimeout(smoothUp, 10)
                        } else {
                            document.body.scrollTop = eleTop
                            document.documentElement.scrollTop = eleTop
                        }
                    }
    
                },
                onScroll () {
                    if(this.config.onOff){
                        let scrollTop = document.documentElement.scrollTop || document.body.scrollTop//滚动条距顶部距离
                        let offsetEle=document.querySelectorAll('.offsetEle')
                        for(let i=0;i<offsetEle.length;i++){
                            let offsetH=offsetEle[i].offsetTop+this.config.height;//元素距顶部的距离
                            let index=i;
                            if(offsetH>scrollTop){
                                this.config.selectIndex=index;
                                return false
                            }
                        }
                    }
                }
            },
            //挂载到el之后。
            mounted: function () {
                this.$nextTick(function () {
                    window.addEventListener('scroll', this.onScroll)
                })
            },
        }
    </script>
    
    <style lang="scss">
        .hide {
            display:none
        }
        .tab-scroll{
            position: relative;
            margin-top: 10px;
            .tab-main{
                width: 80%;
                >ul{
                    >li{
                        background-color: white;
                        box-shadow: 1px 1px 1px #e0e0e0;
                        &:not(:first-child){
                            margin-top: 20px;
                        }
                        &.focus{
                            .tab-title{
                                color: #00ac9d;
                                text-shadow: 1px 2px 5px #dacd97;
                            }
                        }
                    }
                }
            }
            .tab-title{
                color: #7d818c;
                padding-left: 10px;
                font-size: 14px;
                font-weight: 100;
                height: 35px;
                line-height: 35px;
                background-color: #fcfdff;
                transition: color 0.3s;
                backface-visibility:hidden;
                perspective:1000;
                border-bottom: solid 1px #f1f1f1;
            }
            .tab-nav{
                width:18%;
                user-select: none;
                padding: 10px 0 10px 50px;
                position: absolute;
                right: 0;
                top: 0;
                >ul{
                    position: fixed;
                    padding: 12px 0;
                    margin-left: 50px;
                    border-left: solid 2px #c8ccd2;
                    &:before,&:after{
                        left: -7px;
                        content: '';
                        height: 9px;
                        width: 9px;
                        position: absolute;
                        display: block;
                        border-radius: 10px;
                        border: solid 2px #c8ccd2;
                    }
                    &:before{
                        top: -12px;
                    }
                    &:after{
                        bottom: -12px;
                        height: 8px;
                        width: 8px;
                        border-radius: 0;
                        border-color: #c8ccd2;
                    }
                    >li{
                        height:45px;
                        display: flex;
                        cursor: pointer;
                        position: relative;
                        align-items: center;
    
                        &:before{
                            left: -7px;
                            content: '';
                            height: 9px;
                            width: 9px;
                            display: block;
                            position: relative;
                            border-radius: 10px;
                            border: solid 2px #c8ccd2;
                            background-color: #EDF0F5;
                        }
                        &:after{
                            top:0;
                            left: 20px;
                            height:100%;
                            color:#B8BFD9;
                            content: attr(describe);;
                            display: flex;
                            align-items: center;
                            position: absolute;
                            font-size: 14px;
                            transition:all 0.3s ease-in-out;
                            backface-visibility:hidden;
                            perspective:1000;
    
                        }
                        span{
                            height:30px;
                            line-height: 30px;
                            font-size:14px;
                            color: #B8BFD9;
                            display: block;
                            padding: 5px 15px;
                            position: relative;
                            border-radius: 5px;
                            transition:all 0.3s ease-in-out;
                            backface-visibility:hidden;
                            perspective:1000;
                            &:before{
                                top: 10px;
                                width: 0;
                                height: 0;
                                left: -14px;
                                content: '';
                                display: block;
                                border-width: 8px;
                                position: absolute;
                                border-style: dashed solid dashed dashed;
                                border-color: transparent;
                                transition:all 0.3s ease-in-out;
                                backface-visibility:hidden;
                                perspective:1000;
                            }
                        }
    
                        &:hover{
                            &:after{
                                left: 40px;
    
                            }
                            span{
                                margin-left:10px;
                                background-color: #DFE3EE;
                                &:before{
                                    border-color: transparent #DFE3EE transparent transparent;
                                }
    
                            }
                        }
    
                        &.focus{
                            &:before{
                                height: 8px;
                                width: 8px;
                                border-color:#567ed2;
                                background-color: #567ed2;
                                box-shadow: 0px 0px 5px 1px #1cb7a9;
                            }
                            &:after{
                                left: 40px;
                                color: #ffffff;
                            }
                            span{
                                margin-left:10px;
                                color:#fff;
                                background-color: #567ed2;
                                &:before{
                                    border-color: transparent #567ed2 transparent transparent;
                                }
                            }
                        }
    
                    }
                }
            }
        }
    
    
    </style>

    原文作者:Waxiangyu
    原文地址: https://segmentfault.com/a/1190000010619181
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞