|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14341
- 金币
- 2456
- 威望
- 1647
- 贡献
- 1404
|
你正在学习CSS布局吗?是不是还不能完全掌握纯CSS布局?通常有两种情况阻碍你的学习:
* A( t% y) B+ |8 |( v' H2 R7 T: u- N+ `7 L
第一种可能是你还没有理解CSS处理页面的原理。在你考虑你的页面整体表现效果前,你应当先考虑内容的语义和结构,然后再针对语义、结构添加CSS。这篇文章将告诉你应该怎样把HTML结构化。 * b3 B/ F9 E X0 O
* Z: {7 u! _0 x: N) s% D* h$ I4 R% R9 p 另一种原因是你对那些非常熟悉的表现层属性(例如:cellpadding,、hspace、align="left"等等)束手无策,不知道该转换成对 应的什么CSS语句。 $ W9 w3 l& E" Y" h' ~( \ E8 y- f% z
$ u1 w' i- J0 d4 L当你解决了第一种问题,知道了如何结构化你的HTML,我再给出一个列表,详细列出原来的表现属性用什么CSS来代替。
3 J0 U: u3 }4 u: D! \6 o# [
4 w9 j9 p% K" K0 W 结构化HTML
0 t s) t+ [4 [, s2 \) B
% e( |/ ?2 F) } 我们在刚学习网页制作时,总是先考虑怎么设计,考虑那些图片、字体、颜色、以及布局方案。然后我们用Photoshop或者Fireworks画出来、切割成小图。最后再通过编辑HTML将所有设计还原表现在页面上。
% p9 R/ d7 h! j
5 r" ]1 T) b2 t 如果你希望你的HTML页面用CSS布局(是CSS-friendly的),你需要回头重来,先不考虑“外观”,要先思考你的页面内容的语义和结构。 8 d+ B' W1 q7 F9 F
" }# m7 U0 @8 V3 c
外观并不是最重要的。一个结构良好的HTML页面可以以任何外观表现出来,CSS Zen Garden是一个典型的例子。CSS Zen Garden帮助我们最终认识到CSS的强大力量。
0 z& Y$ P8 i: u; i
: F! D5 Z- a l* Z. k4 K" } HTML不仅仅只在电脑屏幕上阅读。你用photoshop精心设计的画面可能不能显示在PDA、移动电话和屏幕阅读机上。但是一个结构良好的HTML页面可以通过CSS的不同定义,显示在任何地方,任何网络设备上。 7 \" D' n( M# r- t U
) O- k6 ~5 p4 M% z4 f/ I6 P
开始思考 % }0 \# Z$ D$ y# o9 ?
6 D2 m$ W) g4 j1 _+ |# G' A
r. x& e2 x3 }4 M/ ~4 A& }7 m I
# a+ C1 t, ^1 i I' z
首先要学习什么是"结构",一些作家也称之为"语义"。这个术语的意思是你需要分析你的内容块,以及每块内容服务的目的,然后再根据这些内容目的建立起相应的HTML结构。 9 @( z2 R8 d4 J% e3 ^
% e, V5 a2 ?9 `7 c( |8 A% T 如果你坐下来仔细分析和规划你的页面结构,你可能得到类似这样的几块: 4 R* C9 M9 X3 M( C
; C m$ D( ~! M( i' a 标志和站点名称
5 n* H) Y r/ ] 主页面内容
" Z4 O c5 }4 M4 t 站点导航(主菜单)
' o8 x# x" D- A 子菜单 , ]. ]* E i$ q) H
搜索框 ' d3 s! X5 T p* F
功能区(例如购物车、收银台) ( J2 p" r, N8 H) d
页脚(版权和有关法律声明) 2 x9 n1 o: L+ E# G
( P- {, d" V; ]8 G
% @6 [. J% J2 @+ n$ z6 Q& K: @& l 我们通常采用DIV元素来将这些结构定义出来,类似这样: 8 g5 R" P0 E+ B6 X& T
. ~. {( u) j' n$ j1 b
<div id="header"></div>
. l+ C: B/ `0 v* w3 I w/ J c, D3 V6 k% v3 u
<div id="content"></div>
8 s; E3 o' h$ M% J1 h) j7 y7 v, D: y \7 M/ I8 }' Y5 J
<div id="globalnav"></div>
+ Y& r# n5 a0 A) N1 S b7 \. w( l- s: S
<div id="subnav"></div> 6 g6 `# j, H2 }3 }% o( O
$ w$ P" V) E! k! n+ B <div id="search"></div>
4 p9 D3 [3 p" z. s
E0 U8 n" d; i2 ~6 Z <div id="shop"></div>
" H2 D# N/ r& r, k f9 m+ B" e6 Q7 Y, k' ]1 \: p' S
<div id="footer"></div> ' I6 q9 Z; e( g0 R4 x; F
, n) G! ^/ ?3 s' }: R2 F 这不是布局,是结构。这是一个对内容块的语义说明。当你理解了你的结构,就可以加对应的ID在DIV上。DIV容器中可以包含任何内容块,也可以嵌套另一个DIV。内容块可以包含任意的HTML元素---标题、段落、图片、表格、列表等等。 5 X$ O o& r; j+ t
0 B; R. Y y& s- Q$ ]. l6 {# P6 ~ 根据上面讲述的,你已经知道如何结构化HTML,现在你可以进行布局和样式定义了。每一个内容块都可以放在页面上任何地方,再指定这个块的颜色、字体、边框、背景以及对齐属性等等。 $ q4 _# i2 W8 N/ a5 [
* N4 o/ I n/ K 使用选择器是件美妙的事
* N8 r3 i0 H- ?6 j- ]: g7 Cid的名称是控制某一内容块的手段,通过给这个内容块套上DIV并加上唯一的id,你就可以用CSS选择器来精确定义每一个页面元素的外观表现,包括标 题、列表、图片、链接或者段落等等。例如你为#header写一个CSS规则,就可以完全不同于#content里的图片规则。
; p/ M7 b `' g0 D$ \# {5 R, _6 e: t; s n, C
另外一个例子是:你可以通过不同规则来定义不同内容块里的链接样式。类似这样:#globalnav a:link或者 #subnav a:link或者#content a:link。你也可以定义不同内容块中相同元素的样式不一样。例如,通过#content p和#footer p分别定义#content和#footer中p的样式。从结构上讲,你的页面是由图片、链接、列表、段落等组成的,这些元素本身并不会对显示在什么网络 设备中(PDA还是手机或者网络电视)有影响,它们可以被定义为任何的表现外观。 ( Y: J4 i# o' F" S4 ] P3 E
: H" x2 ?" ?8 ] ?
一个仔细结构化的HTML页面非常简单,每一个元素都被用于结构目的。当你想缩进一个段落,不需要使用blockquote标签,只要使用p标签,并对p 加一个CSS的margin规则就可以实现缩进目的。p是结构化标签,margin是表现属性,前者属于HTML,后者属于CSS。(这就是结构于表现的 相分离.)' D# \3 p2 R/ `8 F$ w( k! N' B
良好结构的HTML页面内几乎没有表现属性的标签。代码非常干净简洁。例如,原先的代码<table width="80%" cellpadding="3" border="2" align="left">,现在可以只在HTML中写<table>,所有控制表现的东西都写到CSS中去,在结构化的HTML中, table就是表格,而不是其他什么(比如被用来布局和定位)。
- u/ m' O3 u1 Z" H0 |; \! F& G4 h
亲自实践一下结构化 ^2 c& ]' s8 H8 ?. U2 q
- ^ _) H: Z, v: P5 | 上面说的只是最基本的结构,实际应用中,你可以根据需要来调整内容块。常常会出现DIV嵌套的情况,你会看到"container"层中又有其它层,结构类似这样:
5 G: W* Z, \. V" T. z* J% [9 I" h: T; P$ M3 a6 C8 n
<div id="navcontainer"> / h( T* Z- ?* {# Y# T
9 ^ P9 h& J6 R+ ]( d! c
<div id="globalnav">
7 m' C% {; i4 W& S* a- D- h( u: ?) e7 E4 S. q3 \
<ul>a list</ul>
/ h) h! @/ H) k
- B8 \* Q) ]) i' s0 \ </div> 0 g/ J% B0 r$ y) {& n( a5 W
( u5 a W: d( M. m$ W
<div id="subnav"> 1 D' V L& z: v t% e
2 z' T$ v3 k; m8 Q <ul>another list</ul>
( g' k6 [% ?0 a: s5 U4 P* k8 a% e2 G+ ? T' {) m2 p" P
</div> ; t% W" {. r; d8 d& m
9 X' N* S$ L+ c* X
</div>
. D2 L9 y7 ^# n1 A7 `+ W
0 X! h& |- P- V% @3 G- F 嵌套的div元素允许你定义更多的CSS规则来控制表现,例如:你可以给#navcontainer一个规则让列表居右,再给#globalnav一个规则让列表居左,而给#subnav的list另一个完全不同的表现。 - g* s3 P% g9 v% a X$ K& y0 Q
" @& K8 k& S: ]2 d' K: u, K4 l. {
6 x- @8 S1 Y1 ~$ v 用CSS替换传统方法
0 O2 P' {- k. E; U8 K) K% X( i) K 下面的列表将帮助你用CSS替换传统方法:
+ ?- r8 A. K0 d: i; Z: C$ A# q: v5 J+ g+ o( i! o
HTML属性以及相对应的CSS方法 8 \2 `5 P( \5 f& R3 T
HTML属性
2 \& `$ ~6 p7 a7 k% Z1 W8 I, B" W& B2 i2 k: c- y( c
! L1 {" Z# d. A% ~ B CSS方法说明
0 O; M, H: Y0 ?* R; C$ Z0 \+ Y align="left" : u( O6 q0 ^' l9 R4 _1 y6 T) @! z2 }
" k* T- `) ]8 S align="right" float: left; - Z2 Q) U$ |* z' W+ g, Z4 `7 Y
3 g& `7 n, Q+ B3 P$ ? float: right; 使用CSS可以浮动 任何元素:图片、段落、div、标题、表格、列表等等
2 P) F0 ]) R/ j5 z# \
( M1 k: l' [: V/ o4 e5 X! _ 当你使用float属性,必须给这个浮动元素定义一个宽度。
8 |) R) z/ p/ J8 b i: [8 c
5 Q( i4 B2 i1 @( E4 E' x3 L marginwidth="0" leftmargin="0" marginheight="0" topmargin="0" margin: 0; 使用CSS, margin可以设置在任何元素上, 不仅仅是body元素.更重要的,你可以分别指定元素的top, right, bottom和left的margin值。
" }9 o7 a" g6 f! w
. |$ e7 d: _% s8 A- ?( Q; @) H vlink="#333399" alink="#000000" link="#3333FF" a:link #3ff; + j& q2 M7 i9 |* [, I6 C, R
; b# e# p/ h9 k% b# {9 U a:visited: #339;
: s4 i& K. p: F. `8 C6 B+ m% e
! ]! u# a( d4 _9 d* g a:hover: #999; & i& ^6 L" E+ e- V
2 W% d( H# I4 e! y a:active: #00f; 3 v4 ]+ I. y* H9 c0 H$ m
在HTML中,链接的颜色作为body的一个属性值定义。整个页面的链接风格都一样。使用CSS的选择器,页面不同部分的链接样式可以不一样。
. F4 |! D8 J& a9 Z0 E# G2 }
( V' J( C! }6 b* f# z$ u/ F bgcolor="#FFFFFF" background-color: #fff; 在CSS中,任何元素都可以定义背景颜色,不仅仅局限于body和table元素。
# f6 G7 l9 n- K" e' g: e2 I% j, l" l3 A! }( C
bordercolor="#FFFFFF" border-color: #fff; 任何元素都可以设置边框(boeder),你可以分别定义top, right, bottom和left 8 R! J# `+ {4 y. W
7 r8 H2 h) @+ U1 j) ^& r; J
border="3" cellspacing="3" border-width: 3px; 用CSS,你可以定义table的边框为统一样式,也可以分别定义top, right, bottom and left边框的颜色、尺寸和样式。
( j3 _; k( }: C- D; i# Y( Z: I
: |5 J- r8 p4 W4 V 你可以使用 table, td or th 这些选择器. . ~, j5 n) J; d: u! |3 ~% p: Q
5 w$ @; P6 \. `" ]" P( x 如果你需要设置无边框效果,可以使用CSS定义: border-collapse: collapse; / S- Z$ v2 g/ f' A2 M9 [6 \5 Y
1 g7 L6 W# B4 E
<br clear="left"> 5 c2 Y- }+ h+ h( @. A: r, E* U
0 G9 D# I6 K/ z8 D# J0 |
<br clear="right">
# ]/ M7 E7 o2 t' m! `3 N
2 b2 f8 {0 t0 o" r& @5 _5 @ <br clear="all"> 6 h' }5 Z8 q5 e/ \
* i u: g* {7 c! j# Q clear: left;
. x! }+ h4 q4 b1 q% ~, F2 R8 F# o0 t& x, P& M6 M
clear: right; 6 B& _$ Q, R0 f$ w7 @
9 Q3 V3 J0 r. L/ J
clear: both;
& B. L9 R) W- F0 F 许多2列或者3列布局都使用 float属性来定位。如果你在浮动层中定义了背景颜色或者背景图片,你可以使用clear属性. + Z) e8 j* v% D1 M! y& i, q) S# h
) X+ T' G- f4 ]9 X. D) o cellpadding="3" : S3 E. |5 e6 p& [( {
9 W: G8 c& D( r* U
vspace="3"
6 w8 W5 W$ y5 |' e: [+ v6 I2 i4 D- @3 g; B' p1 _
hspace="3" padding: 3px; 用CSS,任何元素都可以设定padding属性,同样,padding可以分别设置top, right, bottom and left。padding是透明的。 # m, q" ~1 L$ A1 l) P
) v' f/ Y" i w; e1 F, n
align="center" text-align: center;
* B; \- x( o1 Q1 A8 l' ?' v4 F) a& Z; F* D- m" K
margin-right: auto; margin-left: auto; 2 r P4 U+ y& i7 w
Text-align 只适用于文本. : x. e2 _. J# T, _5 U4 ~
4 p0 n' `% R. U2 ]$ s 象div,p这样的块级可以通过margin-right: auto; 和margin-left: auto;来水平居中
9 @4 F% ?( M3 F2 }7 Z0 u) i3 j0 u: `3 K0 T2 Q
一些令人遗憾的技巧和工作环境
; C/ y5 [+ G, X+ I6 y3 n5 @+ h4 b$ B( Q+ e6 }* y$ Z5 y
9 |0 f" l6 E2 h& h( e) l
由于浏览器对CSS支持的不完善,我们有时候不得不采取一些技巧(hacks)或建立一种环境(Workarounds)来让CSS实现传统方法同样的效 果。例如块级元素有时侯需要使用水平居中的技巧,盒模型bug的技巧等等。所有这些技巧都在Molly Holzschlag的文章《Integrated Web Design: Strategies for Long-Term CSS Hack Management》中有详细说明。
! w* ~9 @; n) {% ]* I; A/ X( A 另外一个关于CSS技巧的资源站点是Big John和Holly Bergevin的“Position is Everything”。
0 e4 X/ a G' z) q! G D4 g. R" T U
理解浮动行为 : U; M8 @% m8 z- R5 L! `" u
% U' ]+ o+ g1 | x9 h& W! [1 `0 n
Eric Meyer的《Containing Floats》将帮助你掌握如何使用float属性布局。float元素有时候需要清除(clear),阅读《How To Clear Floats Without Structural Markup》将非常有帮助。
2 x E" t7 Y3 F5 \1 s
- U2 T; u% r/ P/ W6 l6 a 更多帮助
. [! S0 H3 a/ a! m- |- w# {5 F' @5 d% d$ C: }+ e p
已有的《CSS Discussion》列表是很好的资源,它收集了一个WiKiA讨论组的信息,其中包括CSS布局总结(css- discuss.incutio.com/?page=CssLayouts),CSS 技巧总结 (css-discuss.incutio.com/?page=CssHack) 以及更多。 |
|