阅读更多

27顶
3踩

Web前端

转载新闻 编写跨浏览器兼容的 CSS 代码的金科玉律

2010-06-09 10:44 by 见习记者 sogiy 评论(13) 有11728人浏览

作为 Web 设计师,你的网站在各种浏览器中有完全一样的表现是很多人的目标,然而这是一个永远无法真正实现的目标,很多人认为,完美的跨浏览器兼容并不必要,这样说虽然没错,但在很多情形,一种近似的兼容还是很容易实现的,本文讲的是各种跨浏览器兼容的 CSS 编码准则和技巧。

理解 CSS 盒子模型

 如果你想实现不需要很多奇巧淫技的跨浏览器兼容的 CSS 代码,透彻地理解 CSS 盒子模型是首要事情,CSS 盒子模型并不难,且基本支持所有浏览器,除了某些特定条件下的 IE 浏览器。

CSS 盒子模型负责处理以下事情:

  • 一个 blcok (区块)级对象占据多大的空间
  • 该对象的边界,留白
  • 盒子的尺寸
  • 盒子与页面其它元素的相对位置

CSS 盒子模型有以下准则:

  • Block (区块)对象都是矩形 (事实上所有对象都如此)
  • 其尺寸由 width, height, padding, borders, 以及 margins 决定
  • 如果不设置高度,该盒子的高度将自动适应其包含的内容,加上留白等(除非使用了 float)
  • 如果不设置宽度,一个非 float 型盒子水平上将充满其父容器(扣除父容器的留白)

处理 block 级对象时,必须注意以下事项:

  • 如果一个盒子的宽度设置为 100%,它就不能再设置 margins, padding, 和 borders,否则会撑破其父容器
  • 垂直毗邻的 margin 会引起复杂的坍塌问题,导致布局问题(比如两个垂直毗邻的 Block 对象,上面的对象的 bottom-margin 为 40,下面的对象的  top-margin 为 20,则两个对象的间距将是 40,而不是 60 - 译者)
  • 拥有相对位置和绝对位置的对象,拥有不同的行为


 
在 Firefox 的 Firebug 中显示的盒子模型

理解 block  级和 inline 级 对象的区别

这个看似简单的问题事如果能透彻地理解,会受益匪浅

下图讲解了 block 级对象和 inline 级对象的区别:

下面是 block 级对象和 inline 级对象的基本区别:

  • Block 级对象会自然地水平充满其父容器,因此没有必要为之设置 100% 宽度属性
  • Block 级对象的起始摆放位置是其父容器的左上边界,并顺排在其前面的兄弟 Block 对象的下方(除非设置 float 或绝对位置)
  • Inline 级对象会忽略其宽度和高度设置
  • Inline 级对象会随着文字排版,并受排版属性的影响(如 white-space, font-size, letter-spacing)
  • Inline 级对象可以使用 vertical-align 属性控制其垂直对齐,block 级对象不可以
  • Inline 级对象的下方会保留一些自然的空间,以适应字母 g 一类的会向下探出的笔画
  • 一个设置为 float 的 inline 对象将变成 block 对象

理解 Floating 和 Clearing 属性

实现多栏排版的最好方法是使用 float 属性,float 也是一个将使你受益匪浅的属性。一个 float 对象可以居左或居右,一个设置为 float 的对象,将根据设置的方向,左移或右移到其父容器的边界,或其前面的 float 对象的边界,而紧随其后的非 float 对象或内容,则包围在其相反的方向。

以下是使用 float 和 clear 属性的一些重要准则:

  • 一个 float 对象,将从其置身的 block 级非 float 内容流中跳出,换句话说,如果你要将一个 box 向左边 float,它后面的 block 级非  float 对象会显示到下方,inline 级内容会在旁边包围
  • 要让一段内容从一侧包围一个 float  对象,这段内容必须要么是 inline 级的,要么也设置为相同方向的 float
  • 一个 float 对象,如果没有设置宽度,则会自动缩成其包含的内容的宽度,因此最好为 float 对象明确设置宽度
  • 如果一个 block  对象包含 float  子对象,会出现本文中阐述的问题
  • 一个设置了 clear 属性的对象,将不会包围其前面的 float 对象
  • 一个既设置了 clear 又设置了 float 属性的对象,只有 clear:left 属性生效,clear:right 不起作用

