|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
你正在学习CSS布局吗?是不是还不能完全掌握纯CSS布局?通常有两种情况阻碍你的学习:
/ W1 G- D( K6 @ z7 i1 a& }7 I. b/ g/ p. e& ^
第一种可能是你还没有理解CSS处理页面的原理。在你考虑你的页面整体表现效果前,你应当先考虑内容的语义和结构,然后再针对语义、结构添加CSS。这篇文章将告诉你应该怎样把HTML结构化。 : @. n" C3 W/ b3 B4 d
9 C0 c7 N5 S; G
另一种原因是你对那些非常熟悉的表现层属性(例如:cellpadding,、hspace、align="left"等等)束手无策,不知道该转换成对 应的什么CSS语句。 0 s: P$ e2 F1 L$ u
( Z( @8 B4 f- ` O& i6 e
当你解决了第一种问题,知道了如何结构化你的HTML,我再给出一个列表,详细列出原来的表现属性用什么CSS来代替。
# m# P3 m2 U* P- p6 U3 {6 f* ]$ T* A O. f$ e8 K
结构化HTML
; |% f+ f! H2 X s [8 S) u2 S- }7 z4 v
我们在刚学习网页制作时,总是先考虑怎么设计,考虑那些图片、字体、颜色、以及布局方案。然后我们用Photoshop或者Fireworks画出来、切割成小图。最后再通过编辑HTML将所有设计还原表现在页面上。
7 ~$ B4 g$ w' J( L- @2 N1 W! [/ m) h/ g7 f
如果你希望你的HTML页面用CSS布局(是CSS-friendly的),你需要回头重来,先不考虑“外观”,要先思考你的页面内容的语义和结构。 ~: w0 A9 d+ Q. r" b- g: E
4 t( z% J. M4 o' f0 o& h 外观并不是最重要的。一个结构良好的HTML页面可以以任何外观表现出来,CSS Zen Garden是一个典型的例子。CSS Zen Garden帮助我们最终认识到CSS的强大力量。 ( \- r& M8 ^2 T8 O1 u% B4 n+ |5 d
! C. \7 f4 x P' n0 b HTML不仅仅只在电脑屏幕上阅读。你用photoshop精心设计的画面可能不能显示在PDA、移动电话和屏幕阅读机上。但是一个结构良好的HTML页面可以通过CSS的不同定义,显示在任何地方,任何网络设备上。 $ V( Q |. O; F0 O
6 z9 L, g, r" n* l, V+ R9 m
开始思考 ) ~6 H; L; \* R. C) N, h* ~ a! ? o
, d0 R$ ?- D0 V4 q0 W
( f" I2 F0 S8 k Q' m1 [+ K
" v7 j# N0 i, M& [7 `9 W 首先要学习什么是"结构",一些作家也称之为"语义"。这个术语的意思是你需要分析你的内容块,以及每块内容服务的目的,然后再根据这些内容目的建立起相应的HTML结构。 # N, U R% g4 }
0 p3 u' W4 W. E
如果你坐下来仔细分析和规划你的页面结构,你可能得到类似这样的几块:
7 X8 b9 v0 I! w$ ]0 e$ |9 W5 v
4 m& Q$ O. w- h: d 标志和站点名称
' X5 W" D. H& v# F9 Z 主页面内容 ( {; P. P. \4 e* o/ E
站点导航(主菜单)
0 ?3 A% X1 ]' i 子菜单 * o( z% G3 u! t* \# d
搜索框 * A. I" W6 S; C S
功能区(例如购物车、收银台) ! Y2 T: O/ _' z8 U. s
页脚(版权和有关法律声明)
9 n( A1 @+ z! Q# f( r- ~# o( n& K5 `! m/ u. Y+ A5 q7 q
! S. L4 }3 q- {; m6 @+ k 我们通常采用DIV元素来将这些结构定义出来,类似这样:
. m& x2 {6 l3 g3 u1 s, X- X- R& Z% Y7 g8 W
<div id="header"></div>
! b9 Z0 s! t3 H0 u2 S- k
3 B, Q2 t, I) {: a( P <div id="content"></div> : h" Y# y; {6 h
3 u+ s) H! ?/ I0 m* ~
<div id="globalnav"></div> . _4 D/ {& X. N |
, J& J+ h, Y& G0 [- x
<div id="subnav"></div>
! D( o) c2 ?# B' S0 L) d s/ R
; Q" [ R. X5 T% Z# Y <div id="search"></div>
! W4 n3 y+ N9 V( n1 M% u; G4 F" W3 F" D( N) N( y
<div id="shop"></div> - P+ x7 F5 I+ p9 f: P
# \% i& t$ S1 K8 b' e <div id="footer"></div>
& V; ?' n! b; o: U
8 y" x+ t- S' m! I# Q 这不是布局,是结构。这是一个对内容块的语义说明。当你理解了你的结构,就可以加对应的ID在DIV上。DIV容器中可以包含任何内容块,也可以嵌套另一个DIV。内容块可以包含任意的HTML元素---标题、段落、图片、表格、列表等等。
) X1 L+ S+ r8 R
; ]' C& a' M0 j3 S 根据上面讲述的,你已经知道如何结构化HTML,现在你可以进行布局和样式定义了。每一个内容块都可以放在页面上任何地方,再指定这个块的颜色、字体、边框、背景以及对齐属性等等。 , m) }% ~( `* ^/ z' i9 P+ y) o
7 ?9 ?; I: _3 z( N; G 使用选择器是件美妙的事
- w/ z) |% z. T0 Jid的名称是控制某一内容块的手段,通过给这个内容块套上DIV并加上唯一的id,你就可以用CSS选择器来精确定义每一个页面元素的外观表现,包括标 题、列表、图片、链接或者段落等等。例如你为#header写一个CSS规则,就可以完全不同于#content里的图片规则。 ) n) j$ }" [ D: n
, T9 K- f$ g) A# o
另外一个例子是:你可以通过不同规则来定义不同内容块里的链接样式。类似这样:#globalnav a:link或者 #subnav a:link或者#content a:link。你也可以定义不同内容块中相同元素的样式不一样。例如,通过#content p和#footer p分别定义#content和#footer中p的样式。从结构上讲,你的页面是由图片、链接、列表、段落等组成的,这些元素本身并不会对显示在什么网络 设备中(PDA还是手机或者网络电视)有影响,它们可以被定义为任何的表现外观。
9 W2 `8 P( J6 t
9 [: q8 U6 G2 Q4 a7 N, _ 一个仔细结构化的HTML页面非常简单,每一个元素都被用于结构目的。当你想缩进一个段落,不需要使用blockquote标签,只要使用p标签,并对p 加一个CSS的margin规则就可以实现缩进目的。p是结构化标签,margin是表现属性,前者属于HTML,后者属于CSS。(这就是结构于表现的 相分离.)
6 _0 G0 z5 o5 a* `8 K2 J% O& P 良好结构的HTML页面内几乎没有表现属性的标签。代码非常干净简洁。例如,原先的代码<table width="80%" cellpadding="3" border="2" align="left">,现在可以只在HTML中写<table>,所有控制表现的东西都写到CSS中去,在结构化的HTML中, table就是表格,而不是其他什么(比如被用来布局和定位)。 1 B, |& R# m: Z( V& |
" K- ]$ {4 q- Z% o
亲自实践一下结构化 ' M6 {3 W: B6 q/ E2 h# R
. I* b) I; b/ W5 O, e$ c
上面说的只是最基本的结构,实际应用中,你可以根据需要来调整内容块。常常会出现DIV嵌套的情况,你会看到"container"层中又有其它层,结构类似这样:
# ~4 P* a1 E& U! d( n: P6 }7 w/ A" ?& ]" @% c/ ^& c
<div id="navcontainer"> 5 n6 M. S# m+ ~+ T0 z: Q# e( i# d4 e& q" Y
2 @- m/ Z, R/ D, f( X+ \
<div id="globalnav">
, d4 z( [% z+ Y p$ C1 U1 O1 z( t, z# g. T, q
<ul>a list</ul>
8 W8 l/ _( H7 h! Y' q+ S+ @+ L3 [: s2 _
7 D, p( f! G. x: `; b </div> 2 P" C. G0 o( w
0 o% J3 w- Z9 p! v <div id="subnav">
* w9 S" d7 U. @' J$ c7 c0 _, e8 v3 b% R8 u& j: A2 J
<ul>another list</ul>
( O9 \4 E1 v1 f0 E$ E* W2 b+ w/ @0 F$ S' L1 z
</div>
- i7 @$ o8 v; R! k3 V" _/ l: T
</div>
+ i" f- V8 ^" i/ q0 K$ h+ B6 l
嵌套的div元素允许你定义更多的CSS规则来控制表现,例如:你可以给#navcontainer一个规则让列表居右,再给#globalnav一个规则让列表居左,而给#subnav的list另一个完全不同的表现。 5 z2 e& L3 \- j6 V. I
! P/ ?' Q- i$ O3 a9 {8 m) H: `9 ^6 U# u' \
用CSS替换传统方法 - G; J) _; F& L2 [! ]
下面的列表将帮助你用CSS替换传统方法:
4 A ~' }5 x5 I \# Y3 @
1 f! Q, |5 N3 N6 d- y7 M HTML属性以及相对应的CSS方法 / g7 e& v9 [3 y* j- B& Y
HTML属性 ) X' R7 T; C1 L! Y' S
; ^( ^7 p; w( g9 n! ]9 x3 }
, h; e8 G1 P4 s
CSS方法说明 ( g) S) b, |- g6 x! W' f
align="left"
# B, Z' |6 S- e! u: l# b
+ g, G0 M" R4 d align="right" float: left;
5 k7 I+ t- x5 V8 {6 _2 Z4 ` @% q- _" l u, g
float: right; 使用CSS可以浮动 任何元素:图片、段落、div、标题、表格、列表等等 # q2 ^2 i# c$ _, Q8 x6 G3 |
! I4 h3 }! b' R& x6 ~" Y9 d
当你使用float属性,必须给这个浮动元素定义一个宽度。
) {& x/ s6 J1 A+ y2 I3 c/ Z/ A& h9 p6 T) X. Q5 _, h
marginwidth="0" leftmargin="0" marginheight="0" topmargin="0" margin: 0; 使用CSS, margin可以设置在任何元素上, 不仅仅是body元素.更重要的,你可以分别指定元素的top, right, bottom和left的margin值。 + N8 {7 g K$ o; J2 b
# S' O* p0 Y# f8 `( |- X9 z
vlink="#333399" alink="#000000" link="#3333FF" a:link #3ff; * m, _8 ~. s" [) ?, {4 I0 X1 \
% E6 T& S/ M$ ^! Y2 y a:visited: #339;
P% S; [' r( c( C' E# O* |. g9 i
a:hover: #999;
* A$ I& d/ `1 b% H3 C& d( n5 p0 L' q0 D: X
a:active: #00f;
! x% `2 i8 }8 s9 A1 ^ 在HTML中,链接的颜色作为body的一个属性值定义。整个页面的链接风格都一样。使用CSS的选择器,页面不同部分的链接样式可以不一样。 7 m x' K/ M% V c8 a( L6 r
, f0 x6 S8 Y- a$ ^$ U
bgcolor="#FFFFFF" background-color: #fff; 在CSS中,任何元素都可以定义背景颜色,不仅仅局限于body和table元素。
5 L2 x: x% N! A" g8 C5 k- M* V( @3 p- ?" Y# |2 c. A
bordercolor="#FFFFFF" border-color: #fff; 任何元素都可以设置边框(boeder),你可以分别定义top, right, bottom和left
& a3 S$ `5 D- u: x' H; }" M9 @, D* X8 l$ V: T9 i8 p# Z
border="3" cellspacing="3" border-width: 3px; 用CSS,你可以定义table的边框为统一样式,也可以分别定义top, right, bottom and left边框的颜色、尺寸和样式。 ; R8 `. q- u( i- O
. e; H( D3 y \) i 你可以使用 table, td or th 这些选择器. " A" P' |7 O' c/ j4 b0 H7 G0 n
( U/ ? ?8 |" b: }! a$ H1 `
如果你需要设置无边框效果,可以使用CSS定义: border-collapse: collapse;
5 T6 `5 l0 z- C' y$ z* m) W6 C+ O1 @* J7 o; s
<br clear="left">
% i" k1 c, l) k* N; N 7 O. ^) h" ]! H- t
<br clear="right"> , y$ R) p5 C/ o' M4 x
; T; Y7 _8 S- n4 b
<br clear="all">
7 e9 o* @$ Z) I' H) p. m. e1 b3 V2 s
clear: left;
! `3 |6 S' O- Y8 N( k1 l( ]& W& Y: Q. a" k. N' h/ Y& [; a
clear: right; # ?4 J7 ~ `7 a) f5 H3 J9 p
: s' x4 y2 f$ J! ]) z2 ] c' F
clear: both;
% a( n( R Q9 j2 K 许多2列或者3列布局都使用 float属性来定位。如果你在浮动层中定义了背景颜色或者背景图片,你可以使用clear属性. 6 V: `' q. f0 c2 B6 \& w/ G1 p
8 U( u; `6 F' F2 v5 `' L3 ?3 ]
cellpadding="3" 6 k- w9 W7 v/ j- [* |* k
" d* J2 R: z- [6 R# `; W" w# n( b
vspace="3"
1 h; i% z' I/ b+ X8 T
* M9 P7 b0 b- i" h# [ hspace="3" padding: 3px; 用CSS,任何元素都可以设定padding属性,同样,padding可以分别设置top, right, bottom and left。padding是透明的。 * p, h( ^6 e" F( B% h
* P; `# s4 U# g9 W" z- c align="center" text-align: center;
# y% \2 R r" C( I4 p1 K' |9 \" }# ^2 q/ P5 f9 W
margin-right: auto; margin-left: auto;
, `& F; Q( P3 w* x) _% _ Text-align 只适用于文本. , f9 Q) F9 k" w* G
. n$ U3 r5 b& \) r/ O. G 象div,p这样的块级可以通过margin-right: auto; 和margin-left: auto;来水平居中
' q% q3 ]9 o7 q7 B7 L5 v" R7 G- ?& J0 n4 W) [3 x' [
一些令人遗憾的技巧和工作环境
J+ ~2 @3 q/ i/ K
" T) d. k2 h: F" o" G1 r0 [+ S2 X+ o8 d/ K! b; D1 `/ `
由于浏览器对CSS支持的不完善,我们有时候不得不采取一些技巧(hacks)或建立一种环境(Workarounds)来让CSS实现传统方法同样的效 果。例如块级元素有时侯需要使用水平居中的技巧,盒模型bug的技巧等等。所有这些技巧都在Molly Holzschlag的文章《Integrated Web Design: Strategies for Long-Term CSS Hack Management》中有详细说明。
- ~! p3 o3 G+ ?3 ~ 另外一个关于CSS技巧的资源站点是Big John和Holly Bergevin的“Position is Everything”。
1 I9 \7 b; d* i! F4 _& f6 I. u& h6 I& V! T3 V, O8 T+ I- |' A6 A+ h3 w
理解浮动行为 . a3 G* _ J* e9 n
8 A6 N6 p7 [; v5 d4 X' M# A* D Eric Meyer的《Containing Floats》将帮助你掌握如何使用float属性布局。float元素有时候需要清除(clear),阅读《How To Clear Floats Without Structural Markup》将非常有帮助。
* O% G1 p7 m W) v. V4 {. ]$ ]% \; I' N- r& W N1 Q
更多帮助
; T3 C: v, K2 a. I3 d2 Y
i$ {$ y/ ^% G 已有的《CSS Discussion》列表是很好的资源,它收集了一个WiKiA讨论组的信息,其中包括CSS布局总结(css- discuss.incutio.com/?page=CssLayouts),CSS 技巧总结 (css-discuss.incutio.com/?page=CssHack) 以及更多。 |
|