web前端第五节课

margin属性值所指方向:

          margin属性包含了margin left :距元素块距离(设置距左内边距) ;margin top:距头顶(上)元素块距离(设置距顶部元素块距离);margin right :距右元素块距离(设置距右元素块距) ;margin bottom元素块距离(设置距低(下)元素块距)。

单标签和双标签:

          双标签:
<html><head><title><body><table><tr><td><span><p><form><h1><h2><h3><h4><h5><h6><object><style><b><u><strong><i><div><a><script><center>

          单标签:
<br><hr><img><input><param><meta><link>

相对长度em定义即使用方法:

      <em> 标签告诉浏览器把其中的文本表示为强调的内容。对于所有浏览器来说,这意味着要把这段文字用斜体来显示。

      在文本中加入强调也需要有技巧。如果强调太多,有些重要的短语就会被漏掉;如果强调太少,就无法真正突出重要的部分。这与调味品一样,最好还是不要滥用强调。

      尽管现在 <em> 标签修饰的内容都是用斜体字来显示,但这些内容也具有更广泛的含义,将来的某一天,浏览器也可能会使用其他的特殊效果来显示强调的文本。如果你只想使用斜体字来显示文本的话,请使用 <i> 标签。除此之外,文档中还可以包括用来改变文本显示的级联样式定义。

除强调之外,当引入新的术语或在引用特定类型的术语或概念时作为固定样式的时候,也可以考虑使用 <em> 标签。例如,W3School 经常对重要的术语使用 <em> 标签。<em> 标签可以用来把这些名称和其他斜体字区别开来。

不同浏览器的兼容性: 

      为什么会出现兼容性问题

所谓的浏览器兼容性问题,是指因为不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况。在大多数情况下,用户用什么浏览器来查看同一网站,都应该是统一的显示效果。所以浏览器的兼容性问题是前端开发人员经常会碰到和必须要解决的问题。

浏览器兼容问题一:不同浏览器的标签默认的外边框和内边框不同

问题症状: 随便写几个标签,不加样式控制的情况下,各自的margin 和padding差异较大。

碰到频率: 100%

解决方案: css里    *{margin:0;padding:0;}

备注: 这个是最常见的也是最易解决的一个浏览器兼容性问题,几乎所有的css文件开头都会用通配符*来设置各个标签的内外边框是0。

 

浏览器兼容问题二:块属性标签float后,又有横行的margin情况下,在IE6显示margin比设置的大

问题症状: 常见症状是IE6中后面的一块被顶到下一行

碰到频率: 90%(稍微复杂点的页面都会碰到,float布局最常见的浏览器兼容问题)

解决方案: 在float的标签样式控制中加入display:inline;将其转化为行内属性

备注: 我们最常用的就是div+css布局了,而div就是一个典型的块属性标签,横向布局的时候我们通常都是用div float实现的,横向的间距设置如果用margin实现,这就是一个必然会碰到的兼容性问题。

 

浏览器兼容问题三:设置较小高度标签(一般小于10px),在IE6,IE7,遨游中高度超出自己设置高度

问题症状: IE6、7和遨游里这个标签的高度不受控制,超出自己设置的高度

碰到频率: 60%

解决方案: 给超出高度的标签设置overflow:hidden;或者设置行高line-height 小于你设置的高度。

备注: 这种情况一般出现在我们设置小圆角背景的标签里。出现这个问题的原因是IE8之前的浏览器都会给标签一个最小默认的行高的高度。即使你的标签是空的,这个标签的高度还是会达到默认的行高。

 

浏览器兼容问题四:行内属性标签,设置display:block后采用float布局,又有横行的margin的情况,IE6间距bug(类似第二种)

问题症状: IE6里的间距比超过设置的间距

碰到几率: 20%

解决方案: 在display:block;后面加入display:inline;display:table;

备注: 行内属性标签,为了设置宽高,我们需要设置display:block;(除了 input标签比较特殊)。在用float布局并有横向的margin后,在IE6下,他就具有了块属性float后的横向margin的bug。不过因为它本身就是行内属性标签,所以我们再加上display:inline的话,它的高宽就不可设了。这时候我们还需要在display:inline后面加入display:talbe。

 

浏览器兼容问题五:图片默认有间距

问题症状: 几个img标签放在一起的时候,有些浏览器会有默认的间距,加了问题一中提到的通配符也不起作用。

碰到几率 :20%

解决方案: 使用float属性为img布局

备注: 因为img标签是行内属性标签,所以只要不超出容器宽度,img标签都会排在一行里,但是部分浏览器的img标签之间会有个间距。去掉这个间距使用float是正道。(使用负margin,虽然能解决,但负margin 本身就是容易引起浏览器兼容问题的用法,所以不建议使用)

 

浏览器兼容问题六:标签最低高度设置min-height不兼容

问题症状: 因为min-height本身就是一个不兼容的css属性,所以设置min-height时不能很好的被各个浏览器兼容

碰到几率 :5%

解决方案: 如果我们要设置一个标签的最小高度200px,需要进行的设置为:{min-height:200px; height:auto !important; height:200px; overflow:visible;}

备注: 在B/S系统前端开时, 有很多情况下我们又这种需求。当内容小于一个值(如300px)时。容器的高度为300px;当内容高度大于这个值时,容器高度被撑高,而不是出现滚动条。这时候我们就会面临这个兼容性问题。

 

二、如何应对兼容性问题

