元素指定文本颜色为红色,又在
元素中指定文本颜色为蓝色,两者相互冲突。那么,浏览器在显示
元素中的文本时,到底显示哪种颜色?
所以,CSS的层叠原则主要是解决“如果有多条CSS规则相互冲突,“到底该听谁”的问题”。
浏览器在内部使用一个比较麻烦的算法(因为它需要考虑多种情况)来解决这个问题,有兴趣的朋友可以找相关资料去了解一下。在实际开发中记着一句口诀:近者胜,远者负 ,基本上也就够了,大不了用各种浏览器打开网页看一下就OK了,不必深究其算法细节。
6 盒子模型
这个可是非常地重要,它与网页布局关系太大了。
CSS把每个元素视为一个“Box(盒子) ”,通过排列大大小小的多个“盒子”,完成页面的呈现。上张图(图3):
图 3
关键是记着盒子模型其实是“一个套一个”的多个矩形,知道“Border ”、“Padding ”和“Margin ”三个术语的含义。
CSS规范中定义有很多属性用来设定Box的边框和背景,实现诸如圆角框、渐变背景、背景融合等等功能,任何一本CSS书中都有很多介绍,我就不废话了。
需要指出的是,CSS3中新加的一些属性,并非所有浏览器都实现,因此,往往会在规则中添加特定的前缀,以达到通用性。比如实现圆角框的属性就是CSS3新加的:
div { width:200px; height:100px; background:#e1d8b9; /*上部、下部圆角*/border-radius :15px/15px; -webkit-border-radius :15px/15px;-moz-border-radius :15px/15px;
}
其中的-webkit-(针对Chrome和Safari)和-moz-(针对FireFox)就是厂商前缀,不带前缀的border-radius就是CSS规则所定义的,随着时间的推移,未来将只需要不带前缀的属性名。
7 盒子的浮动与定位方式
这是CSS技术的要点与难点。
设置一个块元素的float为none和clear之外的某个值,这个块元素就浮动起来,自动地飘流到其父元素的边缘。
盒子浮动起来以后,元素的定位变得复杂。这里头有相当多的东西要掌握。
首先是CSS定义了几种元素的定位方式,使用position属性指定以下值之一:
静态(static)定位 :这是默认的属性值,表明盒子中的元素按照标准流方式进行定位,“该在哪就在哪”.
相对(relative)定位 :使用相对定位方式的盒子,会相对于它原本的位置有一个偏移,到达一个新位置。
绝对(absolute)定位 :以它“最近”的一个已经定位的父元素为基准进行定位,如果没有这样的元素,则以浏览器窗口为基准。
固定(fixed)定位 :采用固定定位方式的盒子以浏览器窗口为基准定位
这四种定位方式的区分比较微妙,需要编写示例在浏览器中进行试验才能理解它们的特为特性。
当有多个浮动的盒子,其上下和左右边距如何叠加,如何实现文本绕排图片等等,问题变得更为复杂。
特别需要指出的是,CSS 3中新加了一种灵活的“弹性盒子布局(Flexible box layout) ”,通过box-orient/box-flex/box-align等属性值可以让多个盒子水平或垂直排列,自动按比例调整大小,指定对齐方式,调整盒子显示顺序,盒子分组排列等等,让人印象深刻,太棒了。唯一希望的就是各大浏览器厂商能尽快地实现它,对网页设计师来说,这是一个福音。
8 页面布局方法
现在的网页,大多数采用分栏的设计方案。实现分栏的关键就是盒子的浮动。几乎所有的CSS书都会有一章介绍常见的两栏、三栏、多栏的实现方法,我就不废话了,自己看书。而一些Web网页设计工具,比如DreamWeaver,甚至在创建网页时就允许你确定页面的总体布局(图4):
图4
使用这些工具生成的页面模板,可以大大地减少网页设计工作量,但定制与调整它们仍然需要对CSS盒子模型与元素基本定位方式有相当的把握与了解。
象Dreamweaver这样的工具比较适合网页设计者,对于笔者这种以编程为主的Web开发者而言,还是更喜欢自己用熟的IDE,比如Visual studio 2012,它有一个免费的版本——Visual studio 2012 Express For Web可用,非常棒,强力推荐。
9 过渡与变换
相比前面介绍的内容,过渡(transition)与变换(transform)不属于必须掌握的技能,它主要用于给网页元素添加动画,用得合适,能给你的网页“锦上添花”,用得不合适,会适得其反。
10 界面组件
仅仅使用HTML现有元素和CSS,加上一些JavaScript代码,能够实现一些常见的界面组件,比如下拉菜单,Tab页,折叠面板等等,然而,手动完成这些界面组件对网页设计开发者的要求较高,至少你必须熟练掌握Javascript的编程技巧。
幸运的是,现在己经有不少现成的Web界面组件库可以用,比如jQuery UI,推荐在开发中优先使用它们,实在找不到符合要求的组件时,再自己动手开发。
11 CSS3的其他特性
前面列举的10个方面,是CSS这一技术领域中最重要的部分。除此之外,还有一些小的方面我没有介绍,比如CSS 3中新加的Web font ,能大大地丰富网页上可用的英文显示效果,然而由于汉字字库过于庞大,目前还不太适合在网络上传输。特别是在天朝这种网速慢、网费高的地方,Web Font还不够实用。
其他的CSS 3新特性,就留给大家自己去探索吧,最重要的东西我己经展示给大家了。
到了文章的最后,来关注一下移动Web页面设计的相关内容。
三、移动Web页面设计中的CSS
1 Native App vs Web App
2010年以后,在苹果和诸多Android厂商的强力推动下,智能手机得以迅速普及,越来越多的人使用智能手机上网,从而使得移动互联网成为大众瞩目的焦点。
当前智能手机应用主要分为两大类:本地应用(native App) 和Web应用(Web App) 。
本地应用 主要指使用特定的编程语言直接基于手机操作系统开发应用,比如用Objective-C开发iOS应用,或者是使用Java开发Android应用。
本地应用能直接调用手机操作系统的所有功能,并且能充分地使用手机硬件(比如摄像头、传感器、话筒等),应用能实现的功能不受限制,并且响应迅速,用户体验好。它的缺点在于对开发者素质要求高,开发周期长,成本高。
Web应用 主要使用手机内置的浏览器(或浏览器组件),直接从网站上提取网页并显示,其特点是具有跨平台特性(因为Android和iOS都有内置浏览器并且对HTML5特性支持较好),同时可以基于现有的网页进行改造,大大地降低开发成本。其缺点在于对网络依赖性强,只能调用手机功能集合中的一个子集,用户体验暂时还比不上Native App。
尽管现在native App还是占优势,但笔者认为Web App还是会渐有起色并最终与native App平起平坐,甚至可能会反客为主占据优势地位,主要原因有以下几点:
手机硬件进步飞快,目前Android手机装备四核CPU的己经很多,内存也越来越大,性能提升明显,这对于Web App来说是件好事。
通讯基础设施的改善是持续的,上网速度必然会持续提升,联通、移动、电信等巨头虽然会努力地想方设法地维持其垄断利润,但上网总体费用下降的大趋势是不会变的,迟早手机会像现在家庭的宽带一样,流量不再是需要考虑的问题。
与PC不一样,用户更换手机频繁,每当用户换一个新手机,或者是手机厂端主动推送手机操作系统的更新,用户都会得到一个新的浏览器,新的浏览器对HTML5的支持会更完善,并且随着手机硬件性能的提升,其运行Web应用的性能也会有相应提升
Native App与Web App有相互融合的趋势,诸如PhoneGap之类的框架,己经使Web App能方便地调用手机的各种硬件功能,也有越来越多的本地应用通过内嵌一个Web浏览器组件,使用 Web App来完成部分功能。
不管怎么说,Web App总是有发展前景的,因此,掌握 Web App开发技术,也成为移动互联时代程序员必须关注的问题。
2 响应式移动Web设计原则
响应式Web设计(RWD,Responsive web design) 是由Ethan Marcotte提出的一种移动Web开发模式,其目的是设计出这样的网页:用户不需要进行手势缩放、拖动就可以很方便地阅读网页内容和在网页间跳转,而且这种网页应该具有“自适应特性 ”,能在所有的移动设备上,不管其屏幕大小、硬件配置差异,都能得到相近的使用体验。
响应式Web设计是当前移动互联应用主流的开发模式。
当前主要通过以下三种手段实现响应式Web设计:
(1)CSS3 media queries
主要通过给CSS规则添加media属性实现。
比如以下这条规则声明:如果当前页面要打印,那么就不显示nav 元素。
@media print { nav { display:none; }
}
再看一条规则:
@media screen and (max-width:568px) { .column {float:none; width:96%; margin:0 auto;}
}
这条规则说明,如果页面是通过屏幕显示,而且该屏幕宽度不超过568 像素,那么CSS 就会取消带.column 类的元素的浮动,让布局区块上下堆叠,且让该元素宽度为屏幕的96%,同时在屏幕上居中。
上述指定了设备屏幕大小的CSS规则,被称为“断点(breakpoint) ”,同一个CSS文件中,可以包容多个断点,从而为不同的移动设备选择合适的CSS样式规则,获得满意的显示效果。
如果要通过媒体查询应用的CSS 规则非常多,那么就可以考虑使用 标签的media 属性设定条件,有选择地加载独立的样式表。 media="print" href="css/print_styles.css" /> media="screen and (max-width:568px)" href="css/iphone_styles.css" /> CSS3的媒体查询功能,可以适用于以下的“媒体类型(Media types)”:
all :匹配所有设备;
handled :匹配手持设备(小屏幕、单色、带宽有限);
print :匹配分页媒体或打印预览模式下的屏幕;
screen :匹配彩色计算机屏幕;
其他媒体类型还有braille(盲文点字触觉反馈设备)、embossed(盲文分页打印机)、projection(投影仪)、speech(语音合成器)、tty(电话机屏幕等固定宽度字符栅格设备)和tv(电视机),目前基本用不上。
CSS3的媒体查询功能, 能检测出移动设备的以下特性:
min-device-width 和max-device-width:匹配设备屏幕的尺寸;
min-width 和max-width:匹配视口的宽度,例如浏览器窗口宽度;
orientation(值为portrait 和landscape):匹配设备是横屏还是竖屏。
可以看到,CSS 媒体查询的关键在于依据移动设备的特点选择合适的CSS规则 ,以达到理想的显示效果。
(2)流式网格布局(Fluid-grid layouts)
当前PC都拥有大屏幕,因此针对PC浏览器设计的网页通常都使用多栏布局,但在手机这种小屏设备时,网页布局必须进行调整,通常采用单栏的设计方案,这可以通过前面介绍的媒体查询功能实现,但同时必须在CSS规则中使用em 或百分比等相对单位设定页面元素宽度,以让其能够随屏幕大小而缩放,这就是流式网格布局 的含义。
我们可使用HTML 的 标签通知手机浏览器不要缩放网页:
这样浏览器将按照移动设备屏幕宽度来显示网页,不需要用户使用手势来缩放查看网页了。当然前提是必须使用CSS媒体查询功能针对移动设备屏幕大小返回合适的网页。
Viewport被译为“视口 ”,你会在很多移动Web页面中看到它的身影。
(3)弹性图片与多媒体(Fluid images and media)
移动Web页面必须保证与元素呈现的内容再大也不会超过其容器的大小,从而让用户无需缩放也能看到完整的内容。
这往往是通过提供不同分辨率的媒体素材实现的,比如给手机提供小图片,而给屏幕较大的平板电脑提供大像素图片。
(4) 用户设备嗅探(User-agent sniff)
手机浏览器在浏览移动Web网页时,会向Web服务器发出HTTP请求,其中包容一个名为“User-Agent ”的HTTP Header,我们可以编写服务端程序解析它,从而知道用户所使用的移动设备的许多信息,从而能有针对性地返回适合于他的移动Web网页,这个技术称为“User-agent sniff” 。
使用任何一种Web服务端技术,比如PHP,ASP.NET,JSP等都可以完成这一工作,事实上己经可以在网上找到现成的代码,比如访问http://detectmobilebrowsers.com/就可以找到这样的代码(图5)。
图 5
3 渐进增强与优雅降级
开发移动Web页面,主要有两种开发模式:
第一种称为“渐进增强(Progressive Enhancement) ”,即先针对小屏手机开始设计,再针对平板,最后针对桌面版浏览器进行设计。
另一种称为“优雅降级(Graceful Degradation) ”,即先针对功能最强的桌面版浏览器设计,然后再通过编写JavaScript检测代码,使用CSS3媒体查询等手段让手机也能正常访问。
当前主流的观点是应该“移动先行”,优先采用“渐进增强”方式 。
四 小结
我在这篇文章给大家绘制了CSS这一技术领域的导航图,可以看到,在移动互联时代,掌握CSS的己经成为对开发者普遍的要求,希望我这张导航图能帮助大家更好地掌握CSS技术,有关移动Web开发,是一个很大的领域,以后有机会时,再给大家绘制一张新的技术导航图。
下一篇文章,将介绍Web客户端编程语言事实上的统治者——JavaScript。