<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
        <title>不忘初心 方得始终</title>
        <description>不忘初心 方得始终 - LC</description>
        <link></link>
        <link>http://lc343.github.io</link>
        <lastBuildDate>2016-09-09T01:03:19+00:00</lastBuildDate>
        <pubDate>2016-09-09T01:03:19+00:00</pubDate>
        <ttl>1800</ttl>


        <item>
                <title>【offset笔记】</title>
                <description>
&lt;p&gt;关于offset需要清楚5个属性：&lt;br /&gt;
1.offsetParent &lt;br /&gt;
2.offsetHeight	&lt;br /&gt;
3.offsetWidth &lt;br /&gt;
4.offsetLeft &lt;br /&gt;
5.offsetTop &lt;br /&gt;
由于浏览器的差异性，得到的值并不一致，分别从五个属性开始分析。&lt;/p&gt;
&lt;h2&gt;一、offsetParent &lt;/h2&gt;
&lt;p&gt;offsetParent属性返回一个对象的引用，是指用来定位的父级，不一定与parentNode的值相等。&lt;/p&gt;
&lt;p&gt;1.若当前元素的父级元素没有进行CSS定位（position为absolute或relative，offsetParent为body。&lt;/p&gt;
&lt;p&gt;2.若当前元素的父级元素有CSS定位（position为absolute或relative，offsetParent为离元素最近的定位父级元素。&lt;/p&gt;
&lt;p&gt;1.第一种没有进行CSS定位，测试代码如下：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
	&lt;span class=&quot;nt&quot;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
		&lt;span class=&quot;nt&quot;&gt;&amp;lt;meta&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;charset=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;UTF-8&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
		&lt;span class=&quot;nt&quot;&gt;&amp;lt;style &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;text/css&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    		&lt;span class=&quot;nt&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        			&lt;span class=&quot;nl&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;10px&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#CCC&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        			&lt;span class=&quot;nl&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;40px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        			&lt;span class=&quot;nl&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;#EEE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
       				&lt;span class=&quot;nl&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        			&lt;span class=&quot;nl&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    		&lt;span class=&quot;nf&quot;&gt;#myDiv&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        			&lt;span class=&quot;nl&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;400px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        			&lt;span class=&quot;nl&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;200px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        			&lt;span class=&quot;nl&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;20px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        			&lt;span class=&quot;nl&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;#fff000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        			&lt;span class=&quot;nl&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;5px&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    		&lt;span class=&quot;nf&quot;&gt;#test&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        			&lt;span class=&quot;nl&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;200px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        			&lt;span class=&quot;nl&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;100px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        			&lt;span class=&quot;nl&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;10px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        			&lt;span class=&quot;nl&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#ff00f0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        			&lt;span class=&quot;nl&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;5px&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;nt&quot;&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
	&lt;span class=&quot;nt&quot;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
	&lt;span class=&quot;nt&quot;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
		&lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;myDiv&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
			&lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;test&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
		&lt;span class=&quot;nt&quot;&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
		&lt;span class=&quot;nt&quot;&gt;&amp;lt;script&amp;gt;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;
			var myDiv = document.getElementById(&quot;myDiv&quot;);	
			var test = document.getElementById(&quot;test&quot;);
			test.innerHTML = &quot;Browser:&quot; + navigator.userAgent + &quot;&amp;lt;br&amp;gt;&quot; +
        		&quot;offsetParent:&quot; + test.offsetParent.tagName + &quot;&amp;lt;br&amp;gt;&quot;;
		&amp;lt;script&amp;gt;
	&amp;lt;body&amp;gt;
	&amp;lt;/html&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;这段代码在Chrome浏览器中的效果如图：
