返回列表 发帖

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

你正在学习CSS布局吗?是不是还不能完全掌握纯CSS布局?通常有两种情况阻碍你的学习:
( z  s8 Y/ k& j9 N, g. r6 X$ G9 w
  第一种可能是你还没有理解CSS处理页面的原理。在你考虑你的页面整体表现效果前,你应当先考虑内容的语义和结构,然后再针对语义、结构添加CSS。这篇文章将告诉你应该怎样把HTML结构化。 ) o# S+ R" w9 ]9 {  p1 C' F
( l2 B/ [# e' z1 f
  另一种原因是你对那些非常熟悉的表现层属性(例如:cellpadding,、hspace、align="left"等等)束手无策,不知道该转换成对 应的什么CSS语句。
3 h; D, o3 q) `$ @
. }8 X8 [& N' V8 V当你解决了第一种问题,知道了如何结构化你的HTML,我再给出一个列表,详细列出原来的表现属性用什么CSS来代替。 - }* f% k" n; f
# U! M* p: f! j6 l  D, l
  结构化HTML
5 a, A5 W& r# u, O& p0 a
: A% R! r" q% B* V8 r  我们在刚学习网页制作时,总是先考虑怎么设计,考虑那些图片、字体、颜色、以及布局方案。然后我们用Photoshop或者Fireworks画出来、切割成小图。最后再通过编辑HTML将所有设计还原表现在页面上。 0 ^3 p2 K! }) Z9 ^3 x5 [; b! ^

, p9 K( w9 @5 _; G( B# |0 k  T& n. W  如果你希望你的HTML页面用CSS布局(是CSS-friendly的),你需要回头重来,先不考虑“外观”,要先思考你的页面内容的语义和结构。 4 I; g. W. x+ C" @
, n% f9 c" |" i+ Z1 c
  外观并不是最重要的。一个结构良好的HTML页面可以以任何外观表现出来,CSS Zen Garden是一个典型的例子。CSS Zen Garden帮助我们最终认识到CSS的强大力量。 ' X2 S' m) L; B$ X" P$ f

+ R; t. l) G  A9 x/ |5 x9 E5 [5 O  HTML不仅仅只在电脑屏幕上阅读。你用photoshop精心设计的画面可能不能显示在PDA、移动电话和屏幕阅读机上。但是一个结构良好的HTML页面可以通过CSS的不同定义,显示在任何地方,任何网络设备上。 " r; ~+ v" W9 K: _  O8 o

6 M# J3 \) V% I7 X( H: W2 V8 H- V  开始思考 , n/ ^% l7 `+ R2 [0 \: U

! F4 a) s: i+ D+ n* s) ~! t& ^, m& ?7 Y

' _3 n$ U  v$ p: K; @2 S  首先要学习什么是"结构",一些作家也称之为"语义"。这个术语的意思是你需要分析你的内容块,以及每块内容服务的目的,然后再根据这些内容目的建立起相应的HTML结构。 " `+ ~& h, g( U/ G8 A0 U# V( I