首先使用 IE 进行测试

虽然我们都痛恨 IE6 和 IE7,但当你开始一个新项目的时候,最好还是首先针对这两种浏览器进行测试,否则,如果你在设计在后期才想起针对 IE6 和 IE7 进行测试,将出现以下问题:

  • 你将不得不使用一些奇巧淫技,甚至使用独立的 IE6/7 CSS,导致 CSS 文件臃肿。
  • 某些地方的布局将不得不重新设计
  • 会增加测试的时间
  • 你的布局在 IE/6/7 中和其它浏览器中不一样

如果你设计的是个人项目,Web 程序等,则不建议你针对旧版本 IE 做太多工作,而对一些公司类站点,它的用户群中有大量 IE 用户,这些技巧会让你避免大量的头痛。如果将 IE 的问题归类为 IE 的 BUG 而不去处理,会带来很多负面的影响,和 IE 和平共处是 Web 开发与设计者不可逃避的现实。

译者注:在 IE6/7 仍有大量用户基础的国内(感谢中行,建行,农行,工行,以及各级政府网站),忽视这两种浏览器是极不明智的,首先针对 IE6/7 进行设计是一种很好的方法,一般来说,在IE6/7 通过测试的站点,在 Firefox,Chrome,Safari,Opera 等标准浏览器面前基本不会出现问题,前提是,你的 CSS 设计是基于 W3C 标准的。