&lt;br /&gt;&lt;img src=&quot;/assets/img/note1/1.png&quot; alt=&quot;&quot; /&gt;
&lt;br /&gt;2.第二种有CSS定位，在&lt;code class=&quot;highlighter-rouge&quot;&gt;id=#myDiv&lt;/code&gt;添加代码&lt;code class=&quot;highlighter-rouge&quot;&gt;position: relative;&lt;/code&gt;
这段代码在Chrome浏览器中的效果如图：&lt;br /&gt;
&lt;img src=&quot;/assets/img/note1/2.png&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2&gt; 二、offsetHeight和 offsetWidth &lt;/h2&gt;
&lt;p&gt;&lt;br /&gt;当前元素的父级元素有CSS定位，添加代码如下：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; 	test.innerHTML = &quot;Browser:&quot; + navigator.userAgent + &quot;&amp;lt;br&amp;gt;&quot; +
        &quot;offsetParent:&quot; + test.offsetParent.tagName + &quot;&amp;lt;br&amp;gt;&quot;+
        &quot;&amp;lt;p&amp;gt;offsetHeight:&quot;+test.offsetHeight+&quot;&amp;lt;/p&amp;gt;&quot;+
        &quot;&amp;lt;p&amp;gt;offsetHeight:&quot;+test.offsetWidth+&quot;&amp;lt;/p&amp;gt;&quot;+
        &quot;&amp;lt;p&amp;gt;offsetLeft:&quot;+test.offsetLeft+&quot;&amp;lt;/p&amp;gt;&quot;+
        &quot;&amp;lt;p&amp;gt;offsetTop:&quot;+test.offsetTop+&quot;&amp;lt;/p&amp;gt;&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
各个浏览器下的效果图如下：&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;1.Chrome效果图&lt;br /&gt;
1.&lt;img src=&quot;/assets/img/note1/2.1.png&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
2.Firefox效果图&lt;br /&gt;
2.&lt;img src=&quot;/assets/img/note1/2.2.png&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
3.IE7/9效果图效果一样&lt;br /&gt;
3.&lt;img src=&quot;/assets/img/note1/2.3.png&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
4.IE8效果图效果一样&lt;br /&gt;
4.&lt;img src=&quot;/assets/img/note1/2.58.png&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
5.Opera效果图&lt;br /&gt;
5.&lt;img src=&quot;/assets/img/note1/2.4.png&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
&lt;b&gt;综上可得&lt;/b&gt;offsetHeight和 offsetWidth的值在各个浏览器中都一样，并且没有CSS定位效果也是一样。&lt;br /&gt;
offsetHeight为元素的可视高度，这个高度包括元素的高度，水平滚动条的高度，边框高度和内边距高度。&lt;/p&gt;
&lt;p&gt;
	offsetHeight=(border-top-width)+(padding-top)+(height)+(padding-bottom)+(border-top-width)
&lt;/p&gt;
&lt;p&gt;offsetWidth为元素的可视宽度，这个宽度包括元素的宽度，垂直滚动条的宽度，边框宽度和内边距宽度。&lt;/p&gt;
&lt;p&gt;
	offsetWidth=(border-left-width)+(padding-left)+(width)+(padding-right)+(border-right-width)
&lt;/p&gt;
&lt;h2&gt; 三、offsetLeft和 offsetTop &lt;/h2&gt;
&lt;p&gt;&lt;br /&gt;由二可知offsetWidth与offsetHeight，这两个属性的值只与该元素有关，与周围元素（父级和子级元素无关），但是offsetLeft和 offsetTop这两个属性与offsetParent有关。&lt;/p&gt;
&lt;p&gt;
1.当前元素的父级元素有CSS定位，除了IE8效果图效果不一样，Chrome，Firefox,IE7/9，Opera这两个属性值都相等。
offsetLeft指的是元素的左外边框到包含元素的左内边框之间的像素距离。
&lt;/p&gt;
&lt;p&gt;
	offsetLeft=padding-left(IE8除外)&lt;br /&gt;
	IE8:offsetLeft=(padding-left)+(border-left-width)
&lt;/p&gt;
&lt;p&gt;
offsetTop指的是元素的上外边框到包含元素的上内边框之间的像素距离。
	&lt;p&gt;
	offsetTop=padding-top(IE8除外)&lt;br /&gt;
	IE8:offsetTop=(padding-top)+(border-top-width)
	&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;2.当前元素的父级元素没有CSS定位，即父级为body，这种情况比较特殊&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;1.IE7效果图&lt;br /&gt;