做兼容页面的方法是:每写一小段代码(布局中的一行或者一块)我们都要在不同的浏览器中看是否兼容,当然熟练到一定的程度就没这么麻烦了。建议经常会碰到兼容性问题的新手使用。很多兼容性问题都是因为浏览器对标签的默认属性解析不同造成的,只要我们稍加设置都能轻松地解决这些兼容问题。如果我们熟悉标签的默认属性的话,就能很好的理解为什么会出现兼容问题以及怎么去解决这些兼容问题

 

1.          css hack技术

 

css hack 技术是通过一些浏览器特殊支持或者不支持的语句,确定一个css样式能给被浏览器解析或者不能被浏览器解析。css  hack技术针对不同浏览器的差异进行利用和设计,使用它可以在最大限度的让所以的浏览器下显示同样的风格和模式。

css hack 技术是一种改善CSS在不同浏览器下的表现形式的技巧与方法。 CSS hack技术是通过一些浏览器特殊或者不支持的语句,使一个CSS样式能够被浏览器解析或者不能解析的方法实现的。

CSS Hack的原理只有两条:兼容性顺序。就是利用书写顺序和不同浏览器对一些特定书写方法的解析方式不同而达到不同的效果。不管是什么方法,书写的顺序都是firefox的写在前面,IE7的写在中间,IE6的写在最后面。(其顺序正好是对CSS2.0标准执行的好坏程度)

可把浏览器分为3类:IE6 ;IE7和遨游;其他(IE8 chrome ff safari opera等)。IE6认识的hacker 是下划线_ 和星号 *;IE7和遨游只认识的hacker是星号 * ;而其他浏览器下划线_和星号*都不认识。

比如有这样一个css样式设置

 #exam{height:300px;

*height:200px;

_height:100px; }

IE6浏览器在读到 height:300px的时候会认为高度是300px;继续往下读,他也认识*heihgt,所以当IE6读到*height:200px的时候会覆盖掉前一条的相冲突设置,认为高度是200px。继续往下读,IE6还认识_height,所以他又会覆盖掉200px高的设置,把高度设置为100px;IE7和遨游也是一样的从高度300px的设置往下读。当它们读到*height200px的时候就停下了,因为它们不认识_height。所以它们会把高度解析为200px;剩下的浏览器只认识第一个height:300px;所以他们会把高度解析为300px。因为优先级相同且相冲突的属性设置后一个会覆盖掉前一个,所以书写的次序是很重要的。

DIV+CSS网页布局这是一种趋势,不过在使用DIV+CSS网站设计的时候,应该注意css样式兼容不同浏览器问题,特别是对完全使用DIV+CSS设计的网页,就应该更注意IE6、 IE7 和FF对CSS样式的兼容。

什么是浏览器兼容:当我们使用不同的浏览器(Firefox、IE7、IE6)访问同一个网站,或者页面的时候,会出现一些不兼容的问题,在这种浏览器下显示正常,在另一种下就乱了,目前解决这个浏览器的问题,最直接的方法就是利用CSS hack技术为每个浏览器各写一段css,让它们各执行各的,这就是CSS hack技术解决CSS在不同浏览器中的兼容性问题的核心。

 

2.         !important

!important是被Firefox浏览器所支持的一种用于确定优先级的技术。随着IE7对!important的支持, !important 方法现在只针对IE6的兼容性问题。注意:!important也算是hack的一种。不过实用性较小。

例如:

#example {

width: 100px !important;

width: 200px;

}

 

三、CSS HACK的常用方法

首先需要知道的是:

所有浏览器 通用 height: 100px;

IE6 专用 _height: 100px;

IE7 专用 *+height: 100px;

IE6、IE7 共用 *height: 100px;

IE7、FF 共用 height: 100px !important;

 

例如:

 

#example { height:100px; }

* html #example { height:200px; }

*+html #example { height:300px; }

 

 

下面的这种方法比较简单

举几个例子:

1、IE6 - IE7+FF(-为区别,+为共同)

#example {

height:100px;

_height:200px;

}

其实这个用上面说的第一种方法也可以

#example {

height:100px !important;

height:200px;

}

 

2、IE6+IE7 - FF

#example {

height:100px;

*height:200px;

}

 

3、IE6+FF - IE7

#example {

height:100px;

*+height:200px;

}

 

4、IE6 IE7 FF 各不相同

     

#example {

height:100px;

_height:200px;

*+height:300px;

}

或:

#example {

height:100px;

*height:300px;

_height:200px;

}

 

需要注意的是,代码的顺序一定不能颠倒了,要不又前功尽弃了。因为浏览器在解释程序的时候,如果重名的话,会用后面的覆盖前面的,就象给变量赋值一个道理,所以我们把通用的放前面,越专用的越放后面。

 

解释一下4的代码:读代码的时候,第一行height:100px; 大家都通用,IE6 IE7 FF 都显示100px。到了第二行*height:300px; FF不认识这个属性,IE6 IE7都认,所以FF还显示100px,而IE6 IE7把第一行得到的height属性给覆盖了,都显示300px。到了第三行_height:200px;只有IE6认识,所以IE6就又覆盖了在第二行得到的height,最终显示200px。这样,三个浏览器都有自己的height属性了。

 

需要说明的是:*+html 对IE7的兼容 必须保证HTML顶部有如下声明:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " http://www.w3.org/TR/html4/loose.dtd ">

 

 

四、使用IE专用的条件注释

条件注释是IE特有的一种功能,能对IE系列产品进行单独的XHTML代码处理,注意,主要是针对XHTML,而非CSS

