— Designsor

Archive
Tag "css hack"

最近开始恶补基础知识,弥补自己的基础薄弱的问题。

haslayout是什么?

“Layout” 是 IE 的一个私有属性,并不是W3C标准。它决定了一个对象(就是一个标签div、li等)在内容中如何显示、与周围对象的位置关系、以及怎样响应程序或用户产生的事件。

这个属性可以被一些css强制激活。一些HTML标签默认具有haslayout。

下面这些标签默认拥有haslayout属性:

  • <html><body>
  • <table><tr><th><td>
  • <img>
  • <hr>
  • <input><button><select><textarea><fieldset><legend>
  • <iframe><embed><object><applet>
  • <marquee>

怎样激活layout?

position: absolute
设置绝对定位可能会引发新的问题。
float: left|right
IE下的浮动也会产生一些莫名其妙的问题。
display: inline-block
当一个内联元素需要haslayout属性时就需要用它,但是IE本身不支持inline-block的,只是表现得像标准里说的inline-block。
width: 除’auto’外的任意值
优先考虑使用该属性。
height: 除’auto’外的任意值
对 IE6 及更早版本来说很常用,该方法被称为霍莉破解(Holly hack),即设定这个元素的高度为 1% (height:1%;)。但是要注意,当这个元素的 overflow 属性被设置为 visible 时,这个方法就失效了。
zoom: 除’normal’外的任意值
又一个ie私有属性,不兼容标准。zoom:1可以在测试或者不追求标准的情况下使用,效果不错。
writing-mode: tb-rl
ie私有属性,不推荐用。

IE7 还有一些额外的属性:

min-height: (任意值)
max-height: (除 none 外任意值)
min-width: (任意值)
max-width: (除 none 外任意值)
overflow: (除 visible 外任意值)
overflow-x: (除 visible 外任意值)
overflow-y: (除 visible 外任意值)
position: fixed

重置haslayout.

在没有其它属性激活layout的情况下,使用下面的css可以重置haslayout属性:

  • width, height (设为 “auto”)
  • max-width, max-height (设为 “none”)(在 IE 7 中)
  • position (设为 “static”)
  • float (设为 “none”)
  • overflow (设为 “visible”) (在 IE 7 中)
  • zoom (设为 “normal”)
  • writing-mode (从 “tb-rl” 设为 “lr-t”)

display 属性的不同:当用”inline-block”激活了haslayout 属性时,就算在一条独立的规则中覆盖这个属性为”block”或”inline”,haslayout 这个标志位也不会被重置为 false。

把 mid-width, mid-height 设为它们的默认值”0″仍然会赋予 hasLayout,但是 IE 7 却可以接受一个不合法的属性”auto”来重置 hasLayout。

当一个对象的layout被激活时,它以及它的子对象的定位和尺寸计算将独立进行,不受附近对象的干扰。也就是说它拥有一个独立的布局(layout)。 因此浏览器要花费更多的代价来处理拥有haslayout的对象。为了提高性能,微软增加了layout这个IE私有的概念。

Read More

多款浏览器内核图解

浏览器兼容,浏览器兼容,这个词越来越多被摆上了会议,招聘,HR的嘴里,前端的嘴里,页面仔的嘴里,还有一些老板的嘴里。

可是,到底我们是在兼容什么,兼容什么东西,什么浏览器,是什么东西让我们的页面在不同终端显示不一样呢?

看上图,简单的了解下。这是张小爝制作的9款浏览器的分类表,和他们各自的“内核”。“内核”只是一个通俗的说法,其英文名称为“Layout engine”,翻译过来就是“排版引擎”,也被称为“页面渲染引擎”。

百度百科的解释:Rendering Engine

  浏览器最重要或者说核心的部分是“Rendering Engine”,可大概译为“解释引擎”,不过我们一般习惯将之称为“浏览器内核”。负责对网页语法的解释(如HTML、JavaScript)并渲染(显示)网页。
  所以,通常所谓的浏览器内核也就是浏览器所采用的渲染引擎,渲染引擎决定了浏览器如何显示网页的内容以及页面的格式信息。不同的浏览器内核对网页编写语法的解释也有不同,因此同一网页在不同的内核的浏览器里的渲染(显示)效果也可能不同,这也是网页编写者需要在不同内核的浏览器中测试网页显示效果的原因。

看过上面的词条解释应该有个大概的了解了吧,通过开始的图谱,我们知道,目前主流的这几款浏览是基于以下4个内核开发的:Trident,Gecko,Presto,Webkit。(如图分类)

所以最开始的浏览器兼容,多版本兼容其实兼容的不是所谓的什么牌子的浏览器,而是要兼容这4种不同的页面渲染解释器与其自身的不同版本产品。

这样就思路很清晰了,我们为什么做出的页面不兼容,我们到底有没有一种好的制作页面的方法可以避免这种不兼容,可以尽量的做到开发的简单轻便快速敏捷。

答案是肯定是的有,至少总结可以得出一下几点:

1,区分内核而不是区分浏览器。如果你按照浏览器来调试页面肯定工作量是*9而不是*4,鉴于他们的标准日渐趋于通化,这种灰色技术会越来越褪色。比如,你调试的FF页面良好,那么你的NS肯定也是不会变形的,如果你调试的是IE,那么你的TT,遨游等肯定也是稳定的,如果在Safari下良好,那么谷歌基本也就稳定了。opear的比较单独,但是他的内核也是最轻便简单的,有一部分和Webkit很像,有一部分又趋于Gecko,可opear的Presto牺牲了页面兼容的一些特点也算比较难调试的内核,速度快必然有削减其他性能。

2,从IE7调试开始,当然,有人会说从FF3.5开始调起,毕竟IE7没有任何可视化工具和插件可提供,而FF的插件帮助你在开发时显著提高可视化。但其实,你错了,正是那种可视化害了你的兼容性。IE7是一半偏向标准一半不标准的CSS兼容(我深有体会),基本如果做到IE7的完全正常,那么IE6基本会很少出现异常,如果稍微有点经验,因为IE下的CSS开发无可视,所以你脑子中的可视化概念一定要很强,这样避免“内核”中不一样的标准你就会自动绕着走或者第一遍就写好了hack代码。而事实证明IE7正常,FF下的几个显著兼容问题只要提前做好功课,变形几率也会降低很多很多,而且调试的时候辅助FBUG,速度会特别快。而基于其他的几款浏览器同理了。

3,仔细阅读不同内核对不同CSS样式表的渲染方式,然后尽量避免,即可最小限度的简化CSS代码量和hack量。不要走死脑筋。

近期会整理一些css的兼容性方面知识放在BLOG上,关于js由于不同版本的自身内核关系,影响不大基本就是一些DOM API和标准的方法有所不同,那又是另外一个层面的兼容问题了,因为有的内核提供了一些机制有的则没有而提供的另外的机制,这也就是JS中不同浏览器会有不同表现写法的原因了。
知道其本质才可以解决实际问题,我也是给自己总结份思路,以便以后查询。等待我的表格插件写完就会开始制作关于兼容性的表格。
:)

Read More