|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14389
- 金币
- 2480
- 威望
- 1647
- 贡献
- 1428
|
你正在学习CSS布局吗?是不是还不能完全掌握纯CSS布局?通常有两种情况阻碍你的学习:
0 Q4 ^: Z6 p& H4 V( ^9 X1 ^# V) Y- n! E, w* f
第一种可能是你还没有理解CSS处理页面的原理。在你考虑你的页面整体表现效果前,你应当先考虑内容的语义和结构,然后再针对语义、结构添加CSS。这篇文章将告诉你应该怎样把HTML结构化。
5 y- B7 [3 `+ c8 |7 v P0 ~6 Z/ _5 k9 S5 E# i
另一种原因是你对那些非常熟悉的表现层属性(例如:cellpadding,、hspace、align="left"等等)束手无策,不知道该转换成对 应的什么CSS语句。
, L0 h! I+ i+ ]2 P6 r% A! g) S
l. Y8 h! g6 g' r& x5 |当你解决了第一种问题,知道了如何结构化你的HTML,我再给出一个列表,详细列出原来的表现属性用什么CSS来代替。 % [1 g( C K. C* X" s& Y
. M8 j* f+ P( Q' d; b
结构化HTML
8 ?, ]+ h& T; `" f- _1 ?: |
. v. Y: K1 g8 H* v# U- C 我们在刚学习网页制作时,总是先考虑怎么设计,考虑那些图片、字体、颜色、以及布局方案。然后我们用Photoshop或者Fireworks画出来、切割成小图。最后再通过编辑HTML将所有设计还原表现在页面上。 $ o2 v1 I+ R6 r/ w5 H5 \7 A' {' D
" K8 j4 ]% b" l) X& A3 W* D+ { 如果你希望你的HTML页面用CSS布局(是CSS-friendly的),你需要回头重来,先不考虑“外观”,要先思考你的页面内容的语义和结构。
, k4 B; F) l/ A% p. l" }4 l3 R d; X1 N0 c- }" u; t/ h- N
外观并不是最重要的。一个结构良好的HTML页面可以以任何外观表现出来,CSS Zen Garden是一个典型的例子。CSS Zen Garden帮助我们最终认识到CSS的强大力量。 p" U: N( @3 B6 `3 T+ c
1 m& c! f$ c F! j0 V2 R+ @/ c
HTML不仅仅只在电脑屏幕上阅读。你用photoshop精心设计的画面可能不能显示在PDA、移动电话和屏幕阅读机上。但是一个结构良好的HTML页面可以通过CSS的不同定义,显示在任何地方,任何网络设备上。 4 U0 U$ ~: X/ U2 n, `( W2 {
2 A- b/ R% X$ d% R9 \+ }6 B2 B
开始思考 8 k$ [: O: l, b! e! K
- c8 K; F K! f5 V+ p, T# o; z& i* i) z+ O8 f
~3 }% }' o8 v' q 首先要学习什么是"结构",一些作家也称之为"语义"。这个术语的意思是你需要分析你的内容块,以及每块内容服务的目的,然后再根据这些内容目的建立起相应的HTML结构。 6 r( @+ n5 H0 |# S! `% V" b6 v4 w
8 h8 W8 A) [/ \. D( x) B$ B 如果你坐下来仔细分析和规划你的页面结构,你可能得到类似这样的几块: 2 a8 \( W4 M$ @
$ y3 {$ S9 C; n; q( i
标志和站点名称 ; H$ e$ D0 O* ~; J
主页面内容
6 h/ d* Z9 b" K0 |: n/ _& C 站点导航(主菜单)
% H* h; N/ r( X8 ^& ^1 H 子菜单
( F) v4 F1 y+ a+ o2 a) c/ \3 `0 c 搜索框
( P7 k+ G, X4 z5 o 功能区(例如购物车、收银台) + c# k! V. H% G5 T3 C
页脚(版权和有关法律声明) 1 H, ^7 ^+ A- l( R9 l& c1 r% T
3 d/ ?& H L8 q( ~5 J6 V* u
7 u4 K# ~3 b+ {9 f \+ v W. \7 z, R 我们通常采用DIV元素来将这些结构定义出来,类似这样:
+ Q, V% o6 y3 h
; ~ I* F2 J _6 ~0 | <div id="header"></div>
% X6 R8 ^$ n. H: n9 i
% T O2 j$ q2 A9 k <div id="content"></div> ; X, l+ y1 |* H: S; n* f( @
6 y! P7 l, Z3 I: X2 g <div id="globalnav"></div> % M' } A( ]/ s$ H3 {. ~% R
; A& \ ^: ?, T <div id="subnav"></div> * j: H' w# y# H! n
( l( m8 r& ]" t- C6 w- z1 b2 U <div id="search"></div>
P& z4 r, c" C! q3 v. W/ U: [" X4 R7 f( G0 ?, p, s
<div id="shop"></div> ) s1 u' M8 @) P- Q; O; E( _$ H
2 y; M, c" r$ I* w/ i- k C
<div id="footer"></div>
* T5 }+ q$ o2 T7 E/ G n1 Y g& V( G3 N3 w( \& H
这不是布局,是结构。这是一个对内容块的语义说明。当你理解了你的结构,就可以加对应的ID在DIV上。DIV容器中可以包含任何内容块,也可以嵌套另一个DIV。内容块可以包含任意的HTML元素---标题、段落、图片、表格、列表等等。 * @$ |# D! @5 ^) k* j7 y' p
% k4 e; r: e3 o8 M
根据上面讲述的,你已经知道如何结构化HTML,现在你可以进行布局和样式定义了。每一个内容块都可以放在页面上任何地方,再指定这个块的颜色、字体、边框、背景以及对齐属性等等。
' }6 [; F. X6 z! A- P7 j( d, M; s6 n* n8 C$ y, k
使用选择器是件美妙的事
8 y3 u+ ?" q! w* Rid的名称是控制某一内容块的手段,通过给这个内容块套上DIV并加上唯一的id,你就可以用CSS选择器来精确定义每一个页面元素的外观表现,包括标 题、列表、图片、链接或者段落等等。例如你为#header写一个CSS规则,就可以完全不同于#content里的图片规则。
' n: Y4 d- v1 E" w) b2 G7 `
) k- P' W+ T# R3 e: J 另外一个例子是:你可以通过不同规则来定义不同内容块里的链接样式。类似这样:#globalnav a:link或者 #subnav a:link或者#content a:link。你也可以定义不同内容块中相同元素的样式不一样。例如,通过#content p和#footer p分别定义#content和#footer中p的样式。从结构上讲,你的页面是由图片、链接、列表、段落等组成的,这些元素本身并不会对显示在什么网络 设备中(PDA还是手机或者网络电视)有影响,它们可以被定义为任何的表现外观。
( J( A# d+ Z: A5 e1 S& H b# k# I$ J6 C/ x2 g
一个仔细结构化的HTML页面非常简单,每一个元素都被用于结构目的。当你想缩进一个段落,不需要使用blockquote标签,只要使用p标签,并对p 加一个CSS的margin规则就可以实现缩进目的。p是结构化标签,margin是表现属性,前者属于HTML,后者属于CSS。(这就是结构于表现的 相分离.)
& W' H+ f2 ~# m) i* S, Y 良好结构的HTML页面内几乎没有表现属性的标签。代码非常干净简洁。例如,原先的代码<table width="80%" cellpadding="3" border="2" align="left">,现在可以只在HTML中写<table>,所有控制表现的东西都写到CSS中去,在结构化的HTML中, table就是表格,而不是其他什么(比如被用来布局和定位)。
. O- r7 D& f+ e1 S% U- p1 `& V
* F- G9 a4 H! n1 a5 U: G亲自实践一下结构化 7 \% w/ r. }0 v7 J% A! I8 O/ b, F' \
1 I. @/ {/ w7 y! O/ }3 z$ y 上面说的只是最基本的结构,实际应用中,你可以根据需要来调整内容块。常常会出现DIV嵌套的情况,你会看到"container"层中又有其它层,结构类似这样:
+ V& H! C/ U# L, D3 P o% Q& P8 D+ `: k) n0 D# U" Z8 a
<div id="navcontainer">
8 ?! B$ P( ]; I2 l; L
! w N. G# W8 w% V4 I <div id="globalnav"> % d" e3 L. H1 T+ L( b
" U9 C g( n3 A b+ o <ul>a list</ul>
( P5 k# A! u( X* p2 F3 L
1 z- N) q: @5 l </div>
8 ~% m$ c8 e7 `/ s& r0 b) Y8 E1 T' S& K5 {: g% p
<div id="subnav">
: O. l) t& _' y* N( r
2 }2 z+ d$ `/ H% f; m <ul>another list</ul> 1 g+ m8 G' b! v3 `2 `
0 v6 Q2 N& A' p: N3 W% M1 E </div> . U% n/ D+ R8 b# c: K1 [5 i
5 l8 \! W7 f" _! n </div>
; B f' c9 E0 U1 h1 }: N( X1 K' Y- Y: ]# Q. }7 p9 J
嵌套的div元素允许你定义更多的CSS规则来控制表现,例如:你可以给#navcontainer一个规则让列表居右,再给#globalnav一个规则让列表居左,而给#subnav的list另一个完全不同的表现。
- R0 M% {) C% K F* ^5 G7 L; V8 R+ X6 o) c q+ w
8 c% m' l! Y) Z" {2 e7 P8 ] 用CSS替换传统方法 4 ]4 e" ]; y/ @2 Q% Z
下面的列表将帮助你用CSS替换传统方法:
& Y2 D5 D2 E* l9 A- z+ D+ o7 q2 c% K6 J+ D2 W! ~6 r
HTML属性以及相对应的CSS方法
* t" F; N+ r2 |- t; K$ D+ X; Y HTML属性 ! a' N8 m4 L( V
& ~" M: H5 J. Q2 z
. Z" w; a) g" G. _2 _) _. |
CSS方法说明
7 C1 G. n, A* b align="left" , S' N, F9 B9 P- [1 Q" Q1 I% c
5 V6 K# v% c( o E5 d# h align="right" float: left;
* `- Q- D$ d, w% y$ u* `+ G/ d& e1 I
float: right; 使用CSS可以浮动 任何元素:图片、段落、div、标题、表格、列表等等 4 T6 O8 V! q. Q$ e5 r% A
% ^8 x# A* P$ H |) T 当你使用float属性,必须给这个浮动元素定义一个宽度。
7 b- J: p! z7 U0 h; h. A* G& s, f5 }0 z
* H+ \* D. C( h. Z+ ~: w/ u marginwidth="0" leftmargin="0" marginheight="0" topmargin="0" margin: 0; 使用CSS, margin可以设置在任何元素上, 不仅仅是body元素.更重要的,你可以分别指定元素的top, right, bottom和left的margin值。 1 F' D8 {0 V2 Q3 ]0 m, P$ V
1 H. [) E! W% l& A- | v
vlink="#333399" alink="#000000" link="#3333FF" a:link #3ff; ( v' R- m# S. ?) x# N3 a
% ^9 r `/ n. f a:visited: #339; % H7 {9 [+ o1 R* [
8 H) Z3 y \5 D( ~4 k6 [ a:hover: #999; 4 s3 F9 E/ K7 C1 Q4 \* o4 v
2 o; }1 D/ i. R& S/ N0 D3 S
a:active: #00f;
& w3 P. M6 r8 J( q* k 在HTML中,链接的颜色作为body的一个属性值定义。整个页面的链接风格都一样。使用CSS的选择器,页面不同部分的链接样式可以不一样。 6 R- X9 f1 n [
8 S7 M. F q3 y6 J1 d+ R bgcolor="#FFFFFF" background-color: #fff; 在CSS中,任何元素都可以定义背景颜色,不仅仅局限于body和table元素。
6 _3 U6 B9 E @5 q, `3 d# U) r$ s9 E8 Q1 a3 k" ]0 s
bordercolor="#FFFFFF" border-color: #fff; 任何元素都可以设置边框(boeder),你可以分别定义top, right, bottom和left * y0 o8 f1 F6 q! r' r x3 I
/ Z: n" v8 L7 ^3 q1 K& M
border="3" cellspacing="3" border-width: 3px; 用CSS,你可以定义table的边框为统一样式,也可以分别定义top, right, bottom and left边框的颜色、尺寸和样式。 + g1 G+ l' `& }; ?9 I5 j
+ t2 L( |4 b8 n
你可以使用 table, td or th 这些选择器.
3 H6 W# T8 D5 m$ I
, _6 ] L0 u% s 如果你需要设置无边框效果,可以使用CSS定义: border-collapse: collapse;
$ r+ ~+ \$ b4 v. T' r! G4 m9 o
% k5 N$ I6 i _; k' b <br clear="left"> $ }# k+ Q- ^3 |3 ]- c4 ?6 R
, o( w6 v1 f" C0 O* z& I* `; E
<br clear="right"> 5 J+ }2 u9 \6 [6 f1 m( `
' i* H8 k9 u; t" y
<br clear="all"> ( X; |; f4 M m! ]* V- |* H- c
. @0 O& _$ K6 D z clear: left; 6 r8 ^9 I" c7 ~! D; J
' M( z% {# G2 q1 c& w/ m# X clear: right; . c( L# j9 u% D% @+ [
. I0 m0 j0 a) ? clear: both; , P' u; L! d9 a b9 U8 t: I+ H
许多2列或者3列布局都使用 float属性来定位。如果你在浮动层中定义了背景颜色或者背景图片,你可以使用clear属性.
' G+ z2 H' K" M- g# U
7 u, i( l- S1 l; H* v% b( p- J2 ~% u cellpadding="3" 2 k% s$ S7 ~ N* z9 ^; r
6 U. N( [8 \" N: K vspace="3" 0 ?( H" D; e8 A2 c3 x2 R
! }/ P0 U9 V+ G& v. O
hspace="3" padding: 3px; 用CSS,任何元素都可以设定padding属性,同样,padding可以分别设置top, right, bottom and left。padding是透明的。
' h7 l) E1 R S. V8 k: _2 M' [+ c% \- A
align="center" text-align: center; 0 h# t1 C" s. `2 \2 ]
$ A" e! f/ z/ k4 m
margin-right: auto; margin-left: auto; 9 D8 h P+ u1 d, G3 i3 d
Text-align 只适用于文本.
- C- R1 H# ?0 ^. Q+ N, R, ?9 K5 ?+ y
象div,p这样的块级可以通过margin-right: auto; 和margin-left: auto;来水平居中
G2 O V; G& a& L4 R: e- `/ J' Q$ D/ H3 V- P
一些令人遗憾的技巧和工作环境
8 M6 p1 p$ g+ W. X3 G1 Y, Z0 m$ q; X! q
. z8 ]2 g/ [/ `. i) _/ X; f) i
由于浏览器对CSS支持的不完善,我们有时候不得不采取一些技巧(hacks)或建立一种环境(Workarounds)来让CSS实现传统方法同样的效 果。例如块级元素有时侯需要使用水平居中的技巧,盒模型bug的技巧等等。所有这些技巧都在Molly Holzschlag的文章《Integrated Web Design: Strategies for Long-Term CSS Hack Management》中有详细说明。
$ w% V8 S K* n+ Q d 另外一个关于CSS技巧的资源站点是Big John和Holly Bergevin的“Position is Everything”。 0 E" \+ ~5 `/ C2 }+ T% c
1 r# o& ^$ R& ^- F0 I0 B3 B
理解浮动行为
5 @$ n# C2 W+ R6 G" A" E5 f
% [ y, I9 m' g4 _ U Eric Meyer的《Containing Floats》将帮助你掌握如何使用float属性布局。float元素有时候需要清除(clear),阅读《How To Clear Floats Without Structural Markup》将非常有帮助。
1 w3 f! _: b0 \$ z, k# c( K$ Q& F' h# }! H
更多帮助 , f( u: ~7 v @: m! r9 w2 i7 g- j
4 E V ^$ m( x3 z& M; t: U 已有的《CSS Discussion》列表是很好的资源,它收集了一个WiKiA讨论组的信息,其中包括CSS布局总结(css- discuss.incutio.com/?page=CssLayouts),CSS 技巧总结 (css-discuss.incutio.com/?page=CssHack) 以及更多。 |
|