3 ~$ w! p2 s& i! P: L$ ^& M  如果你坐下来仔细分析和规划你的页面结构,你可能得到类似这样的几块:
; i& j  J7 T9 x3 a
2 Z5 E5 K( @7 p: c3 Y/ q; d% T. _% N  标志和站点名称
" Q  ], y- B+ K7 d5 x* Z  主页面内容 + @. x" i' z/ r  Y
  站点导航(主菜单)
4 I8 i9 j( U7 t$ X- P. u  子菜单 9 }: u2 S7 t( P7 }1 V! O
  搜索框
7 i# w* ^# g" ~! e1 [% {  `  功能区(例如购物车、收银台)
% t9 J( J* H5 O6 P  页脚(版权和有关法律声明)
' L& K" \" K% J+ S: p6 l; h. w
  k0 ~4 T/ k$ J9 T& a$ ?! V
% H, I* I9 a7 O  我们通常采用DIV元素来将这些结构定义出来,类似这样:
* E8 u" h) k1 C8 t
# u/ x# P0 y( A  e: q, Z  <div id="header"></div> 5 D: e5 [+ r2 [) k" \6 t6 E
: }3 M& s* x9 j7 h/ X
  <div id="content"></div> 2 M- {' s5 h0 }6 e
# t+ @. S' M6 J; P. L
  <div id="globalnav"></div> 7 ]/ N3 y: Y8 M* J" m" i
1 j3 ~1 P" \4 [4 ^
  <div id="subnav"></div>
! p( J" w6 [4 `' }5 U* e" S
/ g6 P, N2 }( M  <div id="search"></div> 3 B4 v4 m% c/ X9 |1 j

+ q) T  {- B, I9 o  <div id="shop"></div> , S1 ]4 w' w+ g! Z) D7 Q) m

2 ]. Z8 \  h/ i% `2 g% O! E/ j  <div id="footer"></div>
5 l' J5 |% _! m( A& m; m* ^2 y- }6 a5 z/ s" W& N$ i9 g; \
  这不是布局,是结构。这是一个对内容块的语义说明。当你理解了你的结构,就可以加对应的ID在DIV上。DIV容器中可以包含任何内容块,也可以嵌套另一个DIV。内容块可以包含任意的HTML元素---标题、段落、图片、表格、列表等等。 , x4 ]) b: a+ A8 U! e8 ?2 ]

. z! j* N" X4 r2 m: C) p7 Z  根据上面讲述的,你已经知道如何结构化HTML,现在你可以进行布局和样式定义了。每一个内容块都可以放在页面上任何地方,再指定这个块的颜色、字体、边框、背景以及对齐属性等等。 . ]6 q/ _/ r- j% V7 a% E
" ]' Q: I5 j, X% S
  使用选择器是件美妙的事 0 e4 D0 r# Z4 u( \' N6 A8 B, C6 e
id的名称是控制某一内容块的手段,通过给这个内容块套上DIV并加上唯一的id,你就可以用CSS选择器来精确定义每一个页面元素的外观表现,包括标 题、列表、图片、链接或者段落等等。例如你为#header写一个CSS规则,就可以完全不同于#content里的图片规则。 2 \/ i( C3 ?6 u* `# ]! q* J# I5 y

7 z# `2 J$ d: a" I2 ~  另外一个例子是:你可以通过不同规则来定义不同内容块里的链接样式。类似这样:#globalnav a:link或者 #subnav a:link或者#content a:link。你也可以定义不同内容块中相同元素的样式不一样。例如,通过#content p和#footer p分别定义#content和#footer中p的样式。从结构上讲,你的页面是由图片、链接、列表、段落等组成的,这些元素本身并不会对显示在什么网络 设备中(PDA还是手机或者网络电视)有影响,它们可以被定义为任何的表现外观。
! f8 W0 e: g4 }8 k- W# L5 |; F2 Y0 [: ]- f: N0 e3 T
  一个仔细结构化的HTML页面非常简单,每一个元素都被用于结构目的。当你想缩进一个段落,不需要使用blockquote标签,只要使用p标签,并对p 加一个CSS的margin规则就可以实现缩进目的。p是结构化标签,margin是表现属性,前者属于HTML,后者属于CSS。(这就是结构于表现的 相分离.)
: R0 }8 O7 ^$ F& R) V  良好结构的HTML页面内几乎没有表现属性的标签。代码非常干净简洁。例如,原先的代码<table width="80%" cellpadding="3" border="2" align="left">,现在可以只在HTML中写<table>,所有控制表现的东西都写到CSS中去,在结构化的HTML中, table就是表格,而不是其他什么(比如被用来布局和定位)。 : o$ l' o* f* |! Y: U, d( ~

9 F" I8 h( E- x/ g  J$ w0 j亲自实践一下结构化 6 a6 ?# P. j9 }/ R1 s# h

! x$ l6 Z3 q/ M: Y  k  上面说的只是最基本的结构,实际应用中,你可以根据需要来调整内容块。常常会出现DIV嵌套的情况,你会看到"container"层中又有其它层,结构类似这样: 4 p1 F, A4 o* ]  R( Z, C

3 @6 X/ t5 P8 e( U  v9 L' P7 {  <div id="navcontainer"> ! y% M+ y/ D- L1 A6 d) v7 l
: m0 }8 L$ z7 @: Z2 e# Y
  <div id="globalnav">
8 u+ m. ~! j6 G* W% u
- F# y" z. H: ^  t" _  <ul>a list</ul> ; R/ G- ~* Q6 Y5 Y: d  b$ t, S

" {4 ^+ D7 }; G, H! x. `! h  </div> 9 `- L/ B, }( e4 }1 K  ?  {

! ^, O: \" e, v  <div id="subnav"> + J" T" o+ ?/ t, }

% G- T* h0 q' T+ r4 H  <ul>another list</ul>
- W6 Z2 ?, }2 W/ }2 m7 @% O9 M# U" q0 |$ X, s8 ~" q" m
  </div>
