<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>西红柿爱番茄 &#187; style</title>
	<atom:link href="http://www.ilovejs.net/archives/tag/style/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ilovejs.net</link>
	<description>到了创造为主的阶段，不忘继续学习</description>
	<lastBuildDate>Thu, 15 Dec 2011 06:18:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>检测link元素加载完成的方式</title>
		<link>http://www.ilovejs.net/archives/1505</link>
		<comments>http://www.ilovejs.net/archives/1505#comments</comments>
		<pubDate>Sun, 20 Mar 2011 06:35:59 +0000</pubDate>
		<dc:creator>Supersha</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[style]]></category>
		<category><![CDATA[异步加载]]></category>

		<guid isPermaLink="false">http://www.ilovejs.net/?p=1505</guid>
		<description><![CDATA[检测外联js是否加载完毕，这个相对来说比较简单，只需要处理onload和onreadystatechange在非IE和IE下做兼容，但是需要检测外联的CSS文件是否加载完毕，这个就有点恶心了，大致分成了三类：IE和Opera；Chrome和Safari、FF，这时候FF没有跟着大部队走了，这或许也是FF中的一个bug。 最理想的方式，无非就是统一使用onload来检测link元素是否加载完毕。但是事不与程序猿人愿~ 但是兼容办法还是有的。 在IE、Opera下，可以直接使用onload、onreadystatechange这两种方式都可以检测link元素是否加载完成，跟检测script一样的原理。 在Chrome、Safari等基于Webkit内核的浏览器下，估计就要监控document.styleSheets.length的变化了。Webkit内核的浏览器在处理document.styleSheets.length的方式是这样的，当加载完了一个link之后，length就会加1，那么这样的话，就可以使用setInterval的方式来检测length的变化了，对于同时检测多个link是否加载完成的方式也可以利用这个，看length增加了多少。《测试用例》示例如下： [javascript] var link = document.createElement(&#34;link&#34;); var cn = document.styleSheets.length; var ti = setInterval(function() { if &#8230; <a href="http://www.ilovejs.net/archives/1505" class="more-link">了解更多</a>]]></description>
			<content:encoded><![CDATA[<p>
检测外联js是否加载完毕，这个相对来说比较简单，只需要处理onload和onreadystatechange在非IE和IE下做兼容，但是需要检测外联的CSS文件是否加载完毕，这个就有点恶心了，大致分成了三类：IE和Opera；Chrome和Safari、FF，这时候FF没有跟着大部队走了，这或许也是FF中的一个bug。
</p>
<p>
最理想的方式，无非就是统一使用onload来检测link元素是否加载完毕。但是事不与程序猿人愿~ 但是兼容办法还是有的。
</p>
<p>
在IE、Opera下，可以直接使用onload、onreadystatechange这两种方式都可以检测link元素是否加载完成，跟检测script一样的原理。
</p>
<p>
在Chrome、Safari等基于Webkit内核的浏览器下，估计就要监控document.styleSheets.length的变化了。Webkit内核的浏览器在处理document.styleSheets.length的方式是这样的，当加载完了一个link之后，length就会加1，那么这样的话，就可以使用setInterval的方式来检测length的变化了，对于同时检测多个link是否加载完成的方式也可以利用这个，看length增加了多少。《<a href="http://www.ilovejs.net/lab/css/loadCSS-Webkit.html">测试用例</a>》示例如下：
</p>
<p>[javascript]<br />
var link = document.createElement(&quot;link&quot;);<br />
var cn = document.styleSheets.length;</p>
<p>var ti = setInterval(function() {<br />
  if (document.styleSheets.length &gt; cn) {<br />
    alert(&quot;CSS loaded&quot;);<br />
    clearInterval(ti);<br />
  }<br />
}, 10);</p>
<p>link.href=&quot;http://www.ilovejs.net/lab/css.php&quot;;<br />
link.rel = &quot;stylesheet&quot;;<br />
document.getElementsByTagName(&quot;head&quot;)[0].appendChild(link);<br />
[/javascript]</p>
<p>
但是在Firefox下，情况就有些恶心了，所使用到的方式跟上面的两类浏览器的处理方式都不太相同。对于document.styleSheets.length的处理也不同于Webkit，它的处理方式是只要link元素一附加到document之后，length就会立即加1，而不管css文件是否加载完毕（测试用例如上面的链接）。为此，对于Firefox的处理方式，使用style标签，而不是link，并且使用传统的@import的方式，通过判断style.sheet.cssRules是否存在来检测css文件是否加载完成，具体如下所示《<a href="http://www.ilovejs.net/lab/css/loadCSS-FF.html">测试用例</a>》：
</p>
<p>[javascript]<br />
var head = document.getElementsByTagName(&quot;head&quot;)[0];</p>
<p>var style = document.createElement(&#8216;style&#8217;);<br />
//加载css.php文件，需要2秒之后才会返回响应内容<br />
style.textContent = &#8216;@import &quot;http://www.ilovejs.net/lab/css/css.php&quot;&#8217;;<br />
style.rel=&quot;stylesheet&quot;;</p>
<p>var fi = setInterval(function() {<br />
  try {<br />
    style.sheet.cssRules; // 这句是关键，在css加载完成的时候，style元素就会有这么个对象。</p>
<p>	alert(&quot;CSS loaded&quot;);</p>
<p>    clearInterval(fi);</p>
<p>  } catch (e){}</p>
<p>}, 10);  </p>
<p>head.appendChild(style);<br />
[/javascript]</p>
<p>
为此，想要写一个兼容性的检测CSS文件是否加载完成的代码，估计看起来会比较丑陋，差异大，处理的方式各异，期待onload统一的那一天咯~~</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ilovejs.net/archives/1505/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>获得DOM元素X/Y坐标的几个函数</title>
		<link>http://www.ilovejs.net/archives/63</link>
		<comments>http://www.ilovejs.net/archives/63#comments</comments>
		<pubDate>Wed, 23 Dec 2009 16:30:00 +0000</pubDate>
		<dc:creator>Supersha</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[style]]></category>

		<guid isPermaLink="false">http://www.ilovejs.net/?p=63</guid>
		<description><![CDATA[今天看到了口碑UED中Zhusun的一篇关于获取DOM元素在文档中的位置的文章，《获取Dom元素的X/Y坐标》，第一次知道了DOM元素还有一个getBoundingClientRect()方法可以使用来返回DOM元素的Top,Left,Right,Bottom。这个方法的具体用法和含义推荐看Zhusun的那篇文章。据他所说这个方法在某些浏览器还不兼容（FF2、Safari），所以本人从offsetParent这个方法出发，来获取DOM元素的X/Y坐标。 offsetParent有四个方法是比较常用的：offsetLeft，offsetTop，offsetWidth，offsetHeight。下面我来说明offsetLeft和offsetTop方法的含义。 offsetTop和offsetLeft分别是元素在offsetParent上下文中的水平和垂直偏移量，它在现代浏览器中都比较准确。但是ie6,ie7在计算的时候会多出2个像素的长度,大家可以使用下面提供的函数来测试。下面是封装的几个函数： [javascript] //获取DOM元素在可见区域的X坐标 function pageX(elem){ //如果当前元素还存在offsetParent，就递归叠加，下面的同理 return elem.offsetParent ? elem.offsetLeft + pageX(elem.offsetParent) : elem.offsetLeft; } //获取DOM元素在可见区域的Y坐标 function pageY(elem){ &#8230; <a href="http://www.ilovejs.net/archives/63" class="more-link">了解更多</a>]]></description>
			<content:encoded><![CDATA[<p>今天看到了<a href="http://ued.koubei.com">口碑UED</a>中Zhusun的一篇关于获取DOM元素在文档中的位置的文章，《<a href="http://ued.koubei.com/?p=948">获取Dom元素的X/Y坐标</a>》，第一次知道了DOM元素还有一个getBoundingClientRect()方法可以使用来返回DOM元素的Top,Left,Right,Bottom。这个方法的具体用法和含义推荐看Zhusun的那篇文章。据他所说这个方法在某些浏览器还不兼容（FF2、Safari），所以本人从offsetParent这个方法出发，来获取DOM元素的X/Y坐标。</p>
<p>
offsetParent有四个方法是比较常用的：offsetLeft，offsetTop，offsetWidth，offsetHeight。下面我来说明offsetLeft和offsetTop方法的含义。
</p>
<p><span id="more-63"></span></p>
<p>
offsetTop和offsetLeft分别是元素在offsetParent上下文中的水平和垂直偏移量，它在现代浏览器中都比较准确。但是ie6,ie7在计算的时候会多出2个像素的长度,大家可以使用下面提供的函数来测试。下面是封装的几个函数：
</p>
<p>[javascript]<br />
//获取DOM元素在可见区域的X坐标<br />
function pageX(elem){<br />
    //如果当前元素还存在offsetParent，就递归叠加，下面的同理<br />
    return elem.offsetParent ? elem.offsetLeft + pageX(elem.offsetParent) : elem.offsetLeft;<br />
}<br />
//获取DOM元素在可见区域的Y坐标<br />
function pageY(elem){<br />
    return elem.offsetParent ? elem.offsetTop + pageY(elem.offsetParent) : elem.offsetTop;<br />
}<br />
//获取DOM元素相对于parentNode的X坐标<br />
function parentX(elem){<br />
    //鉴于有些浏览器对于offsetParent指向不准确的进行判断是否跟元素的parentNode相等，下同。<br />
    return elem.offsetParent == elem.parentNode ? elem.offsetLeft : pageX(elem) &#8211; pageX(elem.parentNode);<br />
}<br />
//获取DOM元素相对于parentNode的Y坐标<br />
function parentY(elem){<br />
    return elem.offsetParent == elem.parentNode ? elem.offsetTop : pageY(elem) &#8211; pageY(elem.parentNode);<br />
}<br />
[/javascript]</p>
<p>上面的几个函数在table里面测试在各个浏览器都基本相同（FF，Chrome，Safari，Opera，IE8），可是ie6和ie7会多出2个像素的长度。大家可以自己测试一下：<a href="http://www.ilovejs.net/lab/xy.html">测试页面</a>。</p>
<p>
offsetHeight和offsetWidth主要用于获取DOM元素潜在的高度和宽度，比如图片或者一些没有显示声明高度和宽度的DOM元素等等就非常适合。
</p>
<p>
同时附带一个非常有用的函数，就是用于获取DOM元素的最终样式的getStyle函数，它通过IE的currentStyle以及FF等浏览器的getComputedStyle方法来获取最终样式：
</p>
<p>[javascript]<br />
//注意：样式属性的书写格式必须是骆驼型，比如:font-size要写成fontSize<br />
var getStyle = function(el, c){<br />
    if (el.currentStyle) { //IE<br />
        return el.currentStyle[c];<br />
    } else if (window.getComputedStyle) {  //W3C<br />
        return window.getComputedStyle(el, null)[c];<br />
    } else {<br />
        return el.style[c];<br />
    }<br />
}<br />
[/javascript]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ilovejs.net/archives/63/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

