zoukankan      html  css  js  c++  java
  • HTMLElement.offsetParent(offsetLeft和offsetTop参照offsetParent的内边距边界)

    IE7以上(不是火狐):

      父级没有定位:

        本身没有定位:

          ==> offsetParent:body

        本身定位为:absolute/relative:

          ==> offsetParent:body

      

      父级有定位:

        本身没有定位:

           ==> offsetParent:定位父级

        本身定位为:absolute/relative:

           ==> offsetParent:定位父级

        本身定位为: fixed

          ==> offsetParent: null

     

    火狐

      父级没有定位:

        本身没有定位:

          ==> offsetParent:body

        本身定位为: absolute/relative:

          ==> offsetParent:body

        本身定位为:fixed

          ==> offsetParent:body

      父级有定位:

        本身没有定位:

          ==> offsetParent:定位父级

        本身定位为: absolute/relative:

          ==> offsetParent:定位父级

        本身定位为:fixed

          ==> offsetParent:body

     

    IE7以下:

      父级没有定位:

        本身没有定位:

          ==>offsetParent:body

        本身定位为absolute/relative

          ==>offsetParent:body

        本身定位为fixd

          ==>offsetParent:null

       父级有定位:

        本身没有定位:

          ==>offsetParent:定位父级

        本身定位为absolute/relative

          ==>offsetParent:定位父级

        本身定位为fixd

          ==>offsetParent:null

     

     

    总结:

      offsetParent有点类似CSS中的包含块的概念

      offsetLeft,offsetTop 都是参照于offsetParent的内边距边界

      offsetParent(  前提条件:body和html之间的margin被清掉   )

      本身定位为fixed:

        ==> offsetParent: null( IE7以上(不是火狐) )

        ==> offsetParent:body(火狐浏览器)

      本身定位不为fixed:

        父级没有定位:

          ==> offsetParent:body

        父级有定位:

          ==> offsetParent:定位父级

    haslayout

      IE7以下,如果当前元素的某个父级触发了haslayout,

        那么offsetParent就会指向到这个layout特性的父结点上

    拓展 :

           offsetWidth,offsetHeight     ==>     border-box

      clientWidth,clientHeight      ==>    padding-box

      js的兼容性问题:

        ev  || event

        offsetParent

        事件绑定(事件流的机制,事件委托)

        鼠标滚轮事件:

          非火狐:onmousewhell(dom0)

            ev.whellDelta

              上:正,下:负

          火狐:DOMouseScroll(dom2)

            ev.detail

              上:负,下:正

          怎么取消事件的默认行为:

            dom0:return false

            dom2:ev.preventDefault()

      绝对位置:

        到body的距离(html和body之间的margin被清除)

          原生实现:while循环不断地累加

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>苹果导航菜单</title>
        <style type="text/css">
    		*{
    			padding: 0;
    			margin: 0;   
    		}
    					
    		body,html{
                height: 100%;
    			overflow: hidden;
            }
            #div1{
                 100%;
                position: absolute;
                bottom: 0;
    			left: 0;
                text-align: center;
            }
            #div1> img {
    			/*  64px;
    			height: 64px; */
    			border-radius: 50%;
            }
        </style>
     <script type="text/javascript">
            window.onload=function(){
                var r = 200;
    			var obj = document.getElementById('div1');
    			var imgNodes = document.getElementsByTagName('img');
    		    document.onmousemove = function(ev){
    			    ev = ev || event;
    			    for(var i=0;i<imgNodes.length;i++){
    				   var a = imgNodes[i].offsetLeft + imgNodes[i].offsetWidth / 2 -ev.clientX;
    				   var b = imgNodes[i].offsetTop+ obj.offsetTop+ imgNodes[i].offsetHeight / 2 - ev.clientY;
    				   var c = Math.sqrt(a*a+b*b);
    				   // var scale = 1 - c / 320;
    				   // if(scale<0.5){
    					  //  scale = 0.5;
    				   // }
    				   // imgNodes[i].width = scale*128;
    				   // imgNodes[i].height = scale*128;
    				   if(c >= r){
    					   c = r;
    				   }
    					imgNodes[i].style.width = 200 - c * 0.6 +"px";
    					imgNodes[i].style.height = 200 - c * 0.6+"px";
    			   }
    		   }
            }
        </script>
    	<!-- <script src="js/myjs.js"></script> -->
    </head>
    <body>
         <div id="div1">
            <img src="img/1.jpg" width="80" height="80">
            <img src="img/2.jpg" width="80" height="80">
            <img src="img/3.jpg" width="80" height="80">
            <img src="img/4.webp" width="80" height="80">
            <img src="img/5.jpg" width="80" height="80">
         </div>
    </body>
    </html>
    

            body的offsetParent==>null

            body的offsetLeft==>0

            body的offsetTop==>0

           原生实现的缺点:没有办法兼容border和margin

       相对位置:

        原生实现:

          绝对位置的实现上减去滚动条滚动的距离

            document.documentElement.scrollLeft || document.body.scrollLeft;(不同浏览器滚动条的父级不一样)

          原生实现的缺点:没办法兼容border和margin

        getBoundingClientRect(兼容性极好)

        返回值:对象

          {

          boder-box 的宽

          height:boder-box的高

          // 元素border-box的左上角的相对位置

          top:y,

          left:x,

          //元素border-box的右下角的相对位置

          bottom:

          right:

          }

          

        offsetWidth/Height,(可视区域)+border   即 border-box

        clientWidth/Height, (可视区域 即padding-box)

        

        获取视口的宽度:

        document.documentElement.clientWidth

    注意:

      window.onload = function(){

        //根标签的clientWidth(document.documentElement.clientWidth)并不是可视区域的宽度,而是视口的宽度
                    var w = document.documentElement.clientWidth;
                    var w2 = document.documentElement.offsetWidth;
                    console.log(w,w2);
                }

      在IE10及IE10以下 , 根标签的 clientWidth 和 offsetWidth 统一被指定为视口的宽度。

     

  • 相关阅读:
    abstract关键字
    方法重写
    对象初始化过程
    访问修饰符
    super关键字
    继承
    转发和重定向的区别
    tomcat中乱码问题解决
    jsp执行过程
    web程序常见错误及解决方法
  • 原文地址:https://www.cnblogs.com/xiaohaodeboke/p/12323957.html
Copyright © 2011-2022 走看看