6 {" Z; Q$ `- v0 b: l, [6 S5 p! [7 P1 T6 ]
  </div> 2 Z, p# Y8 r- \, ~3 E8 C6 x/ A
* C! A% _2 M5 y6 a# G  j) v
  嵌套的div元素允许你定义更多的CSS规则来控制表现,例如:你可以给#navcontainer一个规则让列表居右,再给#globalnav一个规则让列表居左,而给#subnav的list另一个完全不同的表现。
6 D) N1 `3 H6 l: @$ `! ]+ }, q; T% J3 I0 I' r' H  k  O) k
8 g% Q  d" I% l4 l9 k7 s
  用CSS替换传统方法
5 i; E6 }. B+ r6 @9 o& {  下面的列表将帮助你用CSS替换传统方法: : k0 R1 P1 v! p* q! ^, j% Z

- X- V: G5 _) Z4 Y7 q9 `! |* h  HTML属性以及相对应的CSS方法
5 |! B$ t, s3 y) v  HTML属性 0 w' V- d7 ]4 s, D

  T/ f' L3 x# L2 i! p9 q" w
/ h- q( i5 x1 g" L  CSS方法说明
: d. Z: a6 h/ z3 r! Q/ [1 v/ r% k& T  align="left" + c* {9 \7 e$ b$ ]4 D
6 t5 ?7 N# @1 @1 V" P& h
  align="right" float: left;
+ D9 q9 X, L+ p& W1 s
" E0 }5 G) e0 Q* Y) S  float: right; 使用CSS可以浮动 任何元素:图片、段落、div、标题、表格、列表等等 0 j! M4 ]' t- {, e. i0 b* m; [5 P% E
: g2 r+ e/ A( N7 A0 [/ j% y4 @# \
  当你使用float属性,必须给这个浮动元素定义一个宽度。
, |! \, W! c1 z4 n1 m* A+ V# `3 o$ U8 e: d6 k  s: m
  marginwidth="0" leftmargin="0" marginheight="0" topmargin="0" margin: 0; 使用CSS, margin可以设置在任何元素上, 不仅仅是body元素.更重要的,你可以分别指定元素的top, right, bottom和left的margin值。
/ m: X! l% r& {- w5 k% [9 [0 [2 y
( V* }& q0 A7 F+ ~' ]) l  vlink="#333399" alink="#000000" link="#3333FF" a:link #3ff;
+ f- s+ n! L* ^* C. C% S; h
1 `( ?: y5 ~; G; D6 \; H2 z# r  a:visited: #339;
4 v2 A2 ?7 V1 x4 ~/ I
& N4 Q. g9 a4 N2 U* e, A* [  a:hover: #999;
& ^  e4 b) k$ ?
$ l3 }5 A0 P6 T/ c% q  a:active: #00f; 4 s6 m) A  z- G, I# @
  在HTML中,链接的颜色作为body的一个属性值定义。整个页面的链接风格都一样。使用CSS的选择器,页面不同部分的链接样式可以不一样。 8 k' g: ~* D5 `2 c
4 w. G2 h: C. r# [3 a
  bgcolor="#FFFFFF" background-color: #fff; 在CSS中,任何元素都可以定义背景颜色,不仅仅局限于body和table元素。
; h! _8 m$ ]; U$ h
: x) ?4 M. U% G) X0 D; G% V6 W  bordercolor="#FFFFFF" border-color: #fff; 任何元素都可以设置边框(boeder),你可以分别定义top, right, bottom和left ( f( Q' @' T* K

$ ^0 U5 j4 e1 G  s" q  border="3" cellspacing="3" border-width: 3px; 用CSS,你可以定义table的边框为统一样式,也可以分别定义top, right, bottom and left边框的颜色、尺寸和样式。
  s& J+ z4 i2 Z9 l' ^6 Y& [' ~% R3 `1 d' J8 C
  你可以使用 table, td or th 这些选择器.
1 v1 O* l0 T4 |; `& }$ W. }& j' J
  如果你需要设置无边框效果,可以使用CSS定义: border-collapse: collapse;
0 X! _' z4 q* r, C! M$ S6 F) n  s: j: N7 ?) @! M! ]2 g9 a8 m- b# K8 c
  <br clear="left">
: H+ ?  q+ f; l+ t  
6 i! E1 Y& w8 [& g& h/ v  <br clear="right"> & p, H1 l) |7 G  b) N

+ Z' c7 D7 u+ A6 T" f. s( y  <br clear="all">
/ c+ p) ]  D+ n1 r, N* g( v8 R4 u5 q, o0 V  _& A+ f$ C% h
  clear: left;
% e/ c/ F2 }) a8 O: }0 w$ @: j2 `0 u  Q
  clear: right; 9 j5 ^7 F% z  M; h: c7 l$ s/ b

1 b# y: `& }6 ]  clear: both;
' u8 i- \0 ]: O9 F2 O  许多2列或者3列布局都使用 float属性来定位。如果你在浮动层中定义了背景颜色或者背景图片,你可以使用clear属性. ! H. e9 l$ L3 p6 ~/ c
. S- \- l5 @9 X
  cellpadding="3" : H* d" r: n( e
; @3 Q5 M: _6 p
  vspace="3" + n8 T- {7 U* z$ U; H
$ M" P4 g% _4 c  E  y
  hspace="3" padding: 3px; 用CSS,任何元素都可以设定padding属性,同样,padding可以分别设置top, right, bottom and left。padding是透明的。 # T' F) I# N( t& z6 x5 W

# |5 W' x$ H' f1 k+ Y  align="center" text-align: center; - u1 ]! p7 K3 u8 c6 a
- L3 M- o/ r& z+ P
  margin-right: auto; margin-left: auto; / e5 k& s: t9 f; x/ y6 K
  Text-align 只适用于文本.
0 l  A1 R7 b8 Y& g. j
* a3 ?; F8 w: H$ |  象div,p这样的块级可以通过margin-right: auto; 和margin-left: auto;来水平居中
; w' s# `; }" F+ l' U( k8 H$ R4 Z" I2 F% |; h" V$ p
  一些令人遗憾的技巧和工作环境
  o9 N1 d  M: F1 r' }: @$ _- e
% Z% c2 f1 ?0 _0 f; R! }1 T, m  p7 [! c9 _5 j/ x- I! q  s! g
由于浏览器对CSS支持的不完善,我们有时候不得不采取一些技巧(hacks)或建立一种环境(Workarounds)来让CSS实现传统方法同样的效 果。例如块级元素有时侯需要使用水平居中的技巧,盒模型bug的技巧等等。所有这些技巧都在Molly Holzschlag的文章《Integrated Web Design: Strategies for Long-Term CSS Hack Management》中有详细说明。
. Z$ p% c  W- q! K; n: p+ a  另外一个关于CSS技巧的资源站点是Big John和Holly Bergevin的“Position is Everything”。 1 q" S- Q% E$ C4 K
3 q$ A3 ], L) L2 G. u  R
  理解浮动行为
3 K' h4 D1 v* U; |+ \; y# V
, T9 j( @5 p" X1 n2 w6 l  Eric Meyer的《Containing Floats》将帮助你掌握如何使用float属性布局。float元素有时候需要清除(clear),阅读《How To Clear Floats Without Structural Markup》将非常有帮助。 / q- _" s6 p: o" g! Z
3 ?4 V! G. Y! \% g1 ~
  更多帮助
' r$ a& ]$ n/ \5 t
4 o4 [3 s1 j8 x; a3 W+ q4 q  已有的《CSS Discussion》列表是很好的资源,它收集了一个WiKiA讨论组的信息,其中包括CSS布局总结(css- discuss.incutio.com/?page=CssLayouts),CSS 技巧总结 (css-discuss.incutio.com/?page=CssHack) 以及更多。

回复 3# 的帖子

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

TOP

看了头都大了啊。我是初学,都不知道从哪入手啊

TOP

现在似乎很流行div+css布局哟 ; [4 q, C3 S* S. z! C7 J0 F
要逐渐的用div取代table布局  好像是table不方便用dom操作

TOP

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