返回列表 发帖

HTML结构化:DIV+CSS网页布局入门指南

你正在学习CSS布局吗?是不是还不能完全掌握纯CSS布局?通常有两种情况阻碍你的学习:
2 ^0 d6 m- m4 M! F8 |0 ]' D! |7 J/ ^8 y  i
  第一种可能是你还没有理解CSS处理页面的原理。在你考虑你的页面整体表现效果前,你应当先考虑内容的语义和结构,然后再针对语义、结构添加CSS。这篇文章将告诉你应该怎样把HTML结构化。
6 L* h4 b4 e  {# N1 B- n1 A/ V' v- A" q
  另一种原因是你对那些非常熟悉的表现层属性(例如:cellpadding,、hspace、align="left"等等)束手无策,不知道该转换成对 应的什么CSS语句。 ( D0 }: \/ _, U

6 i# @/ t+ m7 T0 {2 V) H1 I1 b当你解决了第一种问题,知道了如何结构化你的HTML,我再给出一个列表,详细列出原来的表现属性用什么CSS来代替。 ; h7 G, a+ R, A' C

0 T. l0 W8 r) E% k  结构化HTML 3 T! G1 R5 W$ ?2 ~+ a

/ c8 F, S/ S. C  f! }& a" N  我们在刚学习网页制作时,总是先考虑怎么设计,考虑那些图片、字体、颜色、以及布局方案。然后我们用Photoshop或者Fireworks画出来、切割成小图。最后再通过编辑HTML将所有设计还原表现在页面上。
( ?( b0 P# p2 K4 I  n+ `- Z! S1 H6 [" d  C0 x. h
  如果你希望你的HTML页面用CSS布局(是CSS-friendly的),你需要回头重来,先不考虑“外观”,要先思考你的页面内容的语义和结构。 # g) D' K8 B; e' W6 C* V  H

  P, c' \% u5 v  外观并不是最重要的。一个结构良好的HTML页面可以以任何外观表现出来,CSS Zen Garden是一个典型的例子。CSS Zen Garden帮助我们最终认识到CSS的强大力量。 8 {8 M9 B! F2 u5 a
0 H" M) k2 u3 s
  HTML不仅仅只在电脑屏幕上阅读。你用photoshop精心设计的画面可能不能显示在PDA、移动电话和屏幕阅读机上。但是一个结构良好的HTML页面可以通过CSS的不同定义,显示在任何地方,任何网络设备上。
' \. U& F1 P( U! |9 o3 K6 g7 g" N* r. }: P
  开始思考 8 K' W& j0 ?3 G; J# _% A5 b
- @0 H$ `( J+ j7 Y

* F, @2 E. {. k' H( j* _
/ `* I4 O8 o) r" i) q. Z0 M9 e  首先要学习什么是"结构",一些作家也称之为"语义"。这个术语的意思是你需要分析你的内容块,以及每块内容服务的目的,然后再根据这些内容目的建立起相应的HTML结构。
  J3 j5 ^/ U0 f
3 M3 i, `1 M- F( z  如果你坐下来仔细分析和规划你的页面结构,你可能得到类似这样的几块: 1 I& P3 l+ w- W& P, _% _. h
2 D. h' J( a* d+ q
  标志和站点名称 " O1 D3 Y  ?9 J" L& ?- `+ ]
  主页面内容
