|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14321
- 金币
- 2446
- 威望
- 1647
- 贡献
- 1394
|
你正在学习CSS布局吗?是不是还不能完全掌握纯CSS布局?通常有两种情况阻碍你的学习: / A+ V) u$ i$ ^2 |. q- N8 f- C
3 j. T$ ] q a4 k, [( @3 I: e 第一种可能是你还没有理解CSS处理页面的原理。在你考虑你的页面整体表现效果前,你应当先考虑内容的语义和结构,然后再针对语义、结构添加CSS。这篇文章将告诉你应该怎样把HTML结构化。 ; d! G$ B$ n% e; d7 i
- U9 f, `- A6 E) I9 O 另一种原因是你对那些非常熟悉的表现层属性(例如:cellpadding,、hspace、align="left"等等)束手无策,不知道该转换成对 应的什么CSS语句。 7 O5 {# \1 [* e( ?
5 \ O( [% `" }& P- n& ]' T当你解决了第一种问题,知道了如何结构化你的HTML,我再给出一个列表,详细列出原来的表现属性用什么CSS来代替。
! b" g4 i( c8 @1 f3 L
/ `1 L! S2 F6 e/ D 结构化HTML + Y, e; {, H r& O, Q3 |) L1 V
3 W5 z# W5 r: ^! M+ ^# g5 X9 V
我们在刚学习网页制作时,总是先考虑怎么设计,考虑那些图片、字体、颜色、以及布局方案。然后我们用Photoshop或者Fireworks画出来、切割成小图。最后再通过编辑HTML将所有设计还原表现在页面上。
7 Y+ p8 k* G6 ~/ C8 d3 {' W& B/ o' } o% M, o, F$ D
如果你希望你的HTML页面用CSS布局(是CSS-friendly的),你需要回头重来,先不考虑“外观”,要先思考你的页面内容的语义和结构。 & u" T n) `/ F0 g8 h/ T9 a
; V9 k5 c! H0 V% E' l5 \/ `
外观并不是最重要的。一个结构良好的HTML页面可以以任何外观表现出来,CSS Zen Garden是一个典型的例子。CSS Zen Garden帮助我们最终认识到CSS的强大力量。
5 {$ }, p# J6 p) G/ s0 A; K6 K1 z
HTML不仅仅只在电脑屏幕上阅读。你用photoshop精心设计的画面可能不能显示在PDA、移动电话和屏幕阅读机上。但是一个结构良好的HTML页面可以通过CSS的不同定义,显示在任何地方,任何网络设备上。
! D2 w4 Z8 t' {1 K) j9 A: H
. {7 \* V& Q1 ^3 Z 开始思考
6 A" n, \, f, w- }4 b( E& y8 l
9 \ I. v }- ?" ^) o( R5 [
% S3 I% m; E" ?% Q P2 J0 Y: N' r' p; q/ r* P- K
首先要学习什么是"结构",一些作家也称之为"语义"。这个术语的意思是你需要分析你的内容块,以及每块内容服务的目的,然后再根据这些内容目的建立起相应的HTML结构。
6 A4 L* }- X$ s; A T
/ N4 F6 j) k2 [% M4 h 如果你坐下来仔细分析和规划你的页面结构,你可能得到类似这样的几块: " T# b; P! }) ~1 Y
3 {" V) y) G5 h5 e8 T
标志和站点名称 ; ^" @" J8 }; f2 p
主页面内容 ]% q1 }& R& j* _( h. J: r: e
站点导航(主菜单) 5 h1 j. @4 q y
子菜单 2 Q" l( Q: J" c# o7 [2 W
搜索框 2 H6 G2 H/ Z. |9 K1 \! D7 r
功能区(例如购物车、收银台) ) p! g$ P& B7 `
页脚(版权和有关法律声明)
& U" S% J. A3 \4 @. ?6 U7 U8 e+ m- O$ i
& M( g( ^* K# z- p. _# U
我们通常采用DIV元素来将这些结构定义出来,类似这样:
- G; D0 Y* c0 c. ]: K3 V; q. l t9 m- b6 W. R0 Y: C
<div id="header"></div> # F" t# J' E% Z& M7 ~8 k
& z0 y- k) k' q# ^' i
<div id="content"></div> 0 u) i6 G: S9 S% i- H* E7 w! }
+ z9 d: t/ d" V( u <div id="globalnav"></div> ; W3 C4 N( {* @+ ~+ u: d* t
* i% Y5 t5 }1 ~- Q! o3 E- C8 C
<div id="subnav"></div> 5 \0 Y/ A5 J Z5 e% N' g
1 C7 c n0 t% ~
<div id="search"></div> 2 B+ r) m- P- K
8 H0 m$ T, ~- l* g' s* O
<div id="shop"></div> * {) p% e) {$ H2 z, U) P3 H8 Y I% e
?4 W" Y! V2 B6 W& a6 i" W, H6 B <div id="footer"></div> 4 X7 e4 V- i4 @& B
6 N( b) Z5 k! n9 q& ]3 E5 }1 j6 S
这不是布局,是结构。这是一个对内容块的语义说明。当你理解了你的结构,就可以加对应的ID在DIV上。DIV容器中可以包含任何内容块,也可以嵌套另一个DIV。内容块可以包含任意的HTML元素---标题、段落、图片、表格、列表等等。 6 [! K1 q: d1 e( z5 f4 R" N3 G' N
( f/ d/ D3 q: I0 E( b 根据上面讲述的,你已经知道如何结构化HTML,现在你可以进行布局和样式定义了。每一个内容块都可以放在页面上任何地方,再指定这个块的颜色、字体、边框、背景以及对齐属性等等。 # p/ Z, L! v) S2 A
2 S; x2 q L) b 使用选择器是件美妙的事
0 U" p! Q! r: _/ [$ K9 o, A+ Cid的名称是控制某一内容块的手段,通过给这个内容块套上DIV并加上唯一的id,你就可以用CSS选择器来精确定义每一个页面元素的外观表现,包括标 题、列表、图片、链接或者段落等等。例如你为#header写一个CSS规则,就可以完全不同于#content里的图片规则。 5 g) x1 J$ e8 y2 o; `+ S3 K7 P
# [, L; l E4 p% _' P 另外一个例子是:你可以通过不同规则来定义不同内容块里的链接样式。类似这样:#globalnav a:link或者 #subnav a:link或者#content a:link。你也可以定义不同内容块中相同元素的样式不一样。例如,通过#content p和#footer p分别定义#content和#footer中p的样式。从结构上讲,你的页面是由图片、链接、列表、段落等组成的,这些元素本身并不会对显示在什么网络 设备中(PDA还是手机或者网络电视)有影响,它们可以被定义为任何的表现外观。 2 B! n8 N7 a4 Y% R2 K9 F# a
- [# U) w+ s) ] 一个仔细结构化的HTML页面非常简单,每一个元素都被用于结构目的。当你想缩进一个段落,不需要使用blockquote标签,只要使用p标签,并对p 加一个CSS的margin规则就可以实现缩进目的。p是结构化标签,margin是表现属性,前者属于HTML,后者属于CSS。(这就是结构于表现的 相分离.)
2 n, b3 X/ f$ b( s. N$ K7 [ 良好结构的HTML页面内几乎没有表现属性的标签。代码非常干净简洁。例如,原先的代码<table width="80%" cellpadding="3" border="2" align="left">,现在可以只在HTML中写<table>,所有控制表现的东西都写到CSS中去,在结构化的HTML中, table就是表格,而不是其他什么(比如被用来布局和定位)。
) z+ o) O: A1 r' s
, N* Y5 c$ j7 v+ _亲自实践一下结构化
" a% @0 {7 t s* c, A8 m+ f5 U) d' E' `3 u" ]( R
上面说的只是最基本的结构,实际应用中,你可以根据需要来调整内容块。常常会出现DIV嵌套的情况,你会看到"container"层中又有其它层,结构类似这样: $ I9 p7 ~$ ~9 p$ M) R D7 l
. n6 `: ]$ T" Q1 `* M5 r <div id="navcontainer"> ! m# w$ V$ ]8 G# D
5 q6 v# L" n. M <div id="globalnav">
; k* Y6 k: {/ \" @
, s- n9 B: ^. ~+ J7 z3 V <ul>a list</ul> - J# Z/ q# k- W! }( p# Z. W
0 v- y# x" |0 k" r </div> 9 ~5 D. @+ t$ N
1 } |- F& Z2 v4 s4 m
<div id="subnav">
3 R, p/ t% Z4 z7 c R) j
@2 {) w( F$ N <ul>another list</ul>
) `6 @2 Q# r4 Q" X/ i( `1 l) ?, l( O
</div> 5 ]$ V, H( b) Z' L" n
( i! T+ w# Y1 f </div> 5 h+ Y [) J& Q! z
% c1 `$ M! b! K2 E 嵌套的div元素允许你定义更多的CSS规则来控制表现,例如:你可以给#navcontainer一个规则让列表居右,再给#globalnav一个规则让列表居左,而给#subnav的list另一个完全不同的表现。 6 @- D; K" U; j: X6 G6 g: N
$ ^% b+ n1 f( E6 s
8 d: ~, ?; a+ |/ U6 t% s 用CSS替换传统方法
! F( ]" ^5 Q+ z( y5 W! Y 下面的列表将帮助你用CSS替换传统方法: 8 Q% ^4 f2 [# M5 e7 X) r
4 }# h+ {$ h5 o& Y7 |7 N HTML属性以及相对应的CSS方法
2 S! i$ g% n& n; y" R HTML属性
/ |6 N- Y& s' O2 O# |9 \5 n: U/ L+ u) k; @9 o+ s) W) U- L+ T
& d) |: ]) A$ J
CSS方法说明 , I% M) P5 K6 w5 s
align="left"
. ~4 F# O2 h1 q6 f
4 F( I% S# T9 J- }, p4 Y align="right" float: left;
. y( J8 K2 V$ t4 V% s, e& q7 M& g3 Y
float: right; 使用CSS可以浮动 任何元素:图片、段落、div、标题、表格、列表等等
4 G0 y& {7 `; ~; s' P# u7 Y) d- c( L+ H, n4 d0 N {' D3 d
当你使用float属性,必须给这个浮动元素定义一个宽度。
: x: P1 ]1 K# y
5 B7 H' w0 {1 z# U( h marginwidth="0" leftmargin="0" marginheight="0" topmargin="0" margin: 0; 使用CSS, margin可以设置在任何元素上, 不仅仅是body元素.更重要的,你可以分别指定元素的top, right, bottom和left的margin值。 8 _: k1 \- }2 d6 |1 N7 D! W
F4 r& `1 s; e; w8 ?- ? vlink="#333399" alink="#000000" link="#3333FF" a:link #3ff; ; q) D2 G- f4 X1 `! o5 _0 {1 @
6 C5 V, ^7 t( l; l6 c
a:visited: #339; 3 o. z9 D( W' V- h
6 J2 s9 s: @5 |7 j- h- Z a:hover: #999;
( X$ [7 o. K, i& H8 n1 A$ _5 r& Z: P5 e% g5 w0 ]
a:active: #00f;
# {, M9 g% p' D6 \" y 在HTML中,链接的颜色作为body的一个属性值定义。整个页面的链接风格都一样。使用CSS的选择器,页面不同部分的链接样式可以不一样。
9 K6 S# S+ X% b! Q9 k
$ T- }! C9 a, P5 O. d. r, ~ bgcolor="#FFFFFF" background-color: #fff; 在CSS中,任何元素都可以定义背景颜色,不仅仅局限于body和table元素。 + H* z; r/ l. M
0 t" e7 T+ U+ ]: ]1 Q/ B bordercolor="#FFFFFF" border-color: #fff; 任何元素都可以设置边框(boeder),你可以分别定义top, right, bottom和left . ?, L9 p2 B. I
- m5 F2 E* P2 [ border="3" cellspacing="3" border-width: 3px; 用CSS,你可以定义table的边框为统一样式,也可以分别定义top, right, bottom and left边框的颜色、尺寸和样式。
8 [: N( v( A% a! j T$ a5 o( ]4 r0 O3 f {, ?
你可以使用 table, td or th 这些选择器. 6 B. Q' c/ D$ u- P. k
) z" l3 G( s! i1 Q0 Q
如果你需要设置无边框效果,可以使用CSS定义: border-collapse: collapse; ) P& B: j2 W# t: h
: d( h4 Z/ W; P5 r1 W3 l <br clear="left"> 1 ?8 g9 j. ]( Q ?
8 [+ y1 Z: n5 v3 ?5 n/ G1 K* ]
<br clear="right">
& k- ]" q2 h( O. |; S* O. ?- e( j% Y7 b6 |/ G/ F9 l8 y2 L; F9 r' W
<br clear="all">
8 e9 b5 N: q$ K2 W; }* u1 F! r4 F4 z w. _
clear: left; & I3 V* H V7 N% c) g; C6 I# \6 B
h% N7 @9 |( ?; M clear: right;
6 ~$ N8 B" s! }$ R/ n& r0 F+ R
7 N% T! r2 E8 R6 } clear: both;
0 u( x9 Y$ Q7 R8 ~+ D 许多2列或者3列布局都使用 float属性来定位。如果你在浮动层中定义了背景颜色或者背景图片,你可以使用clear属性.
: z- V8 O8 Z% J2 I# \; K9 W( Q' s; o* N8 Z: e) V+ E
cellpadding="3" 9 f0 h/ G0 Y& j5 Y' N
% H7 w9 E) k) v3 ~. M
vspace="3" 0 ]( z5 |. m' v
6 y/ n) D3 [+ A* P1 J: U
hspace="3" padding: 3px; 用CSS,任何元素都可以设定padding属性,同样,padding可以分别设置top, right, bottom and left。padding是透明的。
- I' o. a* i2 c4 }( g1 X9 w+ _( v+ d. I& P" v
align="center" text-align: center;
: N( g! K, w" M6 R! p& o+ o0 t$ s3 Q( n8 W7 W
margin-right: auto; margin-left: auto;
' r5 V4 \2 y3 }2 ]6 l Text-align 只适用于文本. 5 v* j, H8 u$ B) t: z3 W7 {
! _$ _( U4 E% F; |, L+ L- W# f 象div,p这样的块级可以通过margin-right: auto; 和margin-left: auto;来水平居中 ( D9 A) h3 y' w0 n, L( E
2 {) i4 `* ?; ~6 t8 {2 n
一些令人遗憾的技巧和工作环境 3 g( l! ~; R% t, T
2 i- d( @, j, j3 z% B( k' S' @" V6 U) `- Z; a$ X9 }# @% a
由于浏览器对CSS支持的不完善,我们有时候不得不采取一些技巧(hacks)或建立一种环境(Workarounds)来让CSS实现传统方法同样的效 果。例如块级元素有时侯需要使用水平居中的技巧,盒模型bug的技巧等等。所有这些技巧都在Molly Holzschlag的文章《Integrated Web Design: Strategies for Long-Term CSS Hack Management》中有详细说明。
3 G1 z1 v) V9 ?9 @ 另外一个关于CSS技巧的资源站点是Big John和Holly Bergevin的“Position is Everything”。 9 e" ?6 R$ i+ N- M
. o( w J( F+ C' T7 N) j0 Y 理解浮动行为
5 U0 s5 l, T( }" {! R) l/ k' a9 Q( u# E. A: j2 K9 ?
Eric Meyer的《Containing Floats》将帮助你掌握如何使用float属性布局。float元素有时候需要清除(clear),阅读《How To Clear Floats Without Structural Markup》将非常有帮助。
5 Y: ~' o5 q7 a: {
7 R; i3 A* F. P2 M 更多帮助 / L: y8 ]( Q: J% N$ V& c- R
: @, W5 |1 A# N+ Y) v9 { ^ 已有的《CSS Discussion》列表是很好的资源,它收集了一个WiKiA讨论组的信息,其中包括CSS布局总结(css- discuss.incutio.com/?page=CssLayouts),CSS 技巧总结 (css-discuss.incutio.com/?page=CssHack) 以及更多。 |
|