  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14171
- 金币
- 2376
- 威望
- 1647
- 贡献
- 1324
|
你正在学习CSS布局吗?是不是还不能完全掌握纯CSS布局?通常有两种情况阻碍你的学习: / ?8 ~2 T* i w! }
) N/ [) s$ Y' I$ {4 o6 ] 第一种可能是你还没有理解CSS处理页面的原理。在你考虑你的页面整体表现效果前,你应当先考虑内容的语义和结构,然后再针对语义、结构添加CSS。这篇文章将告诉你应该怎样把HTML结构化。 ~7 D7 l5 c; R+ C
' w# T" _ p( F) F/ v* M0 s
另一种原因是你对那些非常熟悉的表现层属性(例如:cellpadding,、hspace、align="left"等等)束手无策,不知道该转换成对 应的什么CSS语句。
' Z! ^, b3 \) s( v- b# e ~8 [: F+ ]" `
5 G% l8 p, x. W" O5 }当你解决了第一种问题,知道了如何结构化你的HTML,我再给出一个列表,详细列出原来的表现属性用什么CSS来代替。
" [# Q6 Y* M/ _! r2 [
' U9 B# Y) h/ C0 f" m9 o* ^) b 结构化HTML ( B+ k1 ?- t& P( z; a( q* g
: ]. J3 |' Z# J, N8 q7 e* | 我们在刚学习网页制作时,总是先考虑怎么设计,考虑那些图片、字体、颜色、以及布局方案。然后我们用Photoshop或者Fireworks画出来、切割成小图。最后再通过编辑HTML将所有设计还原表现在页面上。 + ]: t; M) q3 O8 I
2 I& f. x9 V6 [$ E. K1 ?# r4 v- q+ j/ F
如果你希望你的HTML页面用CSS布局(是CSS-friendly的),你需要回头重来,先不考虑“外观”,要先思考你的页面内容的语义和结构。
. e+ v) W( w% R* B7 C9 _0 Q7 O7 g# L1 w2 V8 m/ s4 T4 T& w4 Q& Y
外观并不是最重要的。一个结构良好的HTML页面可以以任何外观表现出来,CSS Zen Garden是一个典型的例子。CSS Zen Garden帮助我们最终认识到CSS的强大力量。
0 j# g. X. P( N; @/ t! G% [7 x7 U( O- t8 ]( n+ A7 l W) \& c
HTML不仅仅只在电脑屏幕上阅读。你用photoshop精心设计的画面可能不能显示在PDA、移动电话和屏幕阅读机上。但是一个结构良好的HTML页面可以通过CSS的不同定义,显示在任何地方,任何网络设备上。
& X. [+ _ f, d3 w' ?& `1 v; \; G3 k+ P0 b* Y$ C) r
开始思考
, v: y W% M! C2 Z+ G% g$ Q' U% {& A4 r3 T
' J+ h) w2 Q: D: }3 }" C. _* L& `3 Z- V; P* r
首先要学习什么是"结构",一些作家也称之为"语义"。这个术语的意思是你需要分析你的内容块,以及每块内容服务的目的,然后再根据这些内容目的建立起相应的HTML结构。
: S6 \# m# Z0 |% O' ~* P# G+ Y) `0 i
如果你坐下来仔细分析和规划你的页面结构,你可能得到类似这样的几块:
; ^' r, f& M I$ U
; Z. D& H: d: G5 s4 z4 c3 Z% \ 标志和站点名称
5 ?9 [. g& V1 o5 ` 主页面内容
. z% D& K; E3 u! N9 l 站点导航(主菜单) $ @1 ^+ A* |& d" p: B2 U4 s
子菜单 ( s j; N+ O; Y0 L4 B( d7 T
搜索框 ) v( R' ^) @ S+ {
功能区(例如购物车、收银台) 7 g, O T6 D2 }
页脚(版权和有关法律声明)
% g0 Q/ x0 m; d( `4 x9 u8 L0 E0 T9 X2 U+ u e- W
% y+ C$ F* e: D
我们通常采用DIV元素来将这些结构定义出来,类似这样: ( P& F) N* a9 q; V
" F/ r, T+ y' O1 i) u x5 B
<div id="header"></div>
& F G: z6 E2 t! C4 t! w5 o* O* r. B) \9 }( P. ^; n v8 n: N
<div id="content"></div>
6 s; n) y( p1 _4 J- F* ?; V4 Q9 L4 ]
<div id="globalnav"></div> 7 g' I$ L8 J4 Z) V4 U0 p9 y8 M* m
+ g+ j* d; Z" Y% L. V
<div id="subnav"></div> 6 m/ p$ s% p* {: u
1 F) E& E- j6 k! L. B l: d L; T <div id="search"></div>
2 K- w2 U5 j% J6 a( f. _/ t# a! V! R
<div id="shop"></div>
* W4 |: D$ u0 W/ K$ L# b" V& v& I4 i8 e- i. ~' i2 _5 W& _
<div id="footer"></div> 2 d' G+ {! m- {% F* g) P. k' c! B
8 ^+ S" F/ @& y7 |7 H" Q 这不是布局,是结构。这是一个对内容块的语义说明。当你理解了你的结构,就可以加对应的ID在DIV上。DIV容器中可以包含任何内容块,也可以嵌套另一个DIV。内容块可以包含任意的HTML元素---标题、段落、图片、表格、列表等等。
, a1 \7 l, v# V( M3 S0 |& J- S: @0 O9 j* u- X
根据上面讲述的,你已经知道如何结构化HTML,现在你可以进行布局和样式定义了。每一个内容块都可以放在页面上任何地方,再指定这个块的颜色、字体、边框、背景以及对齐属性等等。 # {( X6 u# C2 U
+ W. f! \9 `* `- n& U$ t4 V
使用选择器是件美妙的事
3 `& X5 O( m+ P' P& q! Gid的名称是控制某一内容块的手段,通过给这个内容块套上DIV并加上唯一的id,你就可以用CSS选择器来精确定义每一个页面元素的外观表现,包括标 题、列表、图片、链接或者段落等等。例如你为#header写一个CSS规则,就可以完全不同于#content里的图片规则。
2 |% h8 ?0 n4 R$ Z, d2 {8 q: v* H) }- f
另外一个例子是:你可以通过不同规则来定义不同内容块里的链接样式。类似这样:#globalnav a:link或者 #subnav a:link或者#content a:link。你也可以定义不同内容块中相同元素的样式不一样。例如,通过#content p和#footer p分别定义#content和#footer中p的样式。从结构上讲,你的页面是由图片、链接、列表、段落等组成的,这些元素本身并不会对显示在什么网络 设备中(PDA还是手机或者网络电视)有影响,它们可以被定义为任何的表现外观。 % t" W$ N# m% l" Y" w* H
) r& x. H( s! J 一个仔细结构化的HTML页面非常简单,每一个元素都被用于结构目的。当你想缩进一个段落,不需要使用blockquote标签,只要使用p标签,并对p 加一个CSS的margin规则就可以实现缩进目的。p是结构化标签,margin是表现属性,前者属于HTML,后者属于CSS。(这就是结构于表现的 相分离.)5 ]) i0 ?3 s& _1 S- M& M) h
良好结构的HTML页面内几乎没有表现属性的标签。代码非常干净简洁。例如,原先的代码<table width="80%" cellpadding="3" border="2" align="left">,现在可以只在HTML中写<table>,所有控制表现的东西都写到CSS中去,在结构化的HTML中, table就是表格,而不是其他什么(比如被用来布局和定位)。 % S( u$ @! d$ o+ U1 L: L3 n
# i3 K' f7 O6 O
亲自实践一下结构化 - |+ S. R/ {) q' q2 ?
; H6 E/ m. u9 f& {) Q6 I
上面说的只是最基本的结构,实际应用中,你可以根据需要来调整内容块。常常会出现DIV嵌套的情况,你会看到"container"层中又有其它层,结构类似这样:
o3 M0 u& D) b5 l( t2 l$ b3 p7 { R1 ^
<div id="navcontainer"> ' \# S3 _, w7 }9 h" H5 o4 w
5 {! z+ ]/ e" p: v. G7 \$ n <div id="globalnav"> 4 _ O. ~. S5 Z d
l3 e. h$ w4 M2 m: h7 U
<ul>a list</ul> : ~# _9 K5 y7 ]7 z5 R
1 u( _- \5 H R2 S2 i4 Q
</div>
9 J" r* B* b4 V7 Q# |+ U: l
- ]. M. l1 @$ ?, j; s p <div id="subnav">
/ P7 c5 l+ F, B6 ~! f
9 L$ B' j# {/ d* m6 [ <ul>another list</ul>
/ Q0 k$ p2 F j1 F! h' S- h
( O: X" N8 K# X2 C </div> ' i* E u4 ?) V R
( D% S/ o: J4 g' E: O q4 a# Q$ x3 d </div>
& V# ^3 `" ]! k" ]( G& u4 W- O( X% @6 k
嵌套的div元素允许你定义更多的CSS规则来控制表现,例如:你可以给#navcontainer一个规则让列表居右,再给#globalnav一个规则让列表居左,而给#subnav的list另一个完全不同的表现。
; L' _* X1 h, H8 }3 |. h" c0 h$ b% r e
7 k6 Y* ^6 z* Z& ~+ V
用CSS替换传统方法
2 L! N. l6 H4 d1 }- l# N 下面的列表将帮助你用CSS替换传统方法:
& d% ?8 N- d- e+ ^: `. m& o3 Q
. u& r; p# @2 T, v HTML属性以及相对应的CSS方法
: H, B( _* W( @# @5 M' z8 \+ ? HTML属性
; |7 Y. T1 [0 M# e" Z6 t" B Z) u) x
5 P" i5 Q; i% Z CSS方法说明
# A3 M& d' r- [# O3 Q align="left" 6 Y F9 V' n) N& {$ L0 J
/ S. N* `$ T3 e+ O3 ~: @
align="right" float: left;
4 T% N$ c) u/ S2 U
0 r# v. Q% W, J) T# W3 ? float: right; 使用CSS可以浮动 任何元素:图片、段落、div、标题、表格、列表等等
4 I5 f# D6 L0 S, K9 y- w& ?( t6 x. d+ }: B7 u3 D
当你使用float属性,必须给这个浮动元素定义一个宽度。
9 \ u/ U) B' j. H" ] _; m8 T3 p& K& N g U( r: o. M
marginwidth="0" leftmargin="0" marginheight="0" topmargin="0" margin: 0; 使用CSS, margin可以设置在任何元素上, 不仅仅是body元素.更重要的,你可以分别指定元素的top, right, bottom和left的margin值。
- d- G8 W8 z9 t1 a( D
3 m: R& X% J9 t4 ]! H( e vlink="#333399" alink="#000000" link="#3333FF" a:link #3ff; 9 X3 D" m1 m) V& e7 d9 U
4 `. T- x' c1 h# H% r8 m* t( |' B/ M
a:visited: #339; ; z0 X. _% I' S( C6 m8 q3 e
W0 M, n$ J' I; F& e/ Y5 C a:hover: #999;
) O8 f) q+ ^& x: e
1 d! Q. z1 k! J# G a:active: #00f; 7 b8 D) ^' {1 n* B/ Y) I4 E! e" G9 F& F
在HTML中,链接的颜色作为body的一个属性值定义。整个页面的链接风格都一样。使用CSS的选择器,页面不同部分的链接样式可以不一样。 * M* @- Z7 m( ^8 x4 r7 D9 Z; }" q
! H" `3 Q* F0 z0 |' K/ U. X bgcolor="#FFFFFF" background-color: #fff; 在CSS中,任何元素都可以定义背景颜色,不仅仅局限于body和table元素。
, Q% v7 m- C) E7 b
) N# v/ q1 _* b" z' J& P2 t3 w$ K bordercolor="#FFFFFF" border-color: #fff; 任何元素都可以设置边框(boeder),你可以分别定义top, right, bottom和left
9 j( ?. [& w: S; r* W' W1 ^1 f5 J6 }
border="3" cellspacing="3" border-width: 3px; 用CSS,你可以定义table的边框为统一样式,也可以分别定义top, right, bottom and left边框的颜色、尺寸和样式。
6 X3 p7 F$ h( t! P/ v# R$ H( C' v! { Q0 h
你可以使用 table, td or th 这些选择器.
. W1 c9 C, j. Q! Z4 h
& Z. \' z$ J! A A2 x 如果你需要设置无边框效果,可以使用CSS定义: border-collapse: collapse; 8 O! X( H3 d! Q6 M% b% x5 u! C7 i
! H/ q0 |) Q, h7 o <br clear="left">
! j1 y/ A8 }; p6 j% q g/ O ) d1 D. }: u5 \- H
<br clear="right">
2 Q3 Z& ~1 `8 J3 [* |8 R+ i5 O M8 ~2 M& d
<br clear="all">
/ _0 p+ z3 |2 Q Z+ ?1 S0 |
, r& |; E( \9 t5 Z! d8 ~2 T clear: left;
% ^4 Z4 g( R- y4 G& m4 p
! _, ^, d( F( _9 ^$ m clear: right; 1 g, L0 Z2 {+ j( s: u
! J/ |5 ]8 D5 L. E clear: both; ' y; t# b: M6 _+ ~
许多2列或者3列布局都使用 float属性来定位。如果你在浮动层中定义了背景颜色或者背景图片,你可以使用clear属性.
. N. `% B V& q' @" L4 Z8 e
; }: h; j e" T8 D& f cellpadding="3"
3 m" V# g. A# W" f2 H* O
, t0 y$ B: N2 ~8 p8 B; [* W% B' J vspace="3"
5 \+ s1 M( }3 l& Y& q5 `6 [
# `8 Y5 M6 @& e7 V7 {* A; X1 w hspace="3" padding: 3px; 用CSS,任何元素都可以设定padding属性,同样,padding可以分别设置top, right, bottom and left。padding是透明的。 5 U" U+ P6 ^ |% Z8 _
/ K- Y" r2 B2 \! y( O: U
align="center" text-align: center; + N& |2 J6 Y7 I; Q) z( R' z
( k. X1 h( F) t/ \' a* P margin-right: auto; margin-left: auto; - L6 ]# a" A0 o$ F3 V
Text-align 只适用于文本. - r# Y5 l) m! t5 G
1 I1 c, M! V8 d" N k9 |" m 象div,p这样的块级可以通过margin-right: auto; 和margin-left: auto;来水平居中 ; Q8 ~* W+ e- `. N7 w
4 {# Z4 s* ?6 z8 [4 s, }% F 一些令人遗憾的技巧和工作环境
. o7 Z3 i0 Q* k# Z$ J( z: }0 A3 d
U( ^" ~, x i, o, ^. u. I1 V* V, t. A q
由于浏览器对CSS支持的不完善,我们有时候不得不采取一些技巧(hacks)或建立一种环境(Workarounds)来让CSS实现传统方法同样的效 果。例如块级元素有时侯需要使用水平居中的技巧,盒模型bug的技巧等等。所有这些技巧都在Molly Holzschlag的文章《Integrated Web Design: Strategies for Long-Term CSS Hack Management》中有详细说明。
2 `4 x8 e. u% f8 p 另外一个关于CSS技巧的资源站点是Big John和Holly Bergevin的“Position is Everything”。
2 Q2 }7 v. k; _( p: Z$ H3 E8 l- B9 \3 C2 J
理解浮动行为 8 A, Q) F) R& s$ I
/ k' ]; C1 m% u3 U2 r
Eric Meyer的《Containing Floats》将帮助你掌握如何使用float属性布局。float元素有时候需要清除(clear),阅读《How To Clear Floats Without Structural Markup》将非常有帮助。
# [$ Z: N2 R4 Z K, A/ M# K. Q6 s+ Z
更多帮助 6 I; O0 f0 l0 M
& D! f7 ?! w6 ^7 O: ]
已有的《CSS Discussion》列表是很好的资源,它收集了一个WiKiA讨论组的信息,其中包括CSS布局总结(css- discuss.incutio.com/?page=CssLayouts),CSS 技巧总结 (css-discuss.incutio.com/?page=CssHack) 以及更多。 |
|