1.&lt;img src=&quot;/assets/img/note1/3.2.png&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
与之前父级元素CSS定位时的两个属性值相等。&lt;br /&gt;
2.IE8/9效果图&lt;br /&gt;
2.&lt;img src=&quot;/assets/img/note1/3.3.png&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
与之前父级元素CSS定位时的两个属性值不相等，&lt;/p&gt;
&lt;p&gt;
offsetLeft=(body的border-left-width)+(body的padding-left)+(当前元素的margin-left)+(当前元素的前n个padding-left)[当嵌套时加]+(当前元素的border-left-width)。&lt;br /&gt;
offsetTop=(body的border-top-width)+(body的padding-top)+(当前元素的margin-top)+(当前元素的前n个padding-top)[当嵌套时加]+(当前元素的border-top-width)两式都满足。&lt;br /&gt;
&lt;b&gt;这个公式在当没有一个div嵌套在div中，各个浏览器效果图如下所示。&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;offsetLeft=(body的border-left-width)+(body的padding-left)+(当前元素的margin-left)+(当前元素的border-left-width)；IE8/9,Chrome，Opera满足该公式。
offsetTop=(body的border-top-width)+(body的padding-top)+(当前元素的margin-top)+(当前元素的border-top-width)；IE8/9,Chrome，Opera满足该公式。
IE8/9效果图如图所示：&lt;br /&gt;
2.1.&lt;img src=&quot;/assets/img/note1/4.1.png&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
2.1.Chrome效果图如图所示：&lt;br /&gt;
2.2.&lt;img src=&quot;/assets/img/note1/4.2.png&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
2.2.Opera效果图如图所示：&lt;br /&gt;
2.3.&lt;img src=&quot;/assets/img/note1/4.3.png&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
2.3.Firefox效果图如图所示：&lt;br /&gt;
2.4.&lt;img src=&quot;/assets/img/note1/4.4.png&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
2.4.Firefox的offsetLeft和offsetLeft值不一样
offsetLeft=(body的border-left-width)+(body的padding-left)+(当前元素的margin-left)&lt;br /&gt;
offsetTop=(body的border-top-width)+(body的padding-top)+(当前元素的margin-top)&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;回到之前的整体，有嵌套情况&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
3.Chrome效果图&lt;br /&gt;
3.&lt;img src=&quot;/assets/img/note1/3.1.png&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
4.Firefox效果图&lt;br /&gt;
4.&lt;img src=&quot;/assets/img/note1/4.5.png&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
offsetLeft=(body的border-left-width)+(body的padding-left)+(当前元素的margin-left)+(当前元素的前1个padding-left)[当嵌套时加]满足该式。&lt;br /&gt;
offsetTop=(body的border-top-width)+(body的padding-top)+(当前元素的margin-top)+(当前元素的前1个padding-top)[当嵌套时加]满足该式。&lt;br /&gt;
5.Opera效果图&lt;br /&gt;
5.&lt;img src=&quot;/assets/img/note1/3.4.png&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
offsetLeft=(body的border-left-width)+(body的padding-left)+(当前元素的margin-left)+(当前元素的前n个padding-left)[当嵌套时加]+(当前元素的border-left-width)满足该式。&lt;br /&gt;
offsetTop=(body的border-top-width)+(body的padding-top)+(当前元素的margin-top)+(当前元素的前n个padding-top)[当嵌套时加]+(当前元素的border-top-width)满足该式。&lt;br /&gt;
6.Chrome效果图&lt;br /&gt;
6.&lt;img src=&quot;/assets/img/note1/3.1.png&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
offsetTop=(body的border-top-width)+(body的padding-top)+(当前元素的margin-top)+(当前元素的前n个padding-top)[当嵌套时加]+(当前元素的border-top-width)满足该式。&lt;br /&gt;
但是offsetLeft=(body的border-left-width)+(body的padding-left)+(当前元素的margin-left)+(当前元素的前n个padding-left)[当嵌套时加]+(当前元素的border-left-width)-1满足该式。&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;section&quot;&gt;小结&lt;/h2&gt;
&lt;p&gt;最后，对于offsetParent为body的情况，比较特殊，现在的主流浏览器IE8/9/10和Chrome及Firefox都跟定义不太一样，特别是Chrome在嵌套div的情况下，offsetLeft值与其他IE8/9/10的值相差1，不知道是什么原因。&lt;/p&gt;
</description>
                <link>http://lc343.github.io/%E6%8A%80%E6%9C%AF/2016/04/30/javascript-note1</link>
                <guid>http://lc343.github.io/%E6%8A%80%E6%9C%AF/2016/04/30/javascript-note1</guid>
                <pubDate>2016-04-30T00:00:00+00:00</pubDate>
        </item>


</channel>
</rss>
