|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
你正在学习CSS布局吗?是不是还不能完全掌握纯CSS布局?通常有两种情况阻碍你的学习:
& h% s, Y* P) K8 I( E
( }+ y5 p- M2 b& ^ 第一种可能是你还没有理解CSS处理页面的原理。在你考虑你的页面整体表现效果前,你应当先考虑内容的语义和结构,然后再针对语义、结构添加CSS。这篇文章将告诉你应该怎样把HTML结构化。 * e8 H+ P" z! L% q3 U% s
^% `, d4 x0 z* m7 w
另一种原因是你对那些非常熟悉的表现层属性(例如:cellpadding,、hspace、align="left"等等)束手无策,不知道该转换成对 应的什么CSS语句。
7 s- i2 ?; w6 M3 a1 Z; w: d; j l: s0 l# m' [+ b& j. ]
当你解决了第一种问题,知道了如何结构化你的HTML,我再给出一个列表,详细列出原来的表现属性用什么CSS来代替。
. t4 C0 k2 x6 G3 I6 M7 }
6 D ^: y4 E1 `0 e- N3 i 结构化HTML 9 G, G% O# o: N% _) _1 h
+ X) u" | ^- }# S R4 z4 Y- P
我们在刚学习网页制作时,总是先考虑怎么设计,考虑那些图片、字体、颜色、以及布局方案。然后我们用Photoshop或者Fireworks画出来、切割成小图。最后再通过编辑HTML将所有设计还原表现在页面上。 , v3 b+ G" h1 {, @$ O- `" I v r! S
" ~. L$ F( m- {) k5 W; z& A
如果你希望你的HTML页面用CSS布局(是CSS-friendly的),你需要回头重来,先不考虑“外观”,要先思考你的页面内容的语义和结构。
7 Q' j" L+ H6 Y7 O( q2 p* E+ N; y: W. ~' f
外观并不是最重要的。一个结构良好的HTML页面可以以任何外观表现出来,CSS Zen Garden是一个典型的例子。CSS Zen Garden帮助我们最终认识到CSS的强大力量。
% y6 s3 Z# N5 @8 x. i' W# A: |1 g
HTML不仅仅只在电脑屏幕上阅读。你用photoshop精心设计的画面可能不能显示在PDA、移动电话和屏幕阅读机上。但是一个结构良好的HTML页面可以通过CSS的不同定义,显示在任何地方,任何网络设备上。 ' A. w7 b/ l" m9 }( d& h" v" q% T
- z; E' ~0 x( @/ z
开始思考
$ E# t. s! L/ ]2 ]' w$ ]" ^% A1 {6 o
; ?+ @* s7 E" @( ?0 f
* A1 R; V& H ]7 p' t
, e, o) E. Q( M 首先要学习什么是"结构",一些作家也称之为"语义"。这个术语的意思是你需要分析你的内容块,以及每块内容服务的目的,然后再根据这些内容目的建立起相应的HTML结构。 1 e8 k, {# s( S2 l
/ R, u" o* i1 Z- Z3 [( y) }0 ^. ?- C! | 如果你坐下来仔细分析和规划你的页面结构,你可能得到类似这样的几块:
% u3 k, ]' z& G
, J U0 B1 v4 G$ z# @ 标志和站点名称 K0 l' p% m3 {: N, h: u6 J
主页面内容
' w- }2 o) V" |2 K4 ?: f 站点导航(主菜单)
, @6 P1 }3 W% F, B0 d" A( M 子菜单
6 W: i) E$ I) n6 S! x1 N2 A 搜索框
4 l' K, n) d& R3 ^2 M- t4 \5 M" B 功能区(例如购物车、收银台) 7 l* y% Y; Q' c* c2 v' ]5 `
页脚(版权和有关法律声明) 9 ?' T( k. O8 @, f _
+ N5 s2 D1 e2 L) Y8 T+ Q
F4 ]1 Q( \ c. a 我们通常采用DIV元素来将这些结构定义出来,类似这样:
: s4 x, }( V) t1 z$ o0 F8 {+ {% @" r# ^/ P q }* ]
<div id="header"></div>
* u. P/ [6 F0 _7 a9 h& Q
* `6 d- E8 T! J <div id="content"></div> # [; ? s ^. ^$ a$ R0 M, a
' v4 }3 P: f( t' |& w4 o <div id="globalnav"></div>
% O4 I/ B) g( [$ p! C) w9 c" k7 H' w! M6 N' e. A
<div id="subnav"></div>
( a5 t* `, j- t @' s7 Y0 C8 N1 n6 q0 _% ^% Y1 j
<div id="search"></div> 9 W! F' J& D$ G }1 x, k. K
) l6 p5 A2 W2 f% u+ ^
<div id="shop"></div>
; H7 m7 ^; l7 e/ p# J' R9 K
# M" k+ T( u2 C7 T* Y& O2 S5 b/ Z5 v <div id="footer"></div> ! H7 v) q2 ?/ r
$ ~4 p" n" e, p; d% g9 _/ d- s7 e0 l
这不是布局,是结构。这是一个对内容块的语义说明。当你理解了你的结构,就可以加对应的ID在DIV上。DIV容器中可以包含任何内容块,也可以嵌套另一个DIV。内容块可以包含任意的HTML元素---标题、段落、图片、表格、列表等等。 : o: \6 C" F0 |
# n7 o4 f8 @: T' E1 J2 p/ M
根据上面讲述的,你已经知道如何结构化HTML,现在你可以进行布局和样式定义了。每一个内容块都可以放在页面上任何地方,再指定这个块的颜色、字体、边框、背景以及对齐属性等等。 & d3 s4 s3 W" J# O
0 Z* @5 L& f8 u0 x% I3 g; \ 使用选择器是件美妙的事 & E/ |) b, m, z8 v& X
id的名称是控制某一内容块的手段,通过给这个内容块套上DIV并加上唯一的id,你就可以用CSS选择器来精确定义每一个页面元素的外观表现,包括标 题、列表、图片、链接或者段落等等。例如你为#header写一个CSS规则,就可以完全不同于#content里的图片规则。
- _" f( o) ~- g
5 k3 x& M+ P h) |; i 另外一个例子是:你可以通过不同规则来定义不同内容块里的链接样式。类似这样:#globalnav a:link或者 #subnav a:link或者#content a:link。你也可以定义不同内容块中相同元素的样式不一样。例如,通过#content p和#footer p分别定义#content和#footer中p的样式。从结构上讲,你的页面是由图片、链接、列表、段落等组成的,这些元素本身并不会对显示在什么网络 设备中(PDA还是手机或者网络电视)有影响,它们可以被定义为任何的表现外观。
4 [" t% ^- A9 [- C. t* \9 Q1 p" B8 i' F' x
一个仔细结构化的HTML页面非常简单,每一个元素都被用于结构目的。当你想缩进一个段落,不需要使用blockquote标签,只要使用p标签,并对p 加一个CSS的margin规则就可以实现缩进目的。p是结构化标签,margin是表现属性,前者属于HTML,后者属于CSS。(这就是结构于表现的 相分离.)- |- _: w9 X7 _
良好结构的HTML页面内几乎没有表现属性的标签。代码非常干净简洁。例如,原先的代码<table width="80%" cellpadding="3" border="2" align="left">,现在可以只在HTML中写<table>,所有控制表现的东西都写到CSS中去,在结构化的HTML中, table就是表格,而不是其他什么(比如被用来布局和定位)。
: y9 q* ]; H$ U" k5 R+ J/ L4 K; o" } ]) k! n {& Y2 M$ [! d
亲自实践一下结构化
8 O& G2 t: V; ]8 t+ w' ]1 K+ Z& v0 x9 \5 V! L" @
上面说的只是最基本的结构,实际应用中,你可以根据需要来调整内容块。常常会出现DIV嵌套的情况,你会看到"container"层中又有其它层,结构类似这样: 0 e2 r$ l) }2 D6 A: R$ |: }- R
, `( J' t. G# S y6 w9 p7 l
<div id="navcontainer">
( R3 G8 a/ a1 Z- c$ C! j7 G
/ Y; z+ x$ I& v. Q* T; ]6 C <div id="globalnav">
/ b8 E& v3 I$ U; v& x2 s$ E, K
9 q$ r, Q5 L% h! Z: w0 z <ul>a list</ul>
# b! {; |; F* j% U8 l6 ?: U5 n
" Q: X q4 V! Y. S! f& I </div>
4 ~# L4 ^2 s$ W1 f
: b, M( N8 _" N6 B9 h <div id="subnav">
. d4 Z. ?/ C% K1 M8 U% i8 }: A/ z2 F6 k- n- T
<ul>another list</ul> 8 ~, |' L& Y* s2 F' p3 D
/ e; l0 l/ v8 O- ^ </div>
% v* B4 v) @* R" W8 \
' C# u. r! s' y0 i </div>
( G9 @9 b* @& K e( q" n) T. U4 `' m
嵌套的div元素允许你定义更多的CSS规则来控制表现,例如:你可以给#navcontainer一个规则让列表居右,再给#globalnav一个规则让列表居左,而给#subnav的list另一个完全不同的表现。 2 p1 b7 `8 N! j" s1 _
! [' K8 Z# @6 u0 m, Q+ \
& z ]; z" X+ E' T5 F 用CSS替换传统方法 - O' X$ f/ v4 g% u- `2 ?: {
下面的列表将帮助你用CSS替换传统方法: ( p) A! W) N/ G' o. R" r3 u! }! r
" L0 Y6 B: _3 m; F HTML属性以及相对应的CSS方法 , n- b7 i3 I2 A" U
HTML属性 7 k/ K' m* m8 ^- B5 g# n$ v
$ M8 { K$ n! L( v# ~& |; ~0 @+ E; N7 R9 H
CSS方法说明 ( h9 {" E: }3 Q$ y/ }
align="left" ) q8 ~6 \' _. j5 D$ V k
H h$ ^- {+ ^
align="right" float: left; r+ O( K" C7 ~
( ]7 x# `# B9 U- v float: right; 使用CSS可以浮动 任何元素:图片、段落、div、标题、表格、列表等等
' S: `4 w$ o8 D9 ~! t, B8 x+ l. i: P+ u- _6 l
当你使用float属性,必须给这个浮动元素定义一个宽度。
1 r. S( K1 Z. n5 v4 C( X# | q
4 P7 _0 _( F K2 \, A" h" B% y marginwidth="0" leftmargin="0" marginheight="0" topmargin="0" margin: 0; 使用CSS, margin可以设置在任何元素上, 不仅仅是body元素.更重要的,你可以分别指定元素的top, right, bottom和left的margin值。 ) h# F) H& d+ I/ x% z' t7 J
+ p' x, P! i- }2 R3 ^
vlink="#333399" alink="#000000" link="#3333FF" a:link #3ff; & Z% g" Q6 X5 R
. A" D. Z, k; v9 s$ |: A E a:visited: #339;
4 _. t0 p6 ]+ s% A! q
; V8 ?. P2 \3 M) \+ i q a:hover: #999; / W3 r+ |( D) o
! s3 C) a, O; h a:active: #00f; - I, g4 Z3 x7 `, V: S
在HTML中,链接的颜色作为body的一个属性值定义。整个页面的链接风格都一样。使用CSS的选择器,页面不同部分的链接样式可以不一样。 : q( Q# k& G" z( d+ u9 B$ Y% z2 W
. d# U/ Y2 s/ l' \$ v$ t
bgcolor="#FFFFFF" background-color: #fff; 在CSS中,任何元素都可以定义背景颜色,不仅仅局限于body和table元素。 3 {( T, a3 T p) F7 ?
1 w. _) F$ a" e! ?8 r4 { bordercolor="#FFFFFF" border-color: #fff; 任何元素都可以设置边框(boeder),你可以分别定义top, right, bottom和left " d, |3 ?2 l1 h
# B- r, i, p2 V8 F5 h border="3" cellspacing="3" border-width: 3px; 用CSS,你可以定义table的边框为统一样式,也可以分别定义top, right, bottom and left边框的颜色、尺寸和样式。 $ t& G5 l* m+ c& J* A2 Y
; Y3 D/ T; s' c5 \6 ]! J+ i
你可以使用 table, td or th 这些选择器. * |6 S w, j% l9 b9 u5 ?9 I+ N
* x9 q" L( N. A& n4 y% ~ 如果你需要设置无边框效果,可以使用CSS定义: border-collapse: collapse; 3 f% {3 U/ ^5 B; ]- P
0 l. E) N+ A. M; z. a A& j
<br clear="left">
5 L9 E' h* b7 @) H: \, O ' E" W6 q" ?& }! w
<br clear="right"> / o x4 b( ~# I4 H' _
) I+ I# D1 b2 w+ J; \ <br clear="all">
: y$ \4 j, {' U4 `9 S e9 o! P: c8 B) F. b; y4 R& ^
clear: left; 1 w% X( G, w, v
8 l$ b9 r1 u4 E, j
clear: right;
4 u. ?3 R* y) y! }8 s5 ~9 y$ l8 K' z7 d. F
clear: both;
9 p# k7 c, q0 T+ V& \+ x2 K 许多2列或者3列布局都使用 float属性来定位。如果你在浮动层中定义了背景颜色或者背景图片,你可以使用clear属性.
# ^* F4 W0 a% I' U- U/ O7 c+ u5 O: q2 U$ I7 n
cellpadding="3" $ _/ i" N! {# w* e
$ ]% }$ w: H" c `9 }& T7 C vspace="3"
/ ?' R* L1 q9 G2 x: U% {& Y' k( i) M
hspace="3" padding: 3px; 用CSS,任何元素都可以设定padding属性,同样,padding可以分别设置top, right, bottom and left。padding是透明的。
; F" y; \+ b& d) v+ B
3 S R6 t. C+ [. l% w; J align="center" text-align: center;
* D' Q4 F# q/ S% e( e8 S( g, q# I5 j: ~8 V5 l2 |2 ]
margin-right: auto; margin-left: auto; 9 e" o+ X9 s% K
Text-align 只适用于文本.
" o+ g4 v' { z
( x/ _$ q9 \. ]' w! u 象div,p这样的块级可以通过margin-right: auto; 和margin-left: auto;来水平居中
# j, o7 k5 l! z( S" w" E8 ~1 k" V0 a5 \3 y4 ?% A
一些令人遗憾的技巧和工作环境
2 |9 y. [& Z& R
( Y7 {$ u/ ?# w# Q: @' m
& f( h: I) X$ k/ F% H由于浏览器对CSS支持的不完善,我们有时候不得不采取一些技巧(hacks)或建立一种环境(Workarounds)来让CSS实现传统方法同样的效 果。例如块级元素有时侯需要使用水平居中的技巧,盒模型bug的技巧等等。所有这些技巧都在Molly Holzschlag的文章《Integrated Web Design: Strategies for Long-Term CSS Hack Management》中有详细说明。
% Z5 U6 u2 j: m2 H3 y 另外一个关于CSS技巧的资源站点是Big John和Holly Bergevin的“Position is Everything”。
1 I5 K/ y4 ?! \. @. K, j2 C
# i, m* w7 F! M P6 O 理解浮动行为 3 Q8 u7 f) r& f2 M
* h* s, c# s C& F0 g8 o, v Eric Meyer的《Containing Floats》将帮助你掌握如何使用float属性布局。float元素有时候需要清除(clear),阅读《How To Clear Floats Without Structural Markup》将非常有帮助。 & @$ k4 f+ ], N
+ r& y M, V% h: W& X' [
更多帮助 / a8 ?( n1 a4 ?- `
+ F& X! _' G) ^( K. K+ V 已有的《CSS Discussion》列表是很好的资源,它收集了一个WiKiA讨论组的信息,其中包括CSS布局总结(css- discuss.incutio.com/?page=CssLayouts),CSS 技巧总结 (css-discuss.incutio.com/?page=CssHack) 以及更多。 |
|