|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
你正在学习CSS布局吗?是不是还不能完全掌握纯CSS布局?通常有两种情况阻碍你的学习:
' i& v. C/ U8 @2 w+ K* M+ e+ p. W) A& V
第一种可能是你还没有理解CSS处理页面的原理。在你考虑你的页面整体表现效果前,你应当先考虑内容的语义和结构,然后再针对语义、结构添加CSS。这篇文章将告诉你应该怎样把HTML结构化。 ; g/ l' o' \* L# Q3 g* U) m; }
2 \% \' {0 H9 o6 O4 b" E6 p 另一种原因是你对那些非常熟悉的表现层属性(例如:cellpadding,、hspace、align="left"等等)束手无策,不知道该转换成对 应的什么CSS语句。 8 w" B+ g1 q! ?, [
0 Z! b7 y5 k7 d5 K; R' M当你解决了第一种问题,知道了如何结构化你的HTML,我再给出一个列表,详细列出原来的表现属性用什么CSS来代替。 7 ]9 f# k( W# [1 [' [! a. c
7 f/ F. b3 ^. P! j: D- Q' v 结构化HTML
$ j3 e) s: d% N* B7 m3 s2 {
' M! V! x, H! A5 ?2 C, F+ ?1 W( | 我们在刚学习网页制作时,总是先考虑怎么设计,考虑那些图片、字体、颜色、以及布局方案。然后我们用Photoshop或者Fireworks画出来、切割成小图。最后再通过编辑HTML将所有设计还原表现在页面上。 0 h# J5 ?* m) U+ @- L- K
9 c9 D5 N' g( H4 A/ G 如果你希望你的HTML页面用CSS布局(是CSS-friendly的),你需要回头重来,先不考虑“外观”,要先思考你的页面内容的语义和结构。 2 n% J: S2 f( W; p2 d9 l2 n
0 y0 M" U. \9 m* R9 V- y
外观并不是最重要的。一个结构良好的HTML页面可以以任何外观表现出来,CSS Zen Garden是一个典型的例子。CSS Zen Garden帮助我们最终认识到CSS的强大力量。 r4 G ` j1 [1 {
0 V7 W# W) V; R; z0 J9 {* ] HTML不仅仅只在电脑屏幕上阅读。你用photoshop精心设计的画面可能不能显示在PDA、移动电话和屏幕阅读机上。但是一个结构良好的HTML页面可以通过CSS的不同定义,显示在任何地方,任何网络设备上。 ! \* S" U1 n/ F) o
9 G Y& f7 X2 T9 h, [& v4 L
开始思考 8 i X" D9 t0 r: k. P0 G# f, }6 ^+ h
7 Y3 M. \" F5 M- h3 z# A! {) R8 E$ Y9 a' E
3 H( J3 w' i; W3 Y
首先要学习什么是"结构",一些作家也称之为"语义"。这个术语的意思是你需要分析你的内容块,以及每块内容服务的目的,然后再根据这些内容目的建立起相应的HTML结构。 % k$ Z; c$ Y" m2 W/ i/ l$ J5 V/ K, Q
; {, H6 o7 c' e, ~
如果你坐下来仔细分析和规划你的页面结构,你可能得到类似这样的几块: 6 A2 }& p! p8 t" R2 D
, g) a$ s( t1 I' x 标志和站点名称 - k5 Z$ E9 {: }
主页面内容
6 a& y0 o8 g& k6 l3 g& \' p 站点导航(主菜单) 5 b# F" C8 O3 d: a
子菜单 * E( y5 u: O, Z. [" {" n8 u. z
搜索框 1 X# b m& b9 E9 h4 ?# P
功能区(例如购物车、收银台)
2 W" `. u- E: I" d 页脚(版权和有关法律声明) + o+ t8 [( ?9 ?+ o
* \/ _! A4 m* y D
* e0 f! ~. J; q# K! X; } 我们通常采用DIV元素来将这些结构定义出来,类似这样: ( S3 |$ n p4 g+ z5 `6 J
& O; H9 Y6 s3 g' }. Q. _ <div id="header"></div> 7 P) K9 N c. w6 r
9 F2 X0 \% V0 H; [
<div id="content"></div>
' N& `0 a7 n$ f/ h% x6 ]7 f Z& K3 ]( O! E. I" c9 R P
<div id="globalnav"></div> # O1 S T ]) U
/ r( W4 y& Z# e4 d/ _' @
<div id="subnav"></div> 2 x3 V0 o7 u6 t; \
6 v* K8 u7 d0 w. ?9 [
<div id="search"></div> 5 p6 T( h* {; W6 c. v
8 u5 c) G4 e7 \3 T4 g N8 c <div id="shop"></div>
6 U0 m4 h1 N2 j* k- W; l! m( S; S6 m" ]( V1 E
<div id="footer"></div>
4 ?. s/ C$ t; w+ q
/ X( V3 I, K4 j" L0 R3 Y Q 这不是布局,是结构。这是一个对内容块的语义说明。当你理解了你的结构,就可以加对应的ID在DIV上。DIV容器中可以包含任何内容块,也可以嵌套另一个DIV。内容块可以包含任意的HTML元素---标题、段落、图片、表格、列表等等。
8 Y2 Z6 z" H4 ] U" T! P3 n$ @, Q, ]8 H2 B: b3 R+ {$ u% c( x7 |! G
根据上面讲述的,你已经知道如何结构化HTML,现在你可以进行布局和样式定义了。每一个内容块都可以放在页面上任何地方,再指定这个块的颜色、字体、边框、背景以及对齐属性等等。 1 `8 s N) U$ _9 Y6 ^5 P- n
1 U+ I0 G0 m# z3 D, L, b, H+ m 使用选择器是件美妙的事 $ ~* W1 {& D* \9 K2 [; c" K
id的名称是控制某一内容块的手段,通过给这个内容块套上DIV并加上唯一的id,你就可以用CSS选择器来精确定义每一个页面元素的外观表现,包括标 题、列表、图片、链接或者段落等等。例如你为#header写一个CSS规则,就可以完全不同于#content里的图片规则。
, [5 y9 \. f6 U5 R7 T8 K6 _2 Z! }1 r4 y
另外一个例子是:你可以通过不同规则来定义不同内容块里的链接样式。类似这样:#globalnav a:link或者 #subnav a:link或者#content a:link。你也可以定义不同内容块中相同元素的样式不一样。例如,通过#content p和#footer p分别定义#content和#footer中p的样式。从结构上讲,你的页面是由图片、链接、列表、段落等组成的,这些元素本身并不会对显示在什么网络 设备中(PDA还是手机或者网络电视)有影响,它们可以被定义为任何的表现外观。
- J u: b+ [& j8 I7 o1 ^
7 v6 W/ x& _3 P 一个仔细结构化的HTML页面非常简单,每一个元素都被用于结构目的。当你想缩进一个段落,不需要使用blockquote标签,只要使用p标签,并对p 加一个CSS的margin规则就可以实现缩进目的。p是结构化标签,margin是表现属性,前者属于HTML,后者属于CSS。(这就是结构于表现的 相分离.)
/ N5 e9 B5 W: w 良好结构的HTML页面内几乎没有表现属性的标签。代码非常干净简洁。例如,原先的代码<table width="80%" cellpadding="3" border="2" align="left">,现在可以只在HTML中写<table>,所有控制表现的东西都写到CSS中去,在结构化的HTML中, table就是表格,而不是其他什么(比如被用来布局和定位)。 U) k( E7 M- X3 O: M; i- d
/ |. f3 w+ X5 g8 L4 O" j
亲自实践一下结构化
. h5 } ]; n& }
0 [0 B* {+ a" u2 Y: G 上面说的只是最基本的结构,实际应用中,你可以根据需要来调整内容块。常常会出现DIV嵌套的情况,你会看到"container"层中又有其它层,结构类似这样:
6 S1 G7 d# t! O2 T, v
8 X( U- f1 X$ z- N <div id="navcontainer"> ; S+ o& R. i) r
1 l# c9 j! [% ]3 r' D0 m3 a
<div id="globalnav"> ! t5 S& P5 o5 K% Y+ E. w: I
* [! J$ ^. i9 I5 k% [4 D4 @% E) M <ul>a list</ul>
, w" h7 {6 s% H* X
: o. d7 H9 T1 ^# L) C </div>
% E7 c, ]3 g2 O0 s
9 ^3 N( x- z( ` <div id="subnav"> 9 d0 b+ t8 Z4 }4 C t" k
/ G, B* I" F2 y
<ul>another list</ul>
( E" N2 p3 @/ z4 l2 H
p5 t9 ] C% K- X4 }7 i& N7 i </div> ) {; r$ X4 N. Q0 L1 L# N! w
; K0 U; |' |2 q. Y: V </div> ' L5 p. [: z( i# @$ W0 A
* W0 I9 H1 C8 |3 s% x 嵌套的div元素允许你定义更多的CSS规则来控制表现,例如:你可以给#navcontainer一个规则让列表居右,再给#globalnav一个规则让列表居左,而给#subnav的list另一个完全不同的表现。
# x/ A8 R' X2 Y! m# L% X8 s# }
h R$ E' z5 t/ o
, V( N" g0 T- B% v9 u. f 用CSS替换传统方法
5 Z" ~$ x; B9 ~/ L 下面的列表将帮助你用CSS替换传统方法: ! v9 R7 [/ |( Q5 N0 `# J+ l1 y
4 ^0 |/ `3 S" d! T4 J HTML属性以及相对应的CSS方法 6 m I+ X" V" J8 `
HTML属性 ' \" r0 [8 p* V5 P: A' E: U
& V; s- O) q9 F8 f
5 [& t& D% o( s, _# |9 ]- I7 `4 u CSS方法说明
! l- d. s# F$ ^* X align="left" , C; {' Q" h" [- Q- G1 Q
8 ?! K+ R6 }. [! S$ Q4 }
align="right" float: left;
" e- |" ^* n4 u9 F2 H# I+ j
6 b1 b0 W' i2 V9 H' T& E6 m float: right; 使用CSS可以浮动 任何元素:图片、段落、div、标题、表格、列表等等 : R# I( N. ^. K4 u
3 ~, X% \4 \ k. M
当你使用float属性,必须给这个浮动元素定义一个宽度。
, e- U2 ^: b1 Z( N$ S8 f
# _( }8 \7 l* S( K9 \ marginwidth="0" leftmargin="0" marginheight="0" topmargin="0" margin: 0; 使用CSS, margin可以设置在任何元素上, 不仅仅是body元素.更重要的,你可以分别指定元素的top, right, bottom和left的margin值。
# F) S, K( ]7 c6 b/ }
7 H3 k: ~% g& n0 m$ U* b9 d vlink="#333399" alink="#000000" link="#3333FF" a:link #3ff;
9 y$ {& b) H& G% z+ G6 M! C8 q& M, y M& `1 g3 D% M. {# R% B
a:visited: #339; ' P* \) _# \8 H
. E3 L3 ^4 W1 `; H
a:hover: #999;
9 ~( A( G3 @& {8 D* G! K& K( t" l; N$ i% Z; D
a:active: #00f; 0 N" O+ J7 P8 X- d. c- B8 Z
在HTML中,链接的颜色作为body的一个属性值定义。整个页面的链接风格都一样。使用CSS的选择器,页面不同部分的链接样式可以不一样。 ; C# t1 h. h. V" q$ ^/ s
, K9 Z: ? O8 \6 u$ Z2 O3 o( \
bgcolor="#FFFFFF" background-color: #fff; 在CSS中,任何元素都可以定义背景颜色,不仅仅局限于body和table元素。 * F; e. G6 k1 t' t3 e/ \
, H2 K" L2 `6 g bordercolor="#FFFFFF" border-color: #fff; 任何元素都可以设置边框(boeder),你可以分别定义top, right, bottom和left ) S8 H- A4 e4 L; k7 U
. K# }% B) \1 o; T( ~ border="3" cellspacing="3" border-width: 3px; 用CSS,你可以定义table的边框为统一样式,也可以分别定义top, right, bottom and left边框的颜色、尺寸和样式。
! P- X, i5 R0 C9 P6 O& h' _* a x# T* c6 y6 l
你可以使用 table, td or th 这些选择器. 3 m. y& X" T# o3 r
6 @1 x- `- j+ ^
如果你需要设置无边框效果,可以使用CSS定义: border-collapse: collapse; 9 b: @2 Q) r+ I; [
X( n' R7 Z9 t7 u$ A3 ]1 t
<br clear="left"> 1 E% c0 j6 P9 u9 p: e2 }4 ]6 T
6 [ M0 w' ^9 y( ] <br clear="right"> 4 P- v. N' \* S5 a2 B( Y
4 {1 D, y! _' t! x <br clear="all">
8 ?5 a- M$ h/ e" }) a3 a+ p( D# v* n" G! N" \) h
clear: left; " W8 q) f# e" f( G2 U% s
, F# J, @! G5 o( _ clear: right;
* Z+ M/ a3 U) l6 Y4 Y9 K
) ]) D0 p c. c4 O T1 f clear: both;
1 @+ e, E' o/ e( ]4 \ l( [* O 许多2列或者3列布局都使用 float属性来定位。如果你在浮动层中定义了背景颜色或者背景图片,你可以使用clear属性.
/ R, c. y4 z5 B' a2 h6 r6 v ^: a* F" V; u
cellpadding="3"
0 M4 e' ~ V: R& V! c
7 ?: g( g, F5 ^8 m! X; i* { vspace="3"
# {0 M$ ]$ _8 f5 r
; n! G; L+ }7 c9 j$ `+ k t/ O$ D hspace="3" padding: 3px; 用CSS,任何元素都可以设定padding属性,同样,padding可以分别设置top, right, bottom and left。padding是透明的。 9 m( Z1 b# `: z, `
/ c' C8 ~+ ?; f7 { align="center" text-align: center; 1 ?* A4 n8 a' l; j5 d2 G4 f
' q! y% K/ U' X8 L! |3 d6 S# j margin-right: auto; margin-left: auto;
; K$ H) c6 D7 ]+ A% w% {0 j# t Text-align 只适用于文本. $ B. U) }, }/ A p4 P! r$ i
1 ~" o+ S# m \ 象div,p这样的块级可以通过margin-right: auto; 和margin-left: auto;来水平居中
! R8 y: b4 F/ S6 W+ Y! k1 g/ J* q3 `1 J$ d+ Q/ a* c3 K: ?
一些令人遗憾的技巧和工作环境 ; R% a3 P6 r# M
) i Y1 Z5 O O Z2 _% }! r. I/ Z) I( f' |: E8 Y0 s9 c6 X( w
由于浏览器对CSS支持的不完善,我们有时候不得不采取一些技巧(hacks)或建立一种环境(Workarounds)来让CSS实现传统方法同样的效 果。例如块级元素有时侯需要使用水平居中的技巧,盒模型bug的技巧等等。所有这些技巧都在Molly Holzschlag的文章《Integrated Web Design: Strategies for Long-Term CSS Hack Management》中有详细说明。, ~: m& N: ^$ E3 F. u) d
另外一个关于CSS技巧的资源站点是Big John和Holly Bergevin的“Position is Everything”。
' p8 A/ \% e7 `! ]; m, w& b, b$ e8 i' L0 G5 y, K
理解浮动行为 0 j: W, b/ |, \0 ~( c$ V2 C( o, c5 X8 }0 C
& J; q5 v9 v5 t* P. `7 w' G Eric Meyer的《Containing Floats》将帮助你掌握如何使用float属性布局。float元素有时候需要清除(clear),阅读《How To Clear Floats Without Structural Markup》将非常有帮助。 " i5 F2 d. `4 i7 n
1 ] H7 c2 f1 _/ v- `5 x1 d 更多帮助
+ O# i& B0 W4 U/ u+ c/ L
2 S7 [9 h& A! ?' r 已有的《CSS Discussion》列表是很好的资源,它收集了一个WiKiA讨论组的信息,其中包括CSS布局总结(css- discuss.incutio.com/?page=CssLayouts),CSS 技巧总结 (css-discuss.incutio.com/?page=CssHack) 以及更多。 |
|