条件注释能被IE判断是什么版本的浏览器,并在符合条件的情况下显示其中的内容,从IE5.07.0都支持注释功能,而且版本号精确到小数点后4位。

如:<!--[if IE 6.0]>此内容只有IE6.0可见<![endif]-->

IE条件注释还支持感叹号非操作:

如:<!--[if !IE 6.0]>此内容除了IE6.0版本之外都可见<![endif]-->

 

<!--其他浏览器 -->

<link rel="stylesheet" type="text/css" href="css.css" />

<!--[if IE 7]>

<!-- 适合于IE7 -->

<link rel="stylesheet" type="text/css" href="IE7.css" />

<![endif]-->

<!--[if lte IE 6]>

<!-- 适合于IE6及以下 -->

<link rel="stylesheet" type="text/css" href="IE.css" />

<![endif]-->

 

IE的if条件Hack

 

1. <!--[if  !IE]><!--> 除IE外都可识别 <!--<![endif]-->

2. <!--[if  IE]> 所有的IE可识别 <![endif]-->

3. <!--[if  IE 5.0]> 只有IE5.0可以识别 <![endif]-->

4. <!--[if  IE 5]> 仅IE5.0与IE5.5可以识别<![endif]-->

5. <!--[if  gt  IE 5.0]> IE5.0以上版本都可以识别 <![endif]-->

6. <!--[if  IE 6]> 仅IE6可识别 <![endif]-->

7. <!--[if  lt  IE 6]> IE6以及IE6以下版本可识别<![endif]-->

8. <!--[if  gte  IE 6]> IE6以及IE6以上版本可识别<![endif]-->

9. <!--[if  IE 7]> 仅IE7可识别 <![endif]-->

10. <!--[if  lt  IE 7]> IE7以及IE7以下版本可识别<![endif]-->

11. <!--[if  gte  IE 7]> IE7以及IE7以上版本可识别<![endif]-->

注:

gt = Great Then 大于

&gt; = > 大于号

lt = Less Then 小于

&lt; = < 小于号

gte = Great Then or Equal 大于或等于

lte = Less Then or Equal 小于或等于

 

五、FLOAT闭合(clearing float)

 

网页在某些浏览器上显示错位很多时候都是因为使用了float浮动而没有真正闭合,这也是div无法自适应高度的一个原因。如果父div没有设 float而其子div却设了float的话,父div无法包住整个子DIV,这种情况一般出现在一个父DIV下包含多个子DIV。解决办法:

1、给父DIV也设上float。

2、在所有子DIV后新加一个空DIV(不推荐,有些浏览器可以看见空DIV产生的空隙)

比如:

.parent{width:100px;}

.son1{float:left;width:20px;}

.son2{float:left;width:80px;}

.clear{clear:both;margin:0;parding0;height:0px;font-size:0px;}

 

<div class="parent">

      <div class="son1"></div>

      <div class="son2"></div>

      <div class="clear"></div>

</div>

 

3、overflow:auto

只要在父DIV的CSS中加上overflow:auto就搞定。

举例:

.parent{width:100px;overflow:auto }

.son1{float:left;width:20px;}

.son2{float:left;width:80px;}

<div class="parent">

      <div class="son1"></div>

      <div class="son2"></div>

</div>

原理是,外围元素之所以不能很好的延伸,问题出在了overflow上,因为overflow不可见。现在只要将给外围元素添加一个“overflow:auto”,就可以解决问题,结果是除了IE,真的可以解决。下来就要解决IE的问题了,再加上“_height:1%”,这个问题就完全解决了。

 

六、需要注意的一些兼容细节

 

1, FF下给 div 设置 padding 后会导致 width 和 height 增加(DIV的实际宽度=DIV宽+Padding), 但IE不会。

解决办法:给DIV设定IE、FF两个宽度,在IE的宽度前加上IE特有标记" * "号。

 

2, 页面居中问题.

body {TEXT-ALIGN: center;} 在IE下足够了,但FF下失效。

解决办法:加上"MARGIN-RIGHT: auto; MARGIN-LEFT: auto; "

 

3, 有的时候在IE6上看见一些奇怪的间隙,可我们高度明明设好了呀。

解决办法:试试在有空隙的DIV上加上"font-size:0px;"

 

4, 浮动IE6产生的双倍距离

#box{ float:left;

          width:100px;

          margin:0 0 0 100px;

}

这种情况之下IE6会产生200px的距离

解决办法:加上display:inline,使浮动忽略

 

这里细说一下block,inline两个元素,Block元素的特点是:总是在新行上开始,高度,宽度,行高,边距都可以控制(块元素);Inline元素的特点是:和其他元素在同一行上,…不可控制(内嵌元素);

#box{ display:block; //可以为内嵌元素模拟为块元素 display:inline; //实现同一行排列的的效果

 

5、页面的最小宽度

min-width是个非常方便的CSS命令,它可以指定元素最小也不能小于某个宽度,这样就能保证排版一直正确。但IE不认得min-这个定义,但实际上它把正常的width和height当作有min的情况来使。这样问题就大了,如果只用宽度和高度,正常的浏览器里这两个值就不会变,如果只用min-width和min-height的话,IE下面根本等于没有设置宽度和高度。比如要设置背景图片,这个宽度是比较重要的。

解决办法:为了让这一命令在IE上也能用,可以把一个<div> 放到 <body> 标签下,然后为div指定一个类:

然后CSS这样设计:

#container{

min-width: 600px;

width:e­xpression(document.body.clIEntWidth < 600? “600px”: “auto” );

}

