  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14171
- 金币
- 2376
- 威望
- 1647
- 贡献
- 1324
|
你正在学习CSS布局吗?是不是还不能完全掌握纯CSS布局?通常有两种情况阻碍你的学习:
3 w/ g! L# {- b
, H6 n" U1 T+ f6 r$ M4 h 第一种可能是你还没有理解CSS处理页面的原理。在你考虑你的页面整体表现效果前,你应当先考虑内容的语义和结构,然后再针对语义、结构添加CSS。这篇文章将告诉你应该怎样把HTML结构化。 / x! Y& P4 q' _. O" c
$ L! \; a1 T5 z8 x# i$ c7 K* Z
另一种原因是你对那些非常熟悉的表现层属性(例如:cellpadding,、hspace、align="left"等等)束手无策,不知道该转换成对 应的什么CSS语句。 9 J; g2 K$ Z3 q- \
6 k2 k! L& v' }+ p6 I
当你解决了第一种问题,知道了如何结构化你的HTML,我再给出一个列表,详细列出原来的表现属性用什么CSS来代替。
6 {+ o/ E) v+ H' Q, e" {4 D/ F
1 @' C( Q7 Y* C2 w/ E0 T 结构化HTML
z% K0 \, M4 {4 L* R$ F( U& R$ a- ]
我们在刚学习网页制作时,总是先考虑怎么设计,考虑那些图片、字体、颜色、以及布局方案。然后我们用Photoshop或者Fireworks画出来、切割成小图。最后再通过编辑HTML将所有设计还原表现在页面上。 9 A& P3 m7 ]) U* i8 G" z
7 c" n% l& B, u1 a# `+ |, r, {: w2 U 如果你希望你的HTML页面用CSS布局(是CSS-friendly的),你需要回头重来,先不考虑“外观”,要先思考你的页面内容的语义和结构。 , R# F0 F/ E6 Z s
9 _# A( J/ E& e5 R 外观并不是最重要的。一个结构良好的HTML页面可以以任何外观表现出来,CSS Zen Garden是一个典型的例子。CSS Zen Garden帮助我们最终认识到CSS的强大力量。 5 B0 h2 m* o1 S
9 t' b1 Y: \& R) ^: v. r HTML不仅仅只在电脑屏幕上阅读。你用photoshop精心设计的画面可能不能显示在PDA、移动电话和屏幕阅读机上。但是一个结构良好的HTML页面可以通过CSS的不同定义,显示在任何地方,任何网络设备上。
0 o$ C( @* k/ z! h/ h: {
" ]" q) w) [ [+ {; L 开始思考 " r; r) G' B. f% D; G0 R0 Q, [* i
9 M% v7 q" V* Y4 V9 j6 s" ?
( a* i: u, h# O/ P7 s! O6 R# V
$ A& n: W) t9 u8 z9 l 首先要学习什么是"结构",一些作家也称之为"语义"。这个术语的意思是你需要分析你的内容块,以及每块内容服务的目的,然后再根据这些内容目的建立起相应的HTML结构。
) Z6 c: @' ^3 X2 u& q
* [& W G) Q4 S! S6 j' u 如果你坐下来仔细分析和规划你的页面结构,你可能得到类似这样的几块:
9 p- w9 _7 Z% u( l; ?
+ v9 \$ r) m8 r- P3 F1 Q 标志和站点名称 8 K3 |8 G: ^9 s" l/ f( k5 \6 o
主页面内容 ! z% K# d O, j2 p) G0 h/ D
站点导航(主菜单) 9 K& ?% S- Y3 |
子菜单 * J) N$ \$ B0 r2 t2 i
搜索框 - |; g7 v6 `, A( D
功能区(例如购物车、收银台) M" v5 g W2 j2 N _# ?! e
页脚(版权和有关法律声明) / M( o, C2 \- e$ Q* n) D0 W' d
4 T6 L- |' i, m: V
; w/ t& w: P+ k: d f
我们通常采用DIV元素来将这些结构定义出来,类似这样: : A6 ^. Z; T# O* ?
: V" y: l% v0 _" s <div id="header"></div> 8 m$ f' N$ |/ R6 R) r5 U
; O( ^7 s0 `2 [% Y <div id="content"></div>
) U- h/ o# ~$ v1 h7 X V
% @* P% w8 S; f, w <div id="globalnav"></div>
`# f% m( F& K7 U# R5 w
3 A v( [* F/ ?2 T; W <div id="subnav"></div> ! o) [) m4 K, U. L8 |( q
$ m% t) ~" Y$ X, r! u- _ <div id="search"></div> $ V+ [* b, c& o# |2 A
7 f9 ^6 V+ K" T, h1 k! P
<div id="shop"></div>
/ W r# j* A4 [4 {4 d( J+ [# u5 W) E+ U
<div id="footer"></div>
# v( y* s3 Z! h8 q, F1 K; Z
; A. i7 M7 ?& m, B" a) E! g" Q 这不是布局,是结构。这是一个对内容块的语义说明。当你理解了你的结构,就可以加对应的ID在DIV上。DIV容器中可以包含任何内容块,也可以嵌套另一个DIV。内容块可以包含任意的HTML元素---标题、段落、图片、表格、列表等等。
9 z/ N4 z: y8 B4 k3 S0 \6 U% @( g. q4 {# D- B
根据上面讲述的,你已经知道如何结构化HTML,现在你可以进行布局和样式定义了。每一个内容块都可以放在页面上任何地方,再指定这个块的颜色、字体、边框、背景以及对齐属性等等。
* o0 i. k* p0 n' L1 l+ Z7 I. A7 G B6 ] ~- `7 f0 h7 P
使用选择器是件美妙的事 ; r4 z- b7 F2 B1 v) \6 Q+ c
id的名称是控制某一内容块的手段,通过给这个内容块套上DIV并加上唯一的id,你就可以用CSS选择器来精确定义每一个页面元素的外观表现,包括标 题、列表、图片、链接或者段落等等。例如你为#header写一个CSS规则,就可以完全不同于#content里的图片规则。
6 K/ t! p9 @6 H q
$ ~/ P, z7 j4 {- H8 c 另外一个例子是:你可以通过不同规则来定义不同内容块里的链接样式。类似这样:#globalnav a:link或者 #subnav a:link或者#content a:link。你也可以定义不同内容块中相同元素的样式不一样。例如,通过#content p和#footer p分别定义#content和#footer中p的样式。从结构上讲,你的页面是由图片、链接、列表、段落等组成的,这些元素本身并不会对显示在什么网络 设备中(PDA还是手机或者网络电视)有影响,它们可以被定义为任何的表现外观。 7 Q, T7 Q) O ^5 L# m. V- E( H
3 v& F1 _2 M4 `: F7 R7 f( b
一个仔细结构化的HTML页面非常简单,每一个元素都被用于结构目的。当你想缩进一个段落,不需要使用blockquote标签,只要使用p标签,并对p 加一个CSS的margin规则就可以实现缩进目的。p是结构化标签,margin是表现属性,前者属于HTML,后者属于CSS。(这就是结构于表现的 相分离.)
4 F- S7 p8 t- {9 p6 C G4 J 良好结构的HTML页面内几乎没有表现属性的标签。代码非常干净简洁。例如,原先的代码<table width="80%" cellpadding="3" border="2" align="left">,现在可以只在HTML中写<table>,所有控制表现的东西都写到CSS中去,在结构化的HTML中, table就是表格,而不是其他什么(比如被用来布局和定位)。 8 ]' q/ p: S$ V3 i. E+ k5 w; b
! z m, S+ J4 V+ |1 }6 H亲自实践一下结构化
( ?# `2 W# p9 g Q4 [
8 f! k3 }' ?- j( ? 上面说的只是最基本的结构,实际应用中,你可以根据需要来调整内容块。常常会出现DIV嵌套的情况,你会看到"container"层中又有其它层,结构类似这样:
6 [+ \8 @$ y5 b o* ]
2 p. V& u: T4 }0 ]5 i7 n <div id="navcontainer">
6 E0 i5 d8 f8 n, v/ s, N+ S! i3 V i! u4 E0 T7 C% m
<div id="globalnav">
+ t: f: A/ }( H, [9 ^0 L7 b# v' l2 x7 ]7 _2 K
<ul>a list</ul> * B2 Z) @0 Y7 B
% z: S h; U8 W& [4 u! u
</div>
! N8 G; F( j# I3 Q! s) W1 q0 T# Q7 E
<div id="subnav"> l8 F0 L3 @/ X' I P
8 R7 ` k( W: `; A8 q: d <ul>another list</ul>
: {, M! I" ~7 G9 X
% x$ i3 C: H% b </div>
( p+ Y) L/ Y* g P* |" `' }
9 T# H0 A( @" b- k9 @ </div>
`$ r0 d" y) L) c
; I+ v8 V) q6 ^; J 嵌套的div元素允许你定义更多的CSS规则来控制表现,例如:你可以给#navcontainer一个规则让列表居右,再给#globalnav一个规则让列表居左,而给#subnav的list另一个完全不同的表现。 5 H9 Q: c: [7 x+ ^$ n0 r
" Y/ k9 o* x6 C. _2 S9 c* ?
' H5 z) ?( A f
用CSS替换传统方法 2 S+ X `2 s) U% V" v
下面的列表将帮助你用CSS替换传统方法: 7 f* d- f" Z$ N. @/ h: f( B3 \
6 N4 f& u4 x! A
HTML属性以及相对应的CSS方法 1 E! A8 O( e5 H/ a1 ~2 R! a1 u0 K. g
HTML属性 0 G+ d& R$ r0 |5 O
3 C0 r: u8 b6 k4 q/ {9 \3 a" [% R% u6 r: S+ O" M0 H
CSS方法说明 5 }- b/ H$ J: X( p) y& J
align="left" 4 e0 `, P9 `5 p4 x* k J. B
* M }4 p6 c! m ^ align="right" float: left; $ ?; e% ?1 j. I4 X- i
. p2 Q9 B! O' o# Y float: right; 使用CSS可以浮动 任何元素:图片、段落、div、标题、表格、列表等等 ( @8 @" q, X/ A# X
+ h% H3 H" i O$ t 当你使用float属性,必须给这个浮动元素定义一个宽度。 $ W: U1 x9 z; G$ u
3 ~/ g3 S7 T7 C" i. Q" ]) A
marginwidth="0" leftmargin="0" marginheight="0" topmargin="0" margin: 0; 使用CSS, margin可以设置在任何元素上, 不仅仅是body元素.更重要的,你可以分别指定元素的top, right, bottom和left的margin值。 : k4 b9 }* J7 F& {
9 G8 M6 d/ l2 o0 ^2 M3 P) f
vlink="#333399" alink="#000000" link="#3333FF" a:link #3ff; # |+ r0 u- d7 ~' `7 s
% h7 F4 p3 ]! b; R, ^3 x
a:visited: #339;
0 p4 m9 R/ T( i4 w9 W( z+ s( O# M- L ~' F, X
a:hover: #999;
2 v% G3 F7 A, q5 t1 E& }: h0 \; b- j' G* h3 G
a:active: #00f;
: r6 g! T5 U: g( v6 U8 A& i5 m8 Z 在HTML中,链接的颜色作为body的一个属性值定义。整个页面的链接风格都一样。使用CSS的选择器,页面不同部分的链接样式可以不一样。 % m, H- y7 c) l+ d' b: R
% {" {2 i9 a7 Q7 D6 \. U! L) } bgcolor="#FFFFFF" background-color: #fff; 在CSS中,任何元素都可以定义背景颜色,不仅仅局限于body和table元素。
, b2 Z/ E8 f9 d/ } J& U5 W9 N; C* p) w8 A& e
bordercolor="#FFFFFF" border-color: #fff; 任何元素都可以设置边框(boeder),你可以分别定义top, right, bottom和left
( i( @# R' x& o; p/ X+ \
5 @+ ?) }/ x. k. ]4 d; S0 {% {# t border="3" cellspacing="3" border-width: 3px; 用CSS,你可以定义table的边框为统一样式,也可以分别定义top, right, bottom and left边框的颜色、尺寸和样式。 * q7 L+ ^: h# R9 o$ H) G. C
8 x# e$ E+ L& F" s& o 你可以使用 table, td or th 这些选择器. . m; D7 j( f5 K7 x4 x- A
4 l$ }! U* H* Z8 _; u0 i 如果你需要设置无边框效果,可以使用CSS定义: border-collapse: collapse; - u7 S+ h- k! o* r- \) u( j
( B; K- h3 R6 t6 m) `- x4 u <br clear="left">
h6 ]7 M) \3 Z
& N* p( C8 \% A; |* R <br clear="right">
0 y1 ~. y! F& H3 `4 D
, E, u) e: \' {) J <br clear="all"> 2 Q! @" S4 @% j& Z0 W3 P
/ ` f! P. W9 _1 a/ r3 d4 k
clear: left; ) P* B$ n0 z) j
, Q6 l# }2 W& d
clear: right; * ]6 J: y; ]8 [- _( Q
5 w& K9 ]( z/ \ clear: both;
* N! z+ N7 H; O i; d6 l2 j+ B 许多2列或者3列布局都使用 float属性来定位。如果你在浮动层中定义了背景颜色或者背景图片,你可以使用clear属性.
3 @/ E }: `& w4 G" |; T! _7 b. z
cellpadding="3"
5 H" X) w$ H0 l+ l [
) Q" B4 [; ] I vspace="3"
6 \8 i8 p+ c- I
( j3 U% }" N& e( _ hspace="3" padding: 3px; 用CSS,任何元素都可以设定padding属性,同样,padding可以分别设置top, right, bottom and left。padding是透明的。
+ q8 }8 \( O; g8 M: Y
' _+ O- T* l4 y& | align="center" text-align: center;
$ ~" P4 X$ \) z* @+ Y$ y! f* c! \
8 [, A/ X) W+ g9 \& m margin-right: auto; margin-left: auto; / y4 X* W) R/ ^2 x) J; c
Text-align 只适用于文本. # N& c# a1 |7 c* N- p; G
" a9 A! y( b" G; ] 象div,p这样的块级可以通过margin-right: auto; 和margin-left: auto;来水平居中 6 f q2 ~1 A6 y. n. Y
8 _$ _3 @ ^7 A1 q
一些令人遗憾的技巧和工作环境 / E. l: r% r+ k1 z% ^: G0 T
- m6 d" Q7 H2 I. A
9 ?+ N2 S( @" n# e6 i6 U- R由于浏览器对CSS支持的不完善,我们有时候不得不采取一些技巧(hacks)或建立一种环境(Workarounds)来让CSS实现传统方法同样的效 果。例如块级元素有时侯需要使用水平居中的技巧,盒模型bug的技巧等等。所有这些技巧都在Molly Holzschlag的文章《Integrated Web Design: Strategies for Long-Term CSS Hack Management》中有详细说明。" D: o+ ~0 [/ ?" H/ o% B8 y! L
另外一个关于CSS技巧的资源站点是Big John和Holly Bergevin的“Position is Everything”。 7 q# E4 ~" q' E
5 E) n- y8 ]$ C: s
理解浮动行为
6 _1 q/ Y3 X0 h3 U1 ]
' Q. g( y6 F# G& `# d Eric Meyer的《Containing Floats》将帮助你掌握如何使用float属性布局。float元素有时候需要清除(clear),阅读《How To Clear Floats Without Structural Markup》将非常有帮助。
- P5 ?9 h7 W0 k+ Z+ z
9 P( s0 x! m2 i! O$ Q. T4 p 更多帮助
: D% \- e( J# G( q
t% M* C5 h- o2 w5 {; P9 f; W, ? 已有的《CSS Discussion》列表是很好的资源,它收集了一个WiKiA讨论组的信息,其中包括CSS布局总结(css- discuss.incutio.com/?page=CssLayouts),CSS 技巧总结 (css-discuss.incutio.com/?page=CssHack) 以及更多。 |
|