IE 浏览器最常见的问题

  • IE6 中不可滥用 float,否则会带来内容消失以及文字重复等稀奇古怪的问题
  • IE6 中,float 对象,在 float 方向的那边,会出现双倍 margin,将 display 设置为 inline 会解决这个问题
  • IE6/7 中,一个没有直接或间接设置 hasLayout 的对象,会发生各种稀奇古怪的问题 (译者注:对这类问题,zoom 这个 css 属性可以帮很大的忙,将 zoom 设置为除了 normal 之外的其它值,可以迫使一个对象 hasLayout 同时不影响这个对象的任何视觉外观)
  • IE6 不支持 min-width, max-width, min-height, max-height 一类的属性
  • IE6 不支持固定位置背景图
  • IE6/7 不支持很多 display 属性值(如 inline-tabletable-celltable-row
  • IE6 中,只有 a 这个对象才可以使用 :hover 这个伪类
  • IE 的某些版本对某些 CSS 选择器支持很少(如属性选择器,子对象选择器)
  • IE6~8 对 CSS3 的支持很有限 (不过有一些变通方法)

永远不要指望在所有浏览器中都一模一样

在不同浏览器实现相同的体验个功能是可能的,实现近似像素级的一致外观也是可能的,但永远不要指望一模一样。

Form 控件在不同浏览器显示总是不同

以下是 Facebook 首页中的 select 控件,在5种不同浏览器的显示差异(基于 Adobe’s Browserlab 截图)

某些 Form 控件,如果要求必须跨浏览器一致,可以找到变通办法,如,可以使用图片 替代 submit 按钮,但有一些控件,比如 radio,select, textarea,文件选择框,是永远都不可能一模一样的。

字体的表现都有差异

先不谈有的字体在有的系统中根本不存在,即时存在,它们在不同系统的渲染效果也不完全一样,比如,Windows ClearType 支持 IE7,但不支持 IE6,导致同一个字体在 IE7 和 IE6 有不同的样子。


 A List Apart’s 文章字体在 IE6 and IE7 中的区别

使用 CSS 清零

使用 CSS 清零(CSS Reset)是实现跨浏览器兼容的灵丹妙药,CSS 清零可以消除不同浏览器对 margin,padding 这些属性的默认表现,你可以更容易控制诸如对齐,间隙等等问题。推荐使用 Eric Meyer’s CSS 清零代码


 

 

参考 SitePoint’s CSS 兼容表

SitePoint CSS Reference 是一个非常好的资源(下载离线版),可以用来检查某些 CSS 属性的跨浏览器兼容问题


 
结语

跨浏览器兼容是个永恒的话题,本文介绍的跨浏览器兼容 CSS 准则只是帮助 Web 开发设计者尽可能实现这一目标,除了这些,基于 CSS3 的渐进式增强设计也是一种趋势,Web 开发与设计者可以针对某些浏览器提供增强功能,而在不支持这些增强功能的浏览器中降级使用基本功能。

 

 

原文作者:Louis Lazaris

Louis Lazaris 是一位自由职业 Web 开发者,住在多伦多,他创办了 Impressive Webs, 以及 Interviews by Design,后者主要是一些著名 Web 设计师访谈,他的 Twitter 地址是 http://twitter.com/ImpressiveWebs

 

  • 大小: 62.9 KB
  • 大小: 3.4 KB
  • 大小: 45.2 KB
  • 大小: 54.7 KB
  • 大小: 61.7 KB
  • 大小: 74.9 KB
  • 大小: 97.9 KB
  • 大小: 32.8 KB
27
3
评论 共 13 条 请登录后发表评论
13 楼 东川々靖竹 2010-06-10 19:20
JetMah 写道
非常非常好的资料,很难得啊。赶紧Mark一下~~

JetMah 写道
非常非常好的资料,很难得啊。赶紧Mark一下~~

JetMah 写道
非常非常好的资料,很难得啊。赶紧Mark一下~~

抄袭   过来mark 下
12 楼 iamleo 2010-06-10 16:35
2012 以后 浏览器世界 得以净化  只剩 火狐
11 楼 sogiy 2010-06-10 11:46
whiletrue 写道
javaeye速度慢了,昨天cnbeta的文章

也是昨天发的。
10 楼 whiletrue 2010-06-10 11:28
javaeye速度慢了,昨天cnbeta的文章
9 楼 only_xxp 2010-06-10 11:14
非常强大!
8 楼 leepengyu 2010-06-10 10:33
擦一下原文作者 Louis Lazaris 的头像 , 看着真让人蛋疼啊!
7 楼 we_sky 2010-06-10 10:05
嗯,呵呵,对JS的专研很有帮助,感谢楼主
6 楼 yxl276 2010-06-10 09:43
非常非常好的资料,很难得啊。必须必须Mark一下~~
5 楼 need_faith 2010-06-10 09:31
到处都见溜须拍马,好就好,不用那么偏激。
楼主文章确实好,我会收藏
4 楼 ghyghoo8 2010-06-10 09:21
这么牛X的转载。。。好吧,收藏再转
3 楼 lokinell2006 2010-06-10 09:14
Help me a lot, thanks very much.
2 楼 peanut_sei 2010-06-10 08:58
非常非常好的资料,很难得啊,Mark一下。
1 楼 JetMah 2010-06-09 12:29
非常非常好的资料,很难得啊。赶紧Mark一下~~

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • Java指定保留小数位数的方法

    本篇文章主要介绍了Java指定保留小数位数的方法,很多时候需要规定保留的小数位数,这里整理了详细的代码,有需要的小伙伴可以参考下。

  • 排查Windows内存泄漏问题的详细记录

    RamMap是一款由Microsoft Sysinternals提供的免费工具,用于查看Windows物理内存的分配情况。它能够显示各种内存类型的使用情况,帮助我们理解内存泄漏的表现。

  • Lookaside List 详解

    使用 Lookaside List 分配内存 概述lookaside list 节点结构节点内存块 size初始化节点分配内存释放内存动态调整 lookaside list 节点深度 1. 概述 windows 提供了一种基于 lookaside list 的快速内存分配方案,区别于一般的使用 ExAllocatePoolWithTag() 系列函数的内存分配方式。每次从 loo

  • 一些NDIS函数

    最近在做虚拟网卡驱动, 整理了一些函数NPAGED_LOOKASIDE_LIST: 是一个不透明的链表, 可以从分配确定长度的非分页内存,系统会创建或销毁链表中的内存. 对于确定长度的内存比直接分配内存快。 必须调用 NdisInitializeNPagedLookasideList()初始化一个链表,NdisAllocateFromNPagedLookasideList(): 从链表

  • 主机与端口信息

     主机与端口信息响应请求的服务器名称:localhost响应请求的服务器端口号:8080响应请求的服务器主机名:127.0.0.1响应请求的服务器端地址:8080发出请求的客户端IP地址:127.0.0.1发出请求的客户端主机名:127.0.0.1发出请求的客户端的端口:11052 %@page contentType="text/html;charset=gb2312" language="

  • 一。对象管理第一次初始化(ObInitSystem) + 类型对象的创建(ObCreateObjectType)

    一。对象管理第一次初始化(ObInitSystem) + 类型对象的创建(ObCreateObjectType)

  • python 正确保留多位小数的实例

    今天小编就为大家分享一篇python 正确保留多位小数的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  • cout一位小数_如何“cout”一个double值的正确的小数位数?

    如何“cout”一个double值的正确的小数位数?我需要帮助保持double精度。 如果我将一个文字赋值给double,实际值被截断。int main() { double x = 7.40200133400; std::cout << x << "\n"; }对于上面的...

  • 计算机械效率一般保留几位小数,实验记录、报告要保留几位小数?你是不是一直用错了?...

    实验室如何保留有效数据的位数1报告的有效数字位数报告分析结果有效数字位数,应根据分析方法的精密度即标准差的大小决定。通常可取四分之一个标准差的首数所在数位,定为分析结果的尾数。例如:某一测定结果为25....

  • mathcontext保留2位小数_java 商业中保留有效位数和小数位数

    环境jdk:1.7前言之前,我曾...问题的主要因为是我没有弄清保留有效位和保留小数位是互斥的关系在此之前,我想写出一个通用的方法,就是既能保留有效位,又能保留小数位;/** * 相乘 保留是有效数字,而非有效的小数...

  • win10驱动开发7——分页快查表(LOOKASIDE)

    非分页 分页 ExInitializeNPagedLookasideLIst ExInitializePagedLookasideLIst ExAllocateFromNPagedLookasideList ExAllocateFromPagedLookasideList ExFreeToNPagedLookasideList ExFreeToPagedLookasideList ExDeleteNPagedLookasideList ExDeletePagedLookaside...

  • java int 保留两位小数_java保留两位小数

    java保留两位小数问题:方式一:四舍五入double f = 111231.5585;BigDecimal b = new BigDecimal(f);double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();保留两位小数----------------------------...

  • 下列字符是c语言保留两位小数,c语言中保留两位小数

    c语言中保留两位小数怎么表示输出时?%.2f即可指定输出两位小数再问:那356.f表示什么再答:举个例子:%a.bf(a,b均为整数)是说输出时按浮点数输出,共占a位。其中小数部分b位(若数值本身位数不足,后补0;超过则截断...

  • python输出保留两位小数怎么表示_python格式输出的实现方法保留2个小数位

    虽然我不知道为什么,但是看起来很不舒服,我认为我应该只保留小数点后两位数字找到了一种方法: 将{0}更改为{: .2f}# 一家商场在降价促销。如果购买金额50-100元(包含50元和100元)之间,# 会给10%的折扣,如果购买...

  • python正确保留一位小数的方法

    python正确保留一位小数的方法(可扩展至多位) 方法1:用round函数 a=12.34567889 round(a,1)=12.3 #保留一位小数 round(a,2)=12.35 #保留二位小数 方法2:格式化输入 a=12.34567889 print(“%.1f”%...

  • js保留两位小数方法总结

    一、我们首先从经典的“四舍五入”算法讲起 1、四舍五入的情况 ...第一种,先把小数边整数: ?1 Math.floor(15.7784514000 * 100) / 100 // 输出结果为 15.77 第二种, 当作字符串,使用正则匹配: ?1 Number(...

  • java 乘法保留两位小数_java.math.BigDecimal保留两位小数,保留小数,精确位数

    java保留两位小数问题:方式一(四舍五入形式保留两位小数,注意模式ROUND_HALF_UP):四舍五入double f = 111231.5585;BigDecimal b = new BigDecimal(f);double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP)....

  • python round保留小数位_Python-其他-round()保留小数位时遇到的问题

    于是按照需求,将数据结构由 int 改为 float ,计算时采用round()方法来保留小数位。第一版代码如下:a = 0.1000001b = round(a+0.1,1)c = 0c += round(a,1)复制代码修改完成后进行测试,多次测试过程中发现,b ...

  • oracle百分比留两位小数,oracle保留两位小数

    TO_CHAR(字段名,'999,999,999.99')使用TO_...整数部分的9要写的足够多,否则会错误显示,如下:错误:SELECT TO_CHAR(199999999.1256,'9,999.99') FROM DUAL --显示结果:#########正确:SELECT TO_CHAR(199999999.1...

Global site tag (gtag.js) - Google Analytics