第一个min-width是正常的;但第2行的width使用了Javascript,这只有IE才认得,这也会让你的HTML文档不太正规。它实际上通过Javascript的判断来实现最小宽度。

 

6、UL和FORM标签的padding与margin  

ul标签在FF中默认是有padding值的,而在IE中只有margin默认有值。FORM标签在IE中,将会自动margin一些边距,而在FF中margin则是0;

解决办法:css中首先都使用这样的样式ul,form{margin:0;padding:0;}给定义死了,后面就不会为这个头疼了. 

 

7 ,DIV浮动IE文本产生3象素的bug

左边对象浮动,右边采用外补丁的左边距来定位,右边对象内的文本会离左边有3px的间距。

#box{

float:left;

width:800px;}

#left{

float:left;

width:50%;}

#right{

width:50%;

}

*html #left{

margin-right:-3px;

//这句是关键

}

HTML代码

<DIV id=box>

<DIV id=left></DIV>

<DIV id=right></DIV>

</DIV>

 

上面这段代码的理解:

 

第一、只要right定义了width属性,在FF下绝对就会两行显示

第二、两个width都定义为百分比的话,就算都为100%在IE下也会一行显示。所以上面那句所谓“这句是关键”根本没用,不加也在一行,除非width定义的是数值才用得上。

 

所以说上面这段代码其实用处不大,至少在FF下不行。其实只要只定义left的width就行了,right不定义width就不管在IE还是FF 下都能成功,但这样的话父DIV BOX并没有真正的包含LEFT和RIGHT两子DIV。最简单的办法就是在RIGHT中加上float:left就 OK了。

 

8,截字省略号

 

.hh { -o-text-overflow:ellipsis;

        text-overflow:ellipsis;

        white-space:nowrap;

        overflow:hidden;

}

这个是在越出长度后会自行的截掉多出部分的文字,并以省略号结尾。技术是好技术,很多人都喜欢乱用,但注意Firefox并不支持。

 

9、DOCTYPE声明的重要性

DOCTYPE是document type(文档类型)的简写,在web设计中用来说明你用的XHTML或者HTML是什么版本。

要建立符合标准的网页,DOCTYPE声明是必不可少的关键组成部分;除非你的XHTML确定了一个正确的DOCTYPE,否则你的标识和CSS都不会生效。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

其中的DTD(例如上例中的xhtml1-transitional.dtd)叫文档类型定义,里面包含了文档的规则,浏览器就根据你定义的DTD来解释你页面的标识,并展现出来。

XHTML 1.0 提供了三种DTD声明可供选择:

* 过渡的(Transitional):要求非常宽松的DTD,它允许你继续使用HTML4.01的标识(但是要符合xhtml的写法),完整代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

* 严格的(Strict):要求严格的DTD,你不能使用任何表现层的标识和属性,例如<br>,完整代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

* 框架的(Frameset):专门针对框架页面设计使用的DTD,如果你的页面中包含有框架,需要采用这种DTD,完整代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

理想情况当然是严格的DTD,但对于我们大多数刚接触web标准的设计师来说,过渡的DTD(XHTML 1.0 Transitional)是目前理想选择。因为这种DTD还允许我们使用表现层的标识、元素和属性,也比较容易通过W3C的代码校验。

注:上面说的"表现层的标识、属性"是指那些纯粹用来控制表现的tag,例如用于排版的表格、背景颜色标识等。在XHTML中标识是用来表示结构的,而不是用来实现表现形式,我们过渡的目的是最终实现数据和表现相分离。

DOCTYPE声明必须放在每一个XHTML文档最顶部,在所有代码和标识之上。

post和get的区别:

 

一、为什么会出现兼容性问题

所谓的浏览器兼容性问题,是指因为不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况。在大多数情况下,用户用什么浏览器来查看同一网站,都应该是统一的显示效果。所以浏览器的兼容性问题是前端开发人员经常会碰到和必须要解决的问题。

浏览器兼容问题一:不同浏览器的标签默认的外边框和内边框不同

问题症状: 随便写几个标签,不加样式控制的情况下,各自的margin 和padding差异较大。

碰到频率: 100%

解决方案: css里    *{margin:0;padding:0;}

备注: 这个是最常见的也是最易解决的一个浏览器兼容性问题,几乎所有的css文件开头都会用通配符*来设置各个标签的内外边框是0。

 

浏览器兼容问题二:块属性标签float后,又有横行的margin情况下,在IE6显示margin比设置的大

问题症状: 常见症状是IE6中后面的一块被顶到下一行

碰到频率: 90%(稍微复杂点的页面都会碰到,float布局最常见的浏览器兼容问题)

解决方案: 在float的标签样式控制中加入display:inline;将其转化为行内属性

备注: 我们最常用的就是div+css布局了,而div就是一个典型的块属性标签,横向布局的时候我们通常都是用div float实现的,横向的间距设置如果用margin实现,这就是一个必然会碰到的兼容性问题。

 

浏览器兼容问题三:设置较小高度标签(一般小于10px),在IE6,IE7,遨游中高度超出自己设置高度

问题症状: IE6、7和遨游里这个标签的高度不受控制,超出自己设置的高度

碰到频率: 60%

解决方案: 给超出高度的标签设置overflow:hidden;或者设置行高line-height 小于你设置的高度。

备注: 这种情况一般出现在我们设置小圆角背景的标签里。出现这个问题的原因是IE8之前的浏览器都会给标签一个最小默认的行高的高度。即使你的标签是空的,这个标签的高度还是会达到默认的行高。

 