8 i8 n+ A5 d. e7 ~6 b+ u  站点导航(主菜单)
3 M4 l! O/ s3 C6 _7 S. G, ~  子菜单
0 Q! w. {! x7 k2 R1 ~  搜索框 # l0 n$ q* d$ J( _; ]. f0 ^0 }
  功能区(例如购物车、收银台)
( g( s+ @3 f0 ?+ x  页脚(版权和有关法律声明) 1 M8 i; A1 X8 X
- j! K3 b$ X# {7 z0 L2 a6 w, x) D4 n

$ V: v3 _$ K: A+ h. R9 {; v% ~/ e  d  我们通常采用DIV元素来将这些结构定义出来,类似这样: 5 g. e& m3 F8 g8 X
; E' q9 j4 T9 Q2 [# k
  <div id="header"></div> - J" {, a8 q3 O. I4 b

$ I" X+ o. u0 V. w( U5 d  <div id="content"></div> 0 {& g+ Z- Y" y$ M& P* g# ^

5 X+ a4 F) \$ O% w4 P% z+ ?" `  <div id="globalnav"></div>
  ~! R* [9 _6 c4 [3 C5 W
! r3 G. B5 |0 y0 r( F  <div id="subnav"></div>
' H! g7 O& S! ]+ W. Y; t1 s
( l  X9 Y) }/ F& S5 G! m  y3 L  <div id="search"></div> 5 [* p& L! {- \4 C) w# Z
' u4 w( o* m7 b( i
  <div id="shop"></div> . T) \& L: E6 X2 e' J# _7 \

8 N1 @# ]" H! [* ~  <div id="footer"></div>
) L2 d3 Y7 C- q8 w# V9 r. ]3 T2 i$ J( P2 p9 h! b: T
  这不是布局,是结构。这是一个对内容块的语义说明。当你理解了你的结构,就可以加对应的ID在DIV上。DIV容器中可以包含任何内容块,也可以嵌套另一个DIV。内容块可以包含任意的HTML元素---标题、段落、图片、表格、列表等等。
0 m. s; `. F$ m  b7 `
  w+ G0 r' s' e7 r, K4 `6 Q" X  根据上面讲述的,你已经知道如何结构化HTML,现在你可以进行布局和样式定义了。每一个内容块都可以放在页面上任何地方,再指定这个块的颜色、字体、边框、背景以及对齐属性等等。 0 z; @' g; T' ?2 }
7 z) m6 ?1 _& F, S5 p& y9 N
  使用选择器是件美妙的事
3 ~- m$ X! Y+ o, zid的名称是控制某一内容块的手段,通过给这个内容块套上DIV并加上唯一的id,你就可以用CSS选择器来精确定义每一个页面元素的外观表现,包括标 题、列表、图片、链接或者段落等等。例如你为#header写一个CSS规则,就可以完全不同于#content里的图片规则。
3 I% t6 ?. }- \) w1 }# b. \/ }: h
2 G& U3 @% ]5 h' ~6 J# I  另外一个例子是:你可以通过不同规则来定义不同内容块里的链接样式。类似这样:#globalnav a:link或者 #subnav a:link或者#content a:link。你也可以定义不同内容块中相同元素的样式不一样。例如,通过#content p和#footer p分别定义#content和#footer中p的样式。从结构上讲,你的页面是由图片、链接、列表、段落等组成的,这些元素本身并不会对显示在什么网络 设备中(PDA还是手机或者网络电视)有影响,它们可以被定义为任何的表现外观。 ( ?8 D7 j4 p& n( p

4 M* y2 O9 e, p  一个仔细结构化的HTML页面非常简单,每一个元素都被用于结构目的。当你想缩进一个段落,不需要使用blockquote标签,只要使用p标签,并对p 加一个CSS的margin规则就可以实现缩进目的。p是结构化标签,margin是表现属性,前者属于HTML,后者属于CSS。(这就是结构于表现的 相分离.)" v3 G) W  d; o: f5 j1 u, p
  良好结构的HTML页面内几乎没有表现属性的标签。代码非常干净简洁。例如,原先的代码<table width="80%" cellpadding="3" border="2" align="left">,现在可以只在HTML中写<table>,所有控制表现的东西都写到CSS中去,在结构化的HTML中, table就是表格,而不是其他什么(比如被用来布局和定位)。
! \/ F3 w# N! @8 z
& c! S0 o% R7 }( b+ j. Y- C亲自实践一下结构化
( k! ]. E- J. |6 Z* D4 U) J0 B0 O8 J* {+ W& L6 Y! J( `5 U
  上面说的只是最基本的结构,实际应用中,你可以根据需要来调整内容块。常常会出现DIV嵌套的情况,你会看到"container"层中又有其它层,结构类似这样: 1 i& `! L/ B3 L$ n7 b3 G

9 R; f' Y' \9 U  P% f  <div id="navcontainer"> 4 I; Y% J6 d8 E$ z! k

5 C( f: i6 @3 G5 G/ N* m/ l0 b7 N  <div id="globalnav"> 0 O% {/ q$ m9 W8 s, d9 h& \) R
5 R7 q+ `- Z7 ~/ M# M
  <ul>a list</ul>
! D0 U# ?; B1 J& L
! j% g4 ]7 r4 I  </div>
; j& K8 g" S) F6 X' s# \0 j+ \+ ]; I8 t: i, ~9 `& p0 l
  <div id="subnav"> ! v; o; ~2 S! ]! n$ s6 u+ S5 ?
7 [3 g& D* {% E3 J# d
  <ul>another list</ul>
# Q6 v& I8 I9 [$ v
: D+ l+ q! l7 G. l* M# e+ ?  </div>
' Z2 |! ~' V6 g* G) `/ y$ i9 s5 ]: ?: Q+ ^
  </div>   f+ M& v! q; [/ @8 ?8 T# R
8 N+ D, Q! e$ E) ^6 k+ R7 K
  嵌套的div元素允许你定义更多的CSS规则来控制表现,例如:你可以给#navcontainer一个规则让列表居右,再给#globalnav一个规则让列表居左,而给#subnav的list另一个完全不同的表现。 - H$ F" K% b; O7 N/ v, |" z

; n9 v' ?/ I, B' l8 Z' `
; R! E$ P+ ]7 R8 [- W  用CSS替换传统方法
/ l( l( I7 |: L2 j2 _  下面的列表将帮助你用CSS替换传统方法:
4 i7 D( R+ A3 T: t; z% O" @9 [$ U3 h5 F
  HTML属性以及相对应的CSS方法 6 Q( P- s; v* r
  HTML属性
5 ~$ _& N4 B! O
1 \; E6 q# G: S: j- m
: M2 \6 M" z  `% I7 x& z$ z, _2 u4 H( a  CSS方法说明 9 G  l( o; H3 L
  align="left" 9 j  [1 }' |5 T7 |. L

: ?+ P7 o1 u* ?" v6 [% A* C  align="right" float: left; 9 y& ~% [* q- e& w
8 Q( Y$ [& l9 y9 p* d8 o
  float: right; 使用CSS可以浮动 任何元素:图片、段落、div、标题、表格、列表等等
% \% Q3 S( y! e2 ]% E- x$ D2 O! G% D3 `0 w/ v% A
  当你使用float属性,必须给这个浮动元素定义一个宽度。
2 K4 e' A1 |+ J! J6 G/ k: \# ~+ d1 O* q8 o3 K
  marginwidth="0" leftmargin="0" marginheight="0" topmargin="0" margin: 0; 使用CSS, margin可以设置在任何元素上, 不仅仅是body元素.更重要的,你可以分别指定元素的top, right, bottom和left的margin值。
- ]. L, J" V+ D) ?
4 |( O" H1 N4 l! C+ I  vlink="#333399" alink="#000000" link="#3333FF" a:link #3ff; & L4 R/ N, F2 H+ M8 S5 c. q
0 p. K! u; y0 j. I0 w
  a:visited: #339;
( g6 r) f4 t- }2 Z; K8 W4 x5 R6 z9 ^( K; k0 R) P/ p  E* d4 V
  a:hover: #999;   c0 B7 t+ M9 W( A5 A- N4 _

6 q* Z: P2 @1 U1 x' Z0 w& Y/ l- b  a:active: #00f;
6 b' U4 b: v7 ^0 `% Q2 ?- L  在HTML中,链接的颜色作为body的一个属性值定义。整个页面的链接风格都一样。使用CSS的选择器,页面不同部分的链接样式可以不一样。
  o# m& E! ?! p! k) O
- Z! f# l7 p  |/ Q- A, O  bgcolor="#FFFFFF" background-color: #fff; 在CSS中,任何元素都可以定义背景颜色,不仅仅局限于body和table元素。
' D1 u/ H. e* |/ r7 |  [1 A0 k
  bordercolor="#FFFFFF" border-color: #fff; 任何元素都可以设置边框(boeder),你可以分别定义top, right, bottom和left / q/ `9 o/ O6 T/ C( }" {

( ?3 ~7 {9 D0 r  border="3" cellspacing="3" border-width: 3px; 用CSS,你可以定义table的边框为统一样式,也可以分别定义top, right, bottom and left边框的颜色、尺寸和样式。
  j" g8 v0 h1 i+ ^1 W# Q0 C3 I  Q* F  ?+ S
  你可以使用 table, td or th 这些选择器.
& o3 Q2 M3 L# R4 T  G
' A7 y1 G9 p; w4 T: Q3 e- H( m& w  如果你需要设置无边框效果,可以使用CSS定义: border-collapse: collapse; 1 j* ^. a  v; Y
6 j; `' a% s1 i6 W% p+ {  \. L
  <br clear="left"> 8 V1 q- L8 P6 _: p
   1 X$ x: N0 ?3 ]' }
  <br clear="right">
, {0 H  K, n/ }% W9 f5 Y6 m
. Y  V) e% A! u* Z; k  <br clear="all"> 5 Q, ]8 M- u. M* F& W
: v. v  f% U- J  u
  clear: left; / a' ?1 c. l1 Q: B0 n& O

, e& }3 d- \1 ?  clear: right; 2 o+ b0 W' }7 T6 [1 \3 {( Z( ~
. N* j. x+ e# P* Y7 b( Q( q
  clear: both;
& P6 M2 p  o! V& i1 ]" f# O2 K/ o/ q  许多2列或者3列布局都使用 float属性来定位。如果你在浮动层中定义了背景颜色或者背景图片,你可以使用clear属性. " f+ i9 v, C; D  {  n% s

- T& k$ |9 U2 ^# ?, M  cellpadding="3"
0 E% u: v" t! j4 e1 s' u/ e4 Q; s6 u
  vspace="3" 2 v7 A! h4 f" F

; X4 O! L, \* }& a  E2 I; v  hspace="3" padding: 3px; 用CSS,任何元素都可以设定padding属性,同样,padding可以分别设置top, right, bottom and left。padding是透明的。
* S/ t4 V0 ~- h, b& ?/ s* M" S2 j, B6 s4 s6 ^: e
  align="center" text-align: center; ) M8 I1 g: N% g" y
8 V" R/ u6 I" Y# o4 ~7 K
  margin-right: auto; margin-left: auto; 7 E* C, x8 A0 f, C9 E
  Text-align 只适用于文本. " [( X' i2 z3 Y0 ~3 r3 [

) W* ~% w# f& i  象div,p这样的块级可以通过margin-right: auto; 和margin-left: auto;来水平居中
+ M# u  o% ~9 s, p" W' w6 @  J2 Q' a- Q7 l# X& ~0 ~8 B
  一些令人遗憾的技巧和工作环境 " i5 G# @7 F0 k. F) W

& L: M/ N( m% R: K/ g. |& ^. `/ q# @. t. W
由于浏览器对CSS支持的不完善,我们有时候不得不采取一些技巧(hacks)或建立一种环境(Workarounds)来让CSS实现传统方法同样的效 果。例如块级元素有时侯需要使用水平居中的技巧,盒模型bug的技巧等等。所有这些技巧都在Molly Holzschlag的文章《Integrated Web Design: Strategies for Long-Term CSS Hack Management》中有详细说明。9 N3 }! Z# M+ d8 x9 D
  另外一个关于CSS技巧的资源站点是Big John和Holly Bergevin的“Position is Everything”。
* k6 {# \6 k4 _+ a+ H" h' J
. y9 d* r' Z! A$ R  理解浮动行为 4 f3 F0 F" L) `6 K' L
* ?' u1 p0 ]; t' [4 v" J7 @" t
  Eric Meyer的《Containing Floats》将帮助你掌握如何使用float属性布局。float元素有时候需要清除(clear),阅读《How To Clear Floats Without Structural Markup》将非常有帮助。 ) `0 s- Y7 |4 L% `9 a4 S! t* {
& L% v7 @! k' R% }  X+ h. c2 ?/ E
  更多帮助
0 E3 Q; l$ u; g$ L, t
# e. t1 k& T6 I6 i& ?. y  已有的《CSS Discussion》列表是很好的资源,它收集了一个WiKiA讨论组的信息,其中包括CSS布局总结(css- discuss.incutio.com/?page=CssLayouts),CSS 技巧总结 (css-discuss.incutio.com/?page=CssHack) 以及更多。

回复 3# 的帖子

初学者先到 建站交流 版块学习一下吧

TOP

返回列表
【捌玖网络】已经运行: