web前端之Html和Css应用中的细节问题

1、居中的n种方法:
①、margin: 0 20%;
——设置margin上下外边距的值设置为0,左右外边距设置成相同的百分比,既可将盒子居中。


②、margin: 0 auto;
width: 1000px;
——设置margin上下外边距的值设置为0,左右外边距都设置成auto,然后再设置盒子的宽度,既可将盒子居中。


③、#outer_div
{
padding: 30px;
text-align: center;
}
#inner_div
{display: inline-block; /*行内块元素*/
padding: 50px;
background-color: red;}
——使用两个盒子的嵌套实现,这里只需要将父盒子中的text-align的值设置为center,然后再将子盒子display的值设置成inline-block(行内块元素)便可实现居中。

2、关于margin属性之外边距合并问题:
①、在常规文档流中,2个或以上的块级盒模型相邻的垂直margin会被合并。最终的margin值计算方法如下:
a、全部都为正值,取最大者;
b、不全是正值,则都取绝对值,然后用正值减去最大值;
c、没有正值,则都取绝对值,然后用0减去最大值。
②、相邻的盒模型中,如果其中的一个是浮动的(floated),垂直margin不会被合并,甚至一个浮动的盒模型和它的子元素之间也是这样。
③、设置了overflow属性的元素和它的子元素之间的margin不会被合并(overflow取值为visible除外)。
④、设置了绝对定位(position:absolute)的盒模型,垂直margin不会被合并,甚至和他们的子元素之间也是一样。
⑤、设置了display:inline-block的元素,垂直margin不会被合并,甚至和他们的子元素之间也是一样。
⑥、如果一个盒模型的上下margin相邻,这时它的margin可能合并覆盖(collapse through)它。在这种情况下,元素的位置(position)取决于它的相邻元素的margin是否被合并。
a、如果元素的margin和它的父元素的margin-top折叠在一起,盒模型border-top的边界定义和它的父元素相同。
b、另外,任意元素的父元素不参与margin的合并,或者说只有父元素的margin-bottom是参与计算的。如果元素的border-top非零,那么元素的border-top边界位置和原来一样。
一个应用了清除操作的元素的margin-top绝不会和它的块级父元素的margin-bottom合并。
注意,那些已经被合并覆盖的元素的位置对其他已经被合并的元素的位置没有任何影响;只有在对这些元素的子元素定位时,border-top边界位置才是必需的。
⑦、根元素的垂直margin不会被合并。


解决方案:
l 在父层div加上:overflow:hidden;
l 把margin-top外边距改成padding-top内边距;
l 父元素产生边距重叠的边有不为 0 的 padding 或宽度不为 0 且 style 不为 none 的 border
父层div加: padding-top: 1px;
让父元素生成一个 block formating context,以下属性可以实现
l * float: left/right
l * position: absolute
l * display: inline-block/table-cell(或其他 table 类型)
l * overflow: hidden/auto
l 父层div加:position: absolute;

3、float属性的消除:
①、清除浮动方法一:(clear:both;)
ul{list-style:none;}
ul li{float:left; margin:5px;}
.clear{clear:both;overflow:hidden;}


②、清除浮动方法二:(overflow:auto)
ul
{
list-style:none;
overflow:auto;
_zoom:1;
/*zoom是为了兼容ie6做的,触发ie6下的haslayout属性*/
}
ul li
{
float:left;
margin:5px;
}


③、清除浮动方法三:(:after 伪类元素)
#after ul:after
{
content: ".";
display: block;
height: 0;
line-height: 0;
clear: both;
visibility: hidden;
}
④、采用display:table将对象变成table形式
⑤、采用div标签,以及css的clear属性
⑥、采用br标签,以及css的clear属性
⑦、采用br标签,以及其自身HTML的clear属性

4、浏览器的兼容性:


①、浏览器兼容问题一:不同浏览器的标签默认的外补丁和内补丁不同
问题症状:随便写几个标签,不加样式控制的情况下,各自的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;
}


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

posted on 2015-12-13 11:34  落叶归尘  阅读(483)  评论(0编辑  收藏  举报

导航