浏览器兼容问题四:行内属性标签,设置display:block后采用float布局,又有横行的margin的情况,IE6间距bug(类似第二种)

问题症状: IE6里的间距比超过设置的间距

碰到几率: 20%

解决方案: 在display:block;后面加入display:inline;display:table;

备注: 行内属性标签,为了设置宽高,我们需要设置display:block;(除了 input标签比较特殊)。在用float布局并有横向的margin后,在IE6下,他就具有了块属性float后的横向margin的bug。不过因为它本身就是行内属性标签,所以我们再加上display:inline的话,它的高宽就不可设了。这时候我们还需要在display:inline后面加入display:talbe。

 

浏览器兼容问题五:图片默认有间距

问题症状: 几个img标签放在一起的时候,有些浏览器会有默认的间距,加了问题一中提到的通配符也不起作用。

碰到几率 :20%

解决方案: 使用float属性为img布局

备注: 因为img标签是行内属性标签,所以只要不超出容器宽度,img标签都会排在一行里,但是部分浏览器的img标签之间会有个间距。去掉这个间距使用float是正道。(使用负margin,虽然能解决,但负margin 本身就是容易引起浏览器兼容问题的用法,所以不建议使用)

 

浏览器兼容问题六:标签最低高度设置min-height不兼容

问题症状: 因为min-height本身就是一个不兼容的css属性,所以设置min-height时不能很好的被各个浏览器兼容

碰到几率 :5%

解决方案: 如果我们要设置一个标签的最小高度200px,需要进行的设置为:{min-height:200px; height:auto !important; height:200px; overflow:visible;}

备注: 在B/S系统前端开时, 有很多情况下我们又这种需求。当内容小于一个值(如300px)时。容器的高度为300px;当内容高度大于这个值时,容器高度被撑高,而不是出现滚动条。这时候我们就会面临这个兼容性问题。

 

二、如何应对兼容性问题

做兼容页面的方法是:每写一小段代码(布局中的一行或者一块)我们都要在不同的浏览器中看是否兼容,当然熟练到一定的程度就没这么麻烦了。建议经常会碰到兼容性问题的新手使用。很多兼容性问题都是因为浏览器对标签的默认属性解析不同造成的,只要我们稍加设置都能轻松地解决这些兼容问题。如果我们熟悉标签的默认属性的话,就能很好的理解为什么会出现兼容问题以及怎么去解决这些兼容问题

 

1.          css hack技术

 

css hack 技术是通过一些浏览器特殊支持或者不支持的语句,确定一个css样式能给被浏览器解析或者不能被浏览器解析。css  hack技术针对不同浏览器的差异进行利用和设计,使用它可以在最大限度的让所以的浏览器下显示同样的风格和模式。

css hack 技术是一种改善CSS在不同浏览器下的表现形式的技巧与方法。 CSS hack技术是通过一些浏览器特殊或者不支持的语句,使一个CSS样式能够被浏览器解析或者不能解析的方法实现的。

CSS Hack的原理只有两条:兼容性顺序。就是利用书写顺序和不同浏览器对一些特定书写方法的解析方式不同而达到不同的效果。不管是什么方法,书写的顺序都是firefox的写在前面,IE7的写在中间,IE6的写在最后面。(其顺序正好是对CSS2.0标准执行的好坏程度)

可把浏览器分为3类:IE6 ;IE7和遨游;其他(IE8 chrome ff safari opera等)。IE6认识的hacker 是下划线_ 和星号 *;IE7和遨游只认识的hacker是星号 * ;而其他浏览器下划线_和星号*都不认识。

比如有这样一个css样式设置

 #exam{height:300px;

*height:200px;

_height:100px; }

IE6浏览器在读到 height:300px的时候会认为高度是300px;继续往下读,他也认识*heihgt,所以当IE6读到*height:200px的时候会覆盖掉前一条的相冲突设置,认为高度是200px。继续往下读,IE6还认识_height,所以他又会覆盖掉200px高的设置,把高度设置为100px;IE7和遨游也是一样的从高度300px的设置往下读。当它们读到*height200px的时候就停下了,因为它们不认识_height。所以它们会把高度解析为200px;剩下的浏览器只认识第一个height:300px;所以他们会把高度解析为300px。因为优先级相同且相冲突的属性设置后一个会覆盖掉前一个,所以书写的次序是很重要的。

DIV+CSS网页布局这是一种趋势,不过在使用DIV+CSS网站设计的时候,应该注意css样式兼容不同浏览器问题,特别是对完全使用DIV+CSS设计的网页,就应该更注意IE6、 IE7 和FF对CSS样式的兼容。

什么是浏览器兼容:当我们使用不同的浏览器(Firefox、IE7、IE6)访问同一个网站,或者页面的时候,会出现一些不兼容的问题,在这种浏览器下显示正常,在另一种下就乱了,目前解决这个浏览器的问题,最直接的方法就是利用CSS hack技术为每个浏览器各写一段css,让它们各执行各的,这就是CSS hack技术解决CSS在不同浏览器中的兼容性问题的核心。

 

2.         !important

!important是被Firefox浏览器所支持的一种用于确定优先级的技术。随着IE7对!important的支持, !important 方法现在只针对IE6的兼容性问题。注意:!important也算是hack的一种。不过实用性较小。

例如:

#example {

width: 100px !important;

width: 200px;

}

 

三、CSS HACK的常用方法

首先需要知道的是:

所有浏览器 通用 height: 100px;

IE6 专用 _height: 100px;

IE7 专用 *+height: 100px;

IE6、IE7 共用 *height: 100px;

