web中margin的用法(vertical margin)
本篇文章给大家谈谈web中margin的用法,以及vertical margin对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
Web前端中常见的浏览器兼容问题有哪些
使用Trident内核的浏览器:IE、Maxthon、TT;使用Gecko内核的浏览器:Netcape6及以上版本、FireFox;使用Presto内核的浏览器:Opera7及以上版本;使用Webkit内核的浏览器:Safari、Chrome。
而我现在所说的兼容性问题,主要是说IE与几个主流浏览器如firefox,google等。而对IE浏览器来说,IE7又是个跨度,因为之前的版本更新甚慢,bug甚多。从IE8开始,IE浏览器渐渐遵循标准,到IE9后由于大家都一致认为标准很重要,可以说在兼容性上比较好了,但是在中国来说,由于xp的占有率问题,使用IE7以下的用户仍然很多,所以我们不得不考虑低版本浏览器的兼容。
对浏览器兼容问题,一般分,HTML,Javascript兼容,CSS兼容。其中html相关问题比较容易处理,无非是高版本浏览器用了低版本浏览器无法识别的元素,导致其不能解析,所以平时注意一点就是。特别是HTML5增加了许多新标签,低版本浏览器有点影响时代进步啊
问题一:不同浏览器的标签默认的外补丁和内补丁不同
问题症状:随便写几个标签,不加样式控制的情况下,各自的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是正道
问题六:标签最低高度设置min-height不兼容
问题症状:因为min-height本身就是一个不兼容的css属性,所以设置min-height时不能很好的被各个浏览器兼容
碰到几率:5%
解决方案:如果我们要设置一个标签的最小高度200px,需要进行的设置为:{min-height:200px; height:auto!important; height:200px; overflow:visible;}
备注:在B/S系统前端开时,有很多情况下我们有这种需求。当内容小于一个值(如300px)时。容器的高度为300px;当内容高度大于这个值时,容器高度被撑高,而不是出现滚动条。这时候我们就会面临这个兼容性问题。
问题七:透明度的兼容css设置
方法是:每写一小段代码(布局中的一行或者一块)我们都要在不同的浏览器中看是否兼容,当然熟练到一定的程度就没这么麻烦了。建议经常会碰到兼容性问题的新手使用。很多兼容性问题都是因为浏览器对标签的默认属性解析不同造成的,只要我们稍加设置都能轻松地解决这些兼容问题。如果我们熟悉标签的默认属性的话,就能很好的理解为什么会出现兼容问题以及怎么去解决这些兼容问题。1
技巧一:css hack
使用hacker我可以把浏览器分为3类:ie6;ie7和遨游;其他(ie8 chrome ff safari opera等)
ie6认识的hacker是下划线_和星号*
ie7遨游认识的hacker是星号*(包括上面问题6中的!important也算是hack的一种。不过实用性较小。)
比如这样一个css设置 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。1234
因为优先级相同且相冲突的属性设置后一个会覆盖掉前一个,所以书写的次序是很重要的。
/* CSS属性级Hack*/ color:red;/*所有浏览器可识别*/_color:red;/*仅IE6识别*/*color:red;/* IE6、IE7识别*/+color:red;/* IE6、IE7识别*/*+color:red;/* IE6、IE7识别*/[color:red;/* IE6、IE7识别*/ color:red\9;/* IE6、IE7、IE8、IE9识别*/color:red\0;/* IE8、IE9识别*/color:red\9\0;/*仅IE9识别*/color:red \0;/*仅IE9识别*/color:red!important;/* IE6不识别!important有危险*//* CSS选择符级Hack*/*html#demo{ color:red;}/*仅IE6识别*/*+html#demo{ color:red;}/*仅IE7识别*/body:nth-of-type(1)#demo{ color:red;}/* IE9+、FF3.5+、Chrome、Safari、Opera可以识别
*/ head:first-child+body#demo{ color:red;}/* IE7+、FF、Chrome、Safari、Opera可以识别*/:root#demo{ color:red\9;}:/*仅IE9识别*/123456789101112131415161718192021222324252627282930313233
越少的浮动,就会越少的代码,会有更灵活的页面,会有扩展性更强的页面。这不多说,归结为到一定水平了,浮动会用的较少。另外,您也会避免使用浮动+margin的用法。所以,越后来越不易遇到这种bug。
技巧二:padding,marign,height,width
注意是技巧,不是方法:写好标准头”>”>尽量用padding,慎用margin,height尽量补上100%,父级height有定值子级height不用100%,子级全为浮动时底部补个空clear:both的div宽尽量用margin,慎用padding,width算准实际要的减去padding
技巧三:显示类(display:block,inline)
display:block,inline两个元素
display:block;//可以为内嵌元素模拟为块元素display:inline;//实现同一行排列的的效果display:table;//for FF,模拟table的效果1234567
display:block块元素,元素的特点是:总是在新行上开始;高度,行高以及顶和底边距都可控制;宽度缺省是它的容器的100%,除非设定一个宽度
display:inline就是将元素显示为行内元素,元素的特点是:和其他元素都在一行上;高,行高及顶和底边距不可改变;宽度就是它的文字或图片的宽度,不可改变。span,a,label,input,img,strong和em是 inline元素的例子
技巧四:怎样使一个div层居中于浏览器中?
1)
<style type="text/css"><!-- div{position:absolute;top:50%;left:50%;margin:-100px 0 0-100px;width:200px;height:200px;border:1px solid red;}--></style>12345678910111213141516171819
2)div里的内容,IE默认为居中,而FF默认为左对齐,可以尝试增加代码margin: 0 auto;
技巧五:float的div闭合;清除浮动;自适应高度
①例如:<div id="floatA"><div id="floatB"><div id="NOTfloatC">
这里的NOTfloatC并不希望继续平移,而是希望往下排。(其中floatA、floatB的属性已经设置为float:left;)
这段代码在IE中毫无问题,问题出在FF。原因是NOTfloatC并非float标签,必须将float标签闭合。在<divclass="floatB"><div class="NOTfloatC">之间加上<div class="clear">这个div一定要注意位置,而且必须与两个具有float属性的div同级,之间不能存在嵌套关系,否则会产生异常。并且将clear这种样式定义为为如下即可:.clear{clear:both;}
②作为外部 wrapper的 div不要定死高度,为了让高度能自适应,要在wrapper里面加上overflow:hidden;当包含float的box的时候,高度自适应在IE下无效,这时候应该触发IE的layout私有属性(万恶的IE啊!)用zoom:1;可以做到,这样就达到了兼容。
例如某一个wrapper如下定义:
.colwrapper{overflow:hidden; zoom:1; margin:5px auto;}1
③对于排版,我们用得最多的css描述可能就是float:left.有的时候我们需要在n栏的float div后面做一个统一的背景,譬如:
<div id=”page”>
<div id=”left”></div>
<div id=”center”></div>
<div id=”right”></div>
</div>1234567
比如我们要将page的背景设置成蓝色,以达到所有三栏的背景颜色是蓝色的目的,但是我们会发现随着left centerright的向下拉长,而page居然保存高度不变,问题来了,原因在于page不是float属性,而我们的page由于要居中,不能设置成float,所以我们应该这样解决:
<div id=”page”>
<div id=”bg” style=”float:left;width:100%”>
<div id=”left”></div>
<div id=”center”></div>
<div id=”right”></div>
</div>
</div>1234567891011
再嵌入一个float left而宽度是100%的DIV解决之。
④万能float闭合(非常重要!)
关于 clear float的原理可参见 [How To ClearFloats Without Structural Markup],将以下代码加入Global CSS中,给需要闭合的div加上class=”clearfix”即可,屡试不爽。
/* Clear Fix*/.clearfix:after{ content:"."; display:block; height:0; clear:both;visibility:hidden;}.clearfix{ display:inline-block;}/* Hide from IE Mac*/.clearfix{display:block;}/* End hide from IE Mac*//* end of clearfix*/1234567
或者这样设置:.hackbox{display:table;//将对象作为块元素级的表格显示}
技巧六:div嵌套时 y轴上 padding和 marign的问题
FF里 y轴上子div到父div的距离为父padding+子marign
IE里 y轴上子div到父div的距离为父padding和子marign里大的一个
FF里 y轴上父padding=0且 border=0时,子div到父div的距离为0,子marign作用到父div外面
web前端什么情况会发生margin塌陷
在 Web前端开发中,margin塌陷是指当元素的内外边距同时为 0时,会发生 margin塌陷。这种情况通常发生在以下情况下:
父元素的高度为 0,且子元素的宽度自适应父元素高度。
子元素与父元素的 margin-top或 margin-bottom为 0,且父元素的高度为 0。
两个元素之间的 margin为 0,且它们之间没有其它元素。
为了避免 margin塌陷,可以使用绝对定位或伪元素来使元素自适应父元素高度,或者可以使用 CSS的 overflow属性来使元素的高度自适应内容。同时,在编写 CSS样式时,应该尽量避免使用 margin属性,而是使用 padding属性来代替,这样可以减少 margin塌陷的发生。
web前端工程师工作中遇到难以解决的问题
1).margin-top,margin-bottom不能正常显示时
一.有时会遇到外层中的子层使用margin-top不管用的情况;这里我们需要在子层的前后加上一个
div{height:0;overflow:hidden;}
例
CSS样式表中:
#box{background-color:#eee;}
#box p{margin-top: 20px;margin-bottom: 20px;text-align:center;}
解决方法:在P标签前后各加2个空的div:<divstyle="height:0;overflow:hidden"></div>
二.网页中头部,中部,底部的居底部有时给个margin-bottom:10px;不管用也是要给个清除属性的.clear{clear:both;font-size:0;line-height:0;}在底部<div id="footer"></div>下加个<div></div>
2).div层中高度自适应问题
网页前端科技人员在设计网页时不可能知道客户在要他们自己的网站内容页里加多少文字或图片内容
这时我们就不能规定div层的高度,为此应写成min-height:200px;height:auto!important;height:
200px;overflow:visible;这样ie7,ff,ie6浏览器的高度自适应问题就解决了,这些在
网站中用到最多了。
3).div层中子层的居底部对齐问题
div中的定位问题有很多也很麻烦,但弄懂了就OK了,在一个大的div层中如何让子层的内容居底部
对齐就涉及到了position定位问题;
例
div层#box{position:relative;border:1px solidred;width:600px;hegiht:400px;}
div子层#box.wrap{position:absolute;bottom:0;border:1px dashedblue;width:200px;height:
100px},最近写的网站中就用到了
4).div层中清除clear属性的一小部分应用
在div中一个大的层里面有很多子层,若是加上边框在ie7、ie6中或许会正常显示,但是在ff中可能
只会成一条线了,此时在最外层的后面加上<div style="clear:both"></div>或者设.wrapfix:after{
content:".";
display: block;
height: 0;
clear: both;
visibility: hidden;
}后在每个浮动外框调用wrapfix;学生书网里用到最多了。
5).解决IE8下div移位、错位等兼容性问题
在<head>标签后面的第一句话加上<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7"/>就OK了
6).单行文字居中与字体样式问题
在div中一个层中只有一行文字,要让这层中的文字居中,可设line-height的高度和层的高度一样,注意这一层中的文字不能换行,此外,设了line-height时再给定字体样式font:bold 14px"宋体";这时要把font:bold 14px"宋体";放在line-height的前面,否则字体样式不显示文字也不居中;或者将font:bold 14px"宋体";改成font-size:16px;font-weight:bold;font-family:"宋体";就OK了。
7).鼠标滑上去的特殊效果
往往为了达到显眼的效果,我们会写到一些好看的效果,方法一在样式表中写:ul li a{border:1px solid red;}ul li a:hoverimg{filter:alpha(opacity=40在ul标签中调用即可方法二:在样式表中写上:.hover img{filter:alpha(opacity=40);}在div中调用onmouseover="this.className='hover'"onmouseout="this.className=this.classtype"即可
8).IE6中高度不对问题
今天在div中给定了高度为1px,其它浏览器显示正常,可是ie6中显示的高度就不对了,这时我给样式表中加了个font-size:0px;line-height:0px;就好了
9).ul在外框里margin-top不起作用的问题
在div大框子里用了ul作导航的时候为了合ul层居中显示,设ul的样式表为margin-top:-15px不起作用了,此时应该将div大框设定高度后给个line-height与height一样的高度,ul层就自动居中了。
例如
10).ff中margin-top有时不起作用的问题
今天头晕脑涨的把这问题给解决了,这几天写标网都有累似问题,可是一直都是换个写法解决的,今天的这个办法也不只可行试试还是可以的,在一个div外框层中给个宽度例如,#div_wrap{width:280px;height:100%;}
其次在这个框子里设一个.div_top{widh:100%;font:bold12px"宋体";height:24px;line-height:24px;}
.div_center{border:1px solid#dbdbdb;border-top:none;background:#fff;min-height:460px!important;height:auto!important;height:460px;overflow:visible;}
最后在这个div_center里套个ul li时经常会在ff中出问题,也就是在div_top与div_center中莫名的多了几个像素的空格,这时给ul样式表设个display:inline-table即可;
11).list-style-image的用法
div中经常用到新闻列表前面有图标的样式,有两种简单的方法
一.可以写成ul.menu{width:100%;} ul.menuli{background:url(em_img/small_icon.jpg) 5px center no-repeat;list-style-position:inside;padding-left:18px;}即可在各浏览器正常显示
二.可以设ul.menu{width:80%;} ul.menuli{list-style-image:url(em_img/small_icon.jpg);}
此时新闻列表前的小图标即可在ie6,ie7,ie8,ff中都正常显示但,ie6需要不断的刷新才能正常显示小图标;
12).
IE6 li:hover兼容问题
<scripttype="text/javascript"><!--//--><![CDATA[//><!--
sfHover=function(){
var sfEls= document.getElementById("nav").getElementsByTagName_r("LI");
for(var i=0; i<sfEls.length; i++){
sfEls[i].onmouseover=function(){
this.className+=" sfhover";
}
sfEls[i].onmouseout=function(){
this.className=this.className.replace(new RegExp(" sfhover\b"),"");
}
}
}
if(window.attachEvent) window.attachEvent("onload", sfHover);
//--><!]>
</script>
13).ie6下支持position:absolute;
最近写一个短信平台的页面用到的底部固定的层,在ff和ie7,ie8下都是好的,可到ie6下就不行了,转了整个地球终于出来了:
background-attachment:fixed;}
#bottomNav{background-color:#096; z-index:999; position:fixed; bottom:0; left:0;width:100%; _position:absolute;
_top: expression_r(documentElement.scrollTop+ documentElement.clientHeight-this.offsetHeight); overflow:visible;}
样式表中调用即可!详细请见“高度自适应屏幕尺寸!”
14).border:none;与border:0;的区别
1.性能差异
【border:0;】把border设为“0”像素虽然在页面上看不见,但按border默认值理解,浏览器依然对border-width/border-color进行了渲染,即已经占用了内存值。
【border:none;】把border设为“none”即没有,浏览器解析“none”时将不作出渲染动作,即不会消耗内存值。
2.兼容性差异
兼容性差异只针对浏览器IE6、IE7与标签button、input而言,在win、win7、vista的XP主题下均会出现此情况。
【border:none;】当border为“none”时似乎对IE6/7无效边框依然存在
【border:0;】当border为“0”时,感觉比“none”更有效,所有浏览器都一致把边框隐藏
1.对比border:0;与border:none;之间的区别在于有渲染和没渲染,感觉他们和display:none;与visibility:hidden;的关系类似,而对于border属性的渲染性能对比暂时没找测试的方法,虽然认为他们存在渲染性能上的差异但也只能说是理论上。
2.如何让border:none;实现全兼容?只需要在同一选择符上添加背景属性即可
对于border:0;与border:none;个人更向于使用,border:none;,因为border:none;毕竟在性能消耗没有争议,而且兼容性可用背景属性解决不足以成为障碍。
15).ie下。png的图片不会有灰色背景出现
注:首推PNG8,即使在IE6中它的透明背景也能被正确显示。PNG8使用的技巧是,输出时把“杂边”设置为和背景接近的颜色
1.几经周折终于把ie6下.png有色图问题解决了,原来IE6.0原本支持png8的索引色透明度,但不支持png或8位以上的alpha透明度,在IE6.0下,非PNG8格式的透明图片部分,会显示为淡淡的灰绿色。在网页中头部加个代码<!--[if IE 6]>
<script type="text/javascript" src=""></script>
<script src="js/DD_belatedPNG.js"></script>
<script>
DD_belatedPNG.fix('.png_bg');
</script>
<![endif]-->即可!
END,本文到此结束,如果可以帮助到大家,还望关注本站哦!