当前位置:  编程技术>WEB前端
本页文章导读:
    ▪css中的包含块问题      css中的包含块对于元素的定位尤其重要。在css中,每一个元素都会生成一个框(或者叫盒子),这些框或者盒子为他们的子元素创建了一个包含块。但是,并不是一个元素的包含块一定是他的父元.........
    ▪CSS文件动态加载(续)—— 残酷的真相      note:本文主要参考了Stoyan Stefanov的文章《When is a stylesheet really loaded?》在之前的文章《CSS文件动态加载》中,我们提到了在动态加载CSS文件的时候,如何检测加载是否完成。注意,这里的加载.........
    ▪推荐V2EX Workspace      http://www.v2ex.com/?r=atupal V2EX Workspace 是一个为小团队创造的,管理想法和项目的最好的工具,这个工具能够在一个想法从构思,到验证,到实现,再到运营的整个生命周期中帮到团队。从而让和.........

[1]css中的包含块问题
    来源:    发布时间: 2013-11-06

css中的包含块对于元素的定位尤其重要。在css中,每一个元素都会生成一个框(或者叫盒子),这些框或者盒子为他们的子元素创建了一个包含块。但是,并不是一个元素的包含块一定是他的父元素。那么,怎样确定包含块以及包含块的区域,请参看《KB008:包含块(Contain block)》。

本文链接


    
[2]CSS文件动态加载(续)—— 残酷的真相
    来源:    发布时间: 2013-11-06

note:本文主要参考了Stoyan Stefanov的文章《When is a stylesheet really loaded?》

在之前的文章《CSS文件动态加载》中,我们提到了在动态加载CSS文件的时候,如何检测加载是否完成。注意,这里的加载完成包含了两种情况:

1)加载成功  2)加载失败

也就是说,这里并没有将成功与失败的情况区分开来。看到这里你可能疑惑了,就动态加载个CSS文件,洋洋洒洒写了一两百行代码,连是否加载成功/失败都没能区分开来,这似乎有些不可理解。

美好的假象——如何判断CSS加载完成

这里先不抛出结论,而是先思考一个问题:如何动态加载CSS文件?

很简单,就下面几行代码:

var node = document.createElement('link');
node.rel = 'stylesheet';
node.href = 'style.css';
document.getElementsByTagName('head')[0].appendChild(node);

很好,那么接下来的问题是:怎么判断CSS文件是否加载完成?

那还不简单,几行代码就搞定的事情,前端的老朋友onload、onerror闪亮登场:

var node = document.createElement('link');
node.rel = 'stylesheet';
node.type = 'text/css';
node.href = 'style.css';
node.onload = function(){
alert('加载成功啦!');
};
node.onerror = function(){
alert('加载失败啦!');
};
document.getElementsByTagName('head')[0].appendChild(node);

嗯,这么写是没错。。。从理论上。。。看下HTML 5里关于资源加载完成的描述,概括起来就是:

  • CSS文件加载成功,在link节点上触发load事件
  • CSS文件加载失败,在link节点上触发error事件
  • Once the attempts to obtain the resource and its critical subresources are complete, the user agent must, if the loads were successful, queue a task to fire a simple event named load at the link element, or, if the resource or one of its critical subresources failed to completely load for any reason (e.g. DNS error, HTTP 404 response, a connection being prematurely closed, unsupported Content-Type), queue a task to fire a simple event named error at the linkelement. Non-network errors in processing the resource or its subresources (e.g. CSS parse errors, PNG decoding errors) are not failures for the purposes of this paragraph.

    看上去很美好的样子。我们知道,这个世界从来都不完美,至少对于前端来说,这个世界跟完美这个词没半毛钱关系。JS中一直为人诟病的语法,浏览器糟糕的兼容性问题神马的。将上面那段代码放到IE(版本9及以下,10没有测过)里面,将文件链接指向一个不存在的文件,比如在fiddler里将返回替换成404:

    var node = document.createElement('link');
    node.href = 'none_exist_file.css';  //其他属性设置省略
    node.onload = function(){
    alert('加载成功啦!');
    };
    node.onerror = function(){
    alert('加载失败啦!');
    };
    document.getElementsByTagName('head')[0].appendChild(node);

    于是你看到一句华丽丽的提示:

    “加载成功啦!”

    看到这里是不是对这个世界产生了深深的怀疑——我承认我当时把微软开发IE浏览器的兄弟们全家都问候了一下。

    好吧,这篇文章并不是关于IE的吐槽文,在CSS文件加载状态的检测这个问题上,IE的表现虽不完美,但相比之下还不算特别糟糕。

    慢着!意思是——还有更糟糕的?是的,比如早期版本的firefox,连onload都不支持。

     

    如何判断CSS文件加载完成——五种方案

    抛开一切的埋怨与不满,按照过往的经验,如何判断一个文件是否加载完成?一般有以下几种方式:

  • 监听link.load
  • 监听link.addEventListener('load', loadHandler, false);
  • 监听link.onreadystatechange
  • 监听document.styleSheets的变化
  • 通过setTimeout定时检查你预先创建好的标签的样式是否发生变化(该标签赋予了在动态加载的CSS文件里才声明的样式)
  •  示例代码如下:

    //方案一
    link.onload = function(){
    alert('CSS onload!');
    }
    //方案二
    link.addEventListener('load', function(){
    alert('addEventListener loaded !');
    }, false);
    //方案三
    link.onreadystatechange = function(){
    var readyState = this.readyState;
    if(readyState=='complete' || readyState=='loaded'){
    alert('readystatechange loaded !');
    }
    };
    //方案四
    var curCSSNum = document.styleSheets.length;
    var timer = setInterval(function(){
    if(document.styleSheets.length>curCSSNum){
    //注意:当你一次性加载很多文件的时候,需要判断究竟是哪个文件加载完成了
    alert('document.styleSheets loaded !');
    clearInterval(timer);
    }
    }, 50);
    var div = document.createElement('div');
    div.className = 'pre_defined_class'; //加载的CSS文件里才有的样式
    var timer = setTimeout(function
        
    [3]推荐V2EX Workspace
        来源: 互联网  发布时间: 2013-11-06

    http://www.v2ex.com/?r=atupal

    V2EX Workspace 是一个为小团队创造的,管理想法和项目的最好的工具,这个工具能够在一个想法从构思,到验证,到实现,再到运营的整个生命周期中帮到团队。从而让和项目有关的信息不再散落在各处,而是在一个地方就可以一目了然。

    任何的巨型项目或是大团队,实际上也都是由小团队构成的。根据我们自己在以往进行的创意工作中所获得的经验,我们实际上在工作中几乎不会和超过 10 个以上的人在一周的时间周期内进行频繁互动。通常,一个高效的小团队是由 4 - 5 位彼此之间具有高度默契的成员构成的,而高度默契来自于已经进行过的大量互动中所产生的互相了解。而这就是我们的目标用户,及我们认为的,小团队。
    V2EX Workspace 于 2011 年 10 月 10 日上线开始 beta 测试。

    作者:atupal 发表于2013-3-3 3:36:02 原文链接
    阅读:0 评论:0 查看评论

        
    最新技术文章:
    ▪css white-space:nowrap属性用法(可以强制文字不...
    ▪IE里button设置border:none属性无效解决方法
    ▪border:none与border:0使用区别
    ▪html清除浮动的6种方法示例
    ▪三个不常见的 HTML5 实用新特性简介
    ▪css代码优化的12个技巧
    ▪低版本IE正常运行HTML5+CSS3网站的3种解决方案
    ▪CSS Hack大全-教你如何区分出IE6-IE10、FireFox、Chr...
    ▪ie6,ie7,ie8完美支持position:fixed的终极解决方案
    ▪小技巧处理div内容溢出
    ▪html小技巧之td,div标签里内容不换行
    ▪纯CSS实现鼠标放上去改变文字内容
    ▪li中插入img图片间有空隙的解决方案
    ▪CSS3中Transition属性详解以及示例分享
    ▪父div高度不能自适应子div高度的解决方案
    ▪告别AJAX实现无刷新提交表单
    ▪从零学CSS系列之文本属性
    ▪HTML 标签
    ▪CSS3+Js实现响应式导航条
    ▪CSS3实例分享之多重背景的实现(Multiple background...
    ▪用css截取字符的几种方法详解(css排版隐藏溢...
    ▪页面遮罩层,并且阻止页面body滚动。bootstrap...
    ▪CSS可以做的几个令你叹为观止的实例分享
    ▪详细分析css float 属性以及position:absolute 的区...
    ▪IE6/IE7/IE8/IE9中tbody的innerHTML不能赋值的完美解...
    ▪CSS小例子(只显示下划线的文本框,像文字一...
    ▪可以给img元素设置背景图
    ▪不通过JavaScript实现的自动滚动视差效果
    ▪div+CSS 兼容小摘
    ▪CSS的inherit与auto使用分析
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3