IE7、FF 共用 height: 100px !important;

 

例如:

 

#example { height:100px; }

* html #example { height:200px; }

*+html #example { height:300px; }

 

 

下面的这种方法比较简单

举几个例子:

1、IE6 - IE7+FF(-为区别,+为共同)

#example {

height:100px;

_height:200px;

}

其实这个用上面说的第一种方法也可以

#example {

height:100px !important;

height:200px;

}

 

2、IE6+IE7 - FF

#example {

height:100px;

*height:200px;

}

 

3、IE6+FF - IE7

#example {

height:100px;

*+height:200px;

}

 

4、IE6 IE7 FF 各不相同

     

#example {

height:100px;

_height:200px;

*+height:300px;

}

或:

#example {

height:100px;

*height:300px;

_height:200px;

}

 

需要注意的是,代码的顺序一定不能颠倒了,要不又前功尽弃了。因为浏览器在解释程序的时候,如果重名的话,会用后面的覆盖前面的,就象给变量赋值一个道理,所以我们把通用的放前面,越专用的越放后面。

 

解释一下4的代码:读代码的时候,第一行height:100px; 大家都通用,IE6 IE7 FF 都显示100px。到了第二行*height:300px; FF不认识这个属性,IE6 IE7都认,所以FF还显示100px,而IE6 IE7把第一行得到的height属性给覆盖了,都显示300px。到了第三行_height:200px;只有IE6认识,所以IE6就又覆盖了在第二行得到的height,最终显示200px。这样,三个浏览器都有自己的height属性了。

 

需要说明的是:*+html 对IE7的兼容 必须保证HTML顶部有如下声明:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " http://www.w3.org/TR/html4/loose.dtd ">

 

 

四、使用IE专用的条件注释

条件注释是IE特有的一种功能,能对IE系列产品进行单独的XHTML代码处理,注意,主要是针对XHTML,而非CSS

条件注释能被IE判断是什么版本的浏览器,并在符合条件的情况下显示其中的内容,从IE5.07.0都支持注释功能,而且版本号精确到小数点后4位。

如:<!--[if IE 6.0]>此内容只有IE6.0可见<![endif]-->

IE条件注释还支持感叹号非操作:

如:<!--[if !IE 6.0]>此内容除了IE6.0版本之外都可见<![endif]-->

 

<!--其他浏览器 -->

<link rel="stylesheet" type="text/css" href="css.css" />

<!--[if IE 7]>

<!-- 适合于IE7 -->

<link rel="stylesheet" type="text/css" href="IE7.css" />

<![endif]-->

<!--[if lte IE 6]>

<!-- 适合于IE6及以下 -->

<link rel="stylesheet" type="text/css" href="IE.css" />

<![endif]-->

 

IE的if条件Hack

 

1. <!--[if  !IE]><!--> 除IE外都可识别 <!--<![endif]-->

2. <!--[if  IE]> 所有的IE可识别 <![endif]-->

3. <!--[if  IE 5.0]> 只有IE5.0可以识别 <![endif]-->

4. <!--[if  IE 5]> 仅IE5.0与IE5.5可以识别<![endif]-->

5. <!--[if  gt  IE 5.0]> IE5.0以上版本都可以识别 <![endif]-->

6. <!--[if  IE 6]> 仅IE6可识别 <![endif]-->

7. <!--[if  lt  IE 6]> IE6以及IE6以下版本可识别<![endif]-->

8. <!--[if  gte  IE 6]> IE6以及IE6以上版本可识别<![endif]-->

9. <!--[if  IE 7]> 仅IE7可识别 <![endif]-->

10. <!--[if  lt  IE 7]> IE7以及IE7以下版本可识别<![endif]-->

11. <!--[if  gte  IE 7]> IE7以及IE7以上版本可识别<![endif]-->

注:

gt = Great Then 大于

&gt; = > 大于号

lt = Less Then 小于

&lt; = < 小于号

gte = Great Then or Equal 大于或等于

lte = Less Then or Equal 小于或等于

 

五、FLOAT闭合(clearing float)

 

网页在某些浏览器上显示错位很多时候都是因为使用了float浮动而没有真正闭合,这也是div无法自适应高度的一个原因。如果父div没有设 float而其子div却设了float的话,父div无法包住整个子DIV,这种情况一般出现在一个父DIV下包含多个子DIV。解决办法:

1、给父DIV也设上float。

2、在所有子DIV后新加一个空DIV(不推荐,有些浏览器可以看见空DIV产生的空隙)

比如:

.parent{width:100px;}

.son1{float:left;width:20px;}

.son2{float:left;width:80px;}

.clear{clear:both;margin:0;parding0;height:0px;font-size:0px;}

 

<div class="parent">

      <div class="son1"></div>

      <div class="son2"></div>

      <div class="clear"></div>

</div>

 

3、overflow:auto

只要在父DIV的CSS中加上overflow:auto就搞定。

举例:

.parent{width:100px;overflow:auto }

.son1{float:left;width:20px;}

.son2{float:left;width:80px;}

<div class="parent">

      <div class="son1"></div>

      <div class="son2"></div>

</div>

原理是,外围元素之所以不能很好的延伸,问题出在了overflow上,因为overflow不可见。现在只要将给外围元素添加一个“overflow:auto”,就可以解决问题,结果是除了IE,真的可以解决。下来就要解决IE的问题了,再加上“_height:1%”,这个问题就完全解决了。

 

六、需要注意的一些兼容细节

 

1, FF下给 div 设置 padding 后会导致 width 和 height 增加(DIV的实际宽度=DIV宽+Padding), 但IE不会。

解决办法:给DIV设定IE、FF两个宽度,在IE的宽度前加上IE特有标记" * "号。

 

2, 页面居中问题.

body {TEXT-ALIGN: center;} 在IE下足够了,但FF下失效。

解决办法:加上"MARGIN-RIGHT: auto; MARGIN-LEFT: auto; "

 

3, 有的时候在IE6上看见一些奇怪的间隙,可我们高度明明设好了呀。

解决办法:试试在有空隙的DIV上加上"font-size:0px;"

 

4, 浮动IE6产生的双倍距离

#box{ float:left;

          width:100px;

          margin:0 0 0 100px;

}

这种情况之下IE6会产生200px的距离

解决办法:加上display:inline,使浮动忽略

 

这里细说一下block,inline两个元素,Block元素的特点是:总是在新行上开始,高度,宽度,行高,边距都可以控制(块元素);Inline元素的特点是:和其他元素在同一行上,…不可控制(内嵌元素);

#box{ display:block; //可以为内嵌元素模拟为块元素 display:inline; //实现同一行排列的的效果

 

5、页面的最小宽度

min-width是个非常方便的CSS命令,它可以指定元素最小也不能小于某个宽度,这样就能保证排版一直正确。但IE不认得min-这个定义,但实际上它把正常的width和height当作有min的情况来使。这样问题就大了,如果只用宽度和高度,正常的浏览器里这两个值就不会变,如果只用min-width和min-height的话,IE下面根本等于没有设置宽度和高度。比如要设置背景图片,这个宽度是比较重要的。

解决办法:为了让这一命令在IE上也能用,可以把一个<div> 放到 <body> 标签下,然后为div指定一个类:

然后CSS这样设计:

#container{

min-width: 600px;

width:e­xpression(document.body.clIEntWidth < 600? “600px”: “auto” );

}

第一个min-width是正常的;但第2行的width使用了Javascript,这只有IE才认得,这也会让你的HTML文档不太正规。它实际上通过Javascript的判断来实现最小宽度。

 

6、UL和FORM标签的padding与margin  

ul标签在FF中默认是有padding值的,而在IE中只有margin默认有值。FORM标签在IE中,将会自动margin一些边距,而在FF中margin则是0;

解决办法:css中首先都使用这样的样式ul,form{margin:0;padding:0;}给定义死了,后面就不会为这个头疼了. 

 

7 ,DIV浮动IE文本产生3象素的bug

左边对象浮动,右边采用外补丁的左边距来定位,右边对象内的文本会离左边有3px的间距。

#box{

float:left;

width:800px;}

#left{

float:left;

width:50%;}

#right{

width:50%;

}

*html #left{

margin-right:-3px;

//这句是关键

}

HTML代码

<DIV id=box>

<DIV id=left></DIV>

<DIV id=right></DIV>

</DIV>

 

上面这段代码的理解:

 

第一、只要right定义了width属性,在FF下绝对就会两行显示

第二、两个width都定义为百分比的话,就算都为100%在IE下也会一行显示。所以上面那句所谓“这句是关键”根本没用,不加也在一行,除非width定义的是数值才用得上。

 

所以说上面这段代码其实用处不大,至少在FF下不行。其实只要只定义left的width就行了,right不定义width就不管在IE还是FF 下都能成功,但这样的话父DIV BOX并没有真正的包含LEFT和RIGHT两子DIV。最简单的办法就是在RIGHT中加上float:left就 OK了。

 

8,截字省略号

 

.hh { -o-text-overflow:ellipsis;

        text-overflow:ellipsis;

        white-space:nowrap;

        overflow:hidden;

}

这个是在越出长度后会自行的截掉多出部分的文字,并以省略号结尾。技术是好技术,很多人都喜欢乱用,但注意Firefox并不支持。

 

9、DOCTYPE声明的重要性

DOCTYPE是document type(文档类型)的简写,在web设计中用来说明你用的XHTML或者HTML是什么版本。

要建立符合标准的网页,DOCTYPE声明是必不可少的关键组成部分;除非你的XHTML确定了一个正确的DOCTYPE,否则你的标识和CSS都不会生效。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

其中的DTD(例如上例中的xhtml1-transitional.dtd)叫文档类型定义,里面包含了文档的规则,浏览器就根据你定义的DTD来解释你页面的标识,并展现出来。

XHTML 1.0 提供了三种DTD声明可供选择:

* 过渡的(Transitional):要求非常宽松的DTD,它允许你继续使用HTML4.01的标识(但是要符合xhtml的写法),完整代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

* 严格的(Strict):要求严格的DTD,你不能使用任何表现层的标识和属性,例如<br>,完整代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

* 框架的(Frameset):专门针对框架页面设计使用的DTD,如果你的页面中包含有框架,需要采用这种DTD,完整代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

理想情况当然是严格的DTD,但对于我们大多数刚接触web标准的设计师来说,过渡的DTD(XHTML 1.0 Transitional)是目前理想选择。因为这种DTD还允许我们使用表现层的标识、元素和属性,也比较容易通过W3C的代码校验。

注:上面说的"表现层的标识、属性"是指那些纯粹用来控制表现的tag,例如用于排版的表格、背景颜色标识等。在XHTML中标识是用来表示结构的,而不是用来实现表现形式,我们过渡的目的是最终实现数据和表现相分离。

DOCTYPE声明必须放在每一个XHTML文档最顶部,在所有代码和标识之上。

http的传输方式:

1)无状态

http协议是一种自身不对请求和响应之间的通信状态进行保存的协议,即无状态协议。

这种设置的好处是:更快的处理更多的请求事务,确保协议的可伸缩性

不过随着web的不断发展,有时候,需要将这种状态进行保持,随即,就引入了cookie技术,cookie技术通过在请求和响应报文中写入cookie信息来控制客户端的状态。

有关cookie的内容后面我们再说。。。

2)持久性

正常在发送http时,都需要建立TCP的连接,再发送报文。

 

如果每次想要发送http报文都需要经过这个过程,那么时间大部分都会消耗在建立和断开连接的过程中。

 

因此http中使用了connection属性,用于指定连接的方式。

 

当设置成keep-alive,http就会建立一条持久化的连接,不需要每次都建立连接,再中断。

 

这样做的好处是:减轻了服务器端的负载,减少开销的那部分时间,使http请求和响应都能更快的结束,相应的,web页面显示速度也就相对提升了。

 

3)管线化

 

如果一个http请求,请求了大量的图片等大文件,那么其他的http请求怎么办呢?

 

现在,管线化技术的出现,使得http请求比持久性连接更要快;特点在于:请求数越多,时间差越明显。

 

4)内容编码

 

由于某些报文的内容过大,因此在传输时,为了减少传输的时间,会采取一些压缩的措施。

 

例如上面的报文信息中,Accept-Encoding就定义了内容编码的格式:gzip

 

有下面几种方式:

 

gzip:GNU压缩格式

 

compress:UNIX系统的标准压缩格式

 

deflate:是一种同时使用了LZ77和哈弗曼编码的无损压缩格式

 

identity:不进行压缩

 

5)多部分对象集合

 

有的时候传输的内容,不仅仅是一些字符串,还有可能是一些图片,字符,音乐二进制等混杂的内容。

 

这就需要使用多部分对象集合,multipart,例如在使用java编写web上传文件的代码时,需要在form中指定form的编码格式。

 

设置form的enctype属性的值为multipart/form-data。

 

这是因为默认的情况下form使用的编码格式是:applicatin/x-www-form-urlencoded,这种编码格式会把所有的内容进行编码,不适合上传文件这种情况。

 

这两种编码格式的区别主要是:

 

multipart/form-data 会以控件为基准,编码form中的内容。

 

application/x-www-form-urlencoded 会把form中的内容编码成键值对的形式。

 

6)范围请求

 

有些场景下,http报文请求一些很大的图片,但是加载过程很慢。

 

比如我们登录一些大图片的网址,会发现有时候图片是一块一块加载的。

 

这就是因为设置了http请求的长度,这样就可以分块的加载资源文件。

 

在请求报文中使用Range属性,在响应报文中使用Content-Type属性都可以指定一定字节范围的http请求。

 

http协议的传输方式有很多种,处于安全考虑,常用的一般都是GET和POST两种,先来介绍下这两种

 

1)GET:获取资源

 

GET方法用来请求访问已被URL识别的资源

 

2)POST:传输实体主体

 

POST方法用来请求服务器传输信息实体的主体

 

GET和POST的区别:

 

首先,使用目标不同:GET方法只是用来查询,不会对浏览器上的信息产生影响,每次GET的方法都是相同的

 

其次,大小不同:GET是放在URL首部,因此大小随着浏览器而定,而POST则是在报文中,只要没有具体限制,文件的大小是没限制的

 

然后,安全性不同:GET采用的是明文传输,而POST是放在报文内部,无法看到

 

从使用场景的角度来说,一般像用户注册登录这种信息都是私密的,采用POST,而针对查询等,为了快速,大多采用GET传输。

 

(关于关于GET和POST的区别,最近重新看了很多别人写的博客啊资料什么的,发现上面的解释比较模糊,我就在下面的评论区里面将区别清晰的描述一下,当然,后面的博客也会详细的解释)

 

 

 

接下来介绍其他几种数据传输方式:

 

3)PUT:传输文件

 

PUT要求在请求报文的主体中包含文件内容,然后保存到请求URL指定的位置

 

处于安全考虑,一般web网站不使用此方法,若配合web的安全验证机制,或者架构采用REST标准的网站,就可能开放使用此方法

 

4)HEAD:获得报文首部

 

HEAD和GET方法一样,只不过不返回报文主体部分,用于确认URI的有效性及资源更新的日期时间等

 

5)DELETE:删除文件

 

DELETE是与PUT相反的方法,是按请求URI删除指定的资源

 

处于安全考虑,一般web网站不使用此方法,若配合web的安全验证机制,或者架构采用REST标准的网站,就可能开放使用此方法

 

6)OPYIONS:询问支持的方法

 

用来查询针对请求URI指定的资源支持的方法

 

7)TRACE:追踪路径

 

是让web服务器端将之前的请求通信还回给客户端的方法

 

发送请求时,在Max-Frowards首部字段中填入数值,每经过一个服务器端就-1,当数值为0时,停止传输,最后收到服务器返回状态码200 OK的响应

 

但是,这种方法基本很少使用,而且很容易引起XST(跨站追踪)攻击,就更不会用到了。

 

8)CONNECT:要求采用隧道协议连接代理

 

该方法要求在于代理服务器通信时建立隧道,实现用隧道协议进行TCP通信,主要使用SSL(安全套接层)和TLS(传输层安全)协议把通信内容加密后经过网络传输。

 

 

 

posted on 2017-05-09 23:57  zahngjiaxin  阅读(140)  评论(0编辑  收藏  举报