返回列表 发帖

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

你正在学习CSS布局吗?是不是还不能完全掌握纯CSS布局?通常有两种情况阻碍你的学习: 5 j) u7 @' b% Z, x9 Z! @
8 A* {& t" H7 g  K
  第一种可能是你还没有理解CSS处理页面的原理。在你考虑你的页面整体表现效果前,你应当先考虑内容的语义和结构,然后再针对语义、结构添加CSS。这篇文章将告诉你应该怎样把HTML结构化。 ( Q6 n) x% L  o' [/ K; g

7 b% n' H* M- l3 U  另一种原因是你对那些非常熟悉的表现层属性(例如:cellpadding,、hspace、align="left"等等)束手无策,不知道该转换成对 应的什么CSS语句。 9 d- U7 l  J8 @( R1 i

6 Y! l4 M8 b* @当你解决了第一种问题,知道了如何结构化你的HTML,我再给出一个列表,详细列出原来的表现属性用什么CSS来代替。
$ m+ b- q1 y3 V- _4 p* P8 P" e6 g  J9 a' M7 z9 ]
  结构化HTML
! t! @: [9 ^$ e0 e: Y0 }, f4 k# [" `9 @( \: ?9 K
  我们在刚学习网页制作时,总是先考虑怎么设计,考虑那些图片、字体、颜色、以及布局方案。然后我们用Photoshop或者Fireworks画出来、切割成小图。最后再通过编辑HTML将所有设计还原表现在页面上。 % O7 W, {7 E$ n# B
1 i! y/ F% v4 t
  如果你希望你的HTML页面用CSS布局(是CSS-friendly的),你需要回头重来,先不考虑“外观”,要先思考你的页面内容的语义和结构。 8 V4 j0 e! V/ e' n; O  B. o

$ S. r3 `9 N/ U! O1 g  S  外观并不是最重要的。一个结构良好的HTML页面可以以任何外观表现出来,CSS Zen Garden是一个典型的例子。CSS Zen Garden帮助我们最终认识到CSS的强大力量。 * @0 F* r% _$ N4 V2 l$ s

* W/ ?" M' A' _! r) b  HTML不仅仅只在电脑屏幕上阅读。你用photoshop精心设计的画面可能不能显示在PDA、移动电话和屏幕阅读机上。但是一个结构良好的HTML页面可以通过CSS的不同定义,显示在任何地方,任何网络设备上。
" E' a( {5 u/ ^8 X! W
# @2 o4 s8 c& r. V" A" m( C  开始思考 4 n  i- D9 N2 r5 S
1 i) f/ v" A7 \+ G6 {- k) z& ^

' q* Y' Z6 L+ I# s5 l4 u9 p
! ~  ]! U, J% n9 b; ]4 }+ ]0 M3 `# ^  首先要学习什么是"结构",一些作家也称之为"语义"。这个术语的意思是你需要分析你的内容块,以及每块内容服务的目的,然后再根据这些内容目的建立起相应的HTML结构。 ! c" c" y5 p; n- n5 N8 x4 @" q; \# h
9 [" a5 t0 F6 v
  如果你坐下来仔细分析和规划你的页面结构,你可能得到类似这样的几块: ( @' y, t. A! D' m& ~/ D

& s8 a- E9 z1 I# E, E  标志和站点名称
/ A( c2 ]) D0 N/ _- `2 S: W/ V  主页面内容
* {, }9 M: |! @  站点导航(主菜单) ; a  k* |$ z+ O; }+ s5 C/ b
  子菜单
; |+ {8 P% [* u7 R- c! z  搜索框
1 `2 ?% @6 j# q  n  功能区(例如购物车、收银台)
( ?% H& p/ B/ u, J  Z1 e& r6 n  页脚(版权和有关法律声明)
, j7 F: |2 E% V0 \
8 M, W$ c! t0 L" ?& |0 y" Q6 E4 M7 N( u
  我们通常采用DIV元素来将这些结构定义出来,类似这样:
# e6 H( l0 \& O7 ^7 L
9 r3 X/ `+ S8 q3 I7 e) e5 G6 W  <div id="header"></div> 7 }5 E, C9 o! Y$ `
( T& M! L( r6 n
  <div id="content"></div>
1 G/ C' p+ t) C6 G' s" k) U( }% V5 Y: T/ O" U; T, r0 p) x
  <div id="globalnav"></div> 8 y: F" B1 n2 r- K+ A
( j  h* m4 I0 K0 Q2 J  N. G
  <div id="subnav"></div> ; x5 S5 x* v( x

9 ?+ ~2 V, x. M  <div id="search"></div> 8 \' D; ^, `, O: M' h
' k& T# @: t. k9 X- m5 N
  <div id="shop"></div>
, q! @. Y9 S& ~. b& p  i; T
( Y' }  V- K; [: N. m5 c5 x+ |  <div id="footer"></div> 0 i$ ~: E8 q! M: a; H5 G
0 j9 Y/ r5 }" {; L9 e. {
  这不是布局,是结构。这是一个对内容块的语义说明。当你理解了你的结构,就可以加对应的ID在DIV上。DIV容器中可以包含任何内容块,也可以嵌套另一个DIV。内容块可以包含任意的HTML元素---标题、段落、图片、表格、列表等等。 , g; F' E) L" \7 L7 O& }

4 @0 ^. |, j2 X4 h  根据上面讲述的,你已经知道如何结构化HTML,现在你可以进行布局和样式定义了。每一个内容块都可以放在页面上任何地方,再指定这个块的颜色、字体、边框、背景以及对齐属性等等。
% V; T% F5 P( f0 b9 f% r9 @
2 N4 c( W7 T: C- k5 m  使用选择器是件美妙的事 0 p6 W( s7 T5 a) r( h$ r
id的名称是控制某一内容块的手段,通过给这个内容块套上DIV并加上唯一的id,你就可以用CSS选择器来精确定义每一个页面元素的外观表现,包括标 题、列表、图片、链接或者段落等等。例如你为#header写一个CSS规则,就可以完全不同于#content里的图片规则。
- ]3 S+ ]7 Z7 N! T/ [; Q/ A1 M# l+ j8 d: C( Y' }3 K& E
  另外一个例子是:你可以通过不同规则来定义不同内容块里的链接样式。类似这样:#globalnav a:link或者 #subnav a:link或者#content a:link。你也可以定义不同内容块中相同元素的样式不一样。例如,通过#content p和#footer p分别定义#content和#footer中p的样式。从结构上讲,你的页面是由图片、链接、列表、段落等组成的,这些元素本身并不会对显示在什么网络 设备中(PDA还是手机或者网络电视)有影响,它们可以被定义为任何的表现外观。
. C* O; y6 ]! U1 ]/ b& b9 o# j# [4 D8 V2 [8 d9 q* p
  一个仔细结构化的HTML页面非常简单,每一个元素都被用于结构目的。当你想缩进一个段落,不需要使用blockquote标签,只要使用p标签,并对p 加一个CSS的margin规则就可以实现缩进目的。p是结构化标签,margin是表现属性,前者属于HTML,后者属于CSS。(这就是结构于表现的 相分离.)
- ~: B" L3 E4 J. b# H$ U- y  良好结构的HTML页面内几乎没有表现属性的标签。代码非常干净简洁。例如,原先的代码<table width="80%" cellpadding="3" border="2" align="left">,现在可以只在HTML中写<table>,所有控制表现的东西都写到CSS中去,在结构化的HTML中, table就是表格,而不是其他什么(比如被用来布局和定位)。
  U) c; v  l9 R/ P! |1 b8 P$ \
亲自实践一下结构化 4 }  |2 w3 p9 {! S+ g- f: \
. i3 `9 |% e$ Y0 S( ]) K6 x3 y3 {
  上面说的只是最基本的结构,实际应用中,你可以根据需要来调整内容块。常常会出现DIV嵌套的情况,你会看到"container"层中又有其它层,结构类似这样:
6 s0 N3 K# q' d- e3 a
/ B( A. d* }! X  <div id="navcontainer"> 7 {. [  z. j5 I9 r* x* Y) G4 {

) E! e  o( B/ s" D2 P  <div id="globalnav">
& T' |' V! Y7 _/ ]- [9 ~( K7 Z9 f* h3 Y9 `5 C9 I8 K& o/ ]
  <ul>a list</ul>
' w1 l: A% J3 x" D( n& [5 _6 b& m6 A- s. i! A2 E! c
  </div> ) W  V' V: w) R% q# j
" }9 H, E( W. w9 g" V- |3 G
  <div id="subnav"> : J. p! i- _# l) i( S* K( `
% O6 a  p$ v1 J, ^1 z1 k: Q: E
  <ul>another list</ul> ) f3 S% {1 ~4 O
6 X4 A" O8 v) z
  </div> " H/ O# h- C. y3 n0 o5 \

0 B5 }& _+ A* l8 n' D  </div>
. `" W% I( q- u1 w" y% ]
6 k! ~$ d( A5 w/ g! {1 @9 P  嵌套的div元素允许你定义更多的CSS规则来控制表现,例如:你可以给#navcontainer一个规则让列表居右,再给#globalnav一个规则让列表居左,而给#subnav的list另一个完全不同的表现。
& ]% Y" e1 o$ d$ F5 W- R6 M2 T5 J, F+ d7 J( v
+ j/ o4 I1 I; U  u& V" d
  用CSS替换传统方法 " {( p/ C- D  F& ?# Q2 |
  下面的列表将帮助你用CSS替换传统方法: 6 C% m# g2 }: J* y# Y0 ~, i
& e* i1 N3 N# Z" p. i
  HTML属性以及相对应的CSS方法 7 z# w. q$ F% S
  HTML属性
. P" ?: G% c+ A. b3 Q
9 ?* G! ?- o* v: M& j( H8 p) \! Q8 O' \6 h$ ^
  CSS方法说明
9 f  }3 T$ V6 P  align="left"
) m  G# M# y- u+ H  A
  }% G5 @* \, t5 @  align="right" float: left; 5 M, V9 L. E: u% C9 E
2 V2 H2 V. @/ j0 o- ^' I8 S
  float: right; 使用CSS可以浮动 任何元素:图片、段落、div、标题、表格、列表等等 . n/ `- p: P2 c6 U& E
$ |" @$ e0 J$ u  G  A& |
  当你使用float属性,必须给这个浮动元素定义一个宽度。
' {. ^7 }5 H! V$ ~# v. \- c5 L9 K9 c. K" X  G$ ?' ?/ J& J) b  E# F* |* i
  marginwidth="0" leftmargin="0" marginheight="0" topmargin="0" margin: 0; 使用CSS, margin可以设置在任何元素上, 不仅仅是body元素.更重要的,你可以分别指定元素的top, right, bottom和left的margin值。 & U( v1 {+ H7 B' ?

8 q9 @2 i4 j' |/ d+ u4 v  vlink="#333399" alink="#000000" link="#3333FF" a:link #3ff; 5 W* O6 i5 Q' m' h  q/ Q

, L) o6 e, x7 @& B. b2 S. Y  a:visited: #339; , F% Q9 p+ x6 R# o# i0 i! I
: v6 J9 ?; m% ^, ~8 o# k) [
  a:hover: #999; 1 V, P! h/ k' c) Q6 o9 u, K3 f: H  u

0 t& I: z  b2 G  _! W( j  a:active: #00f; 0 {3 g$ ~8 [" j6 B- c
  在HTML中,链接的颜色作为body的一个属性值定义。整个页面的链接风格都一样。使用CSS的选择器,页面不同部分的链接样式可以不一样。
5 R) L( B, z3 G0 _& f4 F! ?
  C3 c) [- w/ X4 j4 Z. i" {  bgcolor="#FFFFFF" background-color: #fff; 在CSS中,任何元素都可以定义背景颜色,不仅仅局限于body和table元素。
+ U, y8 v4 A/ F: A9 P* ]. q+ [$ M5 O, T$ ^
  bordercolor="#FFFFFF" border-color: #fff; 任何元素都可以设置边框(boeder),你可以分别定义top, right, bottom和left
7 @- x& b4 ^$ ?8 y8 B3 j$ ?+ n9 g- p; K$ I( L3 q8 S
  border="3" cellspacing="3" border-width: 3px; 用CSS,你可以定义table的边框为统一样式,也可以分别定义top, right, bottom and left边框的颜色、尺寸和样式。
% T- j  L% c. E2 M: q( J% X( V
' ]# o% Z; ]+ \7 b  你可以使用 table, td or th 这些选择器. 7 Z" _" W8 M" \# W' n
' {, L; g+ ~3 I- P- U4 Z
  如果你需要设置无边框效果,可以使用CSS定义: border-collapse: collapse;
% y: ]/ C, B5 N% a5 R  Q' x/ B/ k6 ~: I# R+ y6 @
  <br clear="left">
4 J  C& O& |4 H: \$ n  
3 p; s8 ?% i( {' `: i4 u  <br clear="right"> 0 N$ o; H5 S& A
  J  }3 n: U' b( w2 R* h
  <br clear="all">
6 H0 S1 I  g/ K1 I+ o
8 k7 H4 n5 |& m. D$ N  [  clear: left;
/ {1 o5 e, f) E  A
! Z0 e5 P8 \$ K& i* f# W# ?  clear: right;
" p2 a' k/ J# h3 E+ z7 g
; }) m. H. o3 e1 X2 x) ]9 b  clear: both; ; \) f5 r* a2 C+ {7 B3 w( y
  许多2列或者3列布局都使用 float属性来定位。如果你在浮动层中定义了背景颜色或者背景图片,你可以使用clear属性. 9 Y. e( E2 P1 |7 Q  q$ ?6 k+ \* x

$ H8 c3 |' `, B& r2 C% e8 F3 B8 V  Q  cellpadding="3"
* b* [% U: g" j6 m  t/ J  c
9 q7 w3 ~# K6 Y1 A  vspace="3" : w/ o/ N5 X& J# I

7 m' M  f" W( A  hspace="3" padding: 3px; 用CSS,任何元素都可以设定padding属性,同样,padding可以分别设置top, right, bottom and left。padding是透明的。
6 W3 R: E0 ]( z4 W3 P3 a7 \! X& h$ T. h* G
  align="center" text-align: center;
' [* L6 i7 i  ?' g- q
; I! [* h2 L# M% U4 P, C  margin-right: auto; margin-left: auto; 6 v# u/ ?' ~: ?2 L9 `7 L
  Text-align 只适用于文本.
5 O/ f3 C, |7 c" [  j/ ?' u) s1 p/ E
  象div,p这样的块级可以通过margin-right: auto; 和margin-left: auto;来水平居中 ; _4 F* G. {; u4 l4 z& x! `

; B  U% j! r- X9 P  一些令人遗憾的技巧和工作环境 0 x8 E7 q/ I4 w' g& i) Z4 H& n

2 p- e+ S, a4 ?' X8 c
: m0 p/ k. d% S, x) I- Z由于浏览器对CSS支持的不完善,我们有时候不得不采取一些技巧(hacks)或建立一种环境(Workarounds)来让CSS实现传统方法同样的效 果。例如块级元素有时侯需要使用水平居中的技巧,盒模型bug的技巧等等。所有这些技巧都在Molly Holzschlag的文章《Integrated Web Design: Strategies for Long-Term CSS Hack Management》中有详细说明。! ~! v3 D/ M* a* M
  另外一个关于CSS技巧的资源站点是Big John和Holly Bergevin的“Position is Everything”。 + p9 @$ R$ w3 p2 z' g4 p, w, I' n8 z

5 p6 f" \' J2 P  理解浮动行为
! \  P2 u" g) h/ T7 R0 y4 w3 ?$ K3 c, v$ ]6 u6 p
  Eric Meyer的《Containing Floats》将帮助你掌握如何使用float属性布局。float元素有时候需要清除(clear),阅读《How To Clear Floats Without Structural Markup》将非常有帮助。 % E# m" Q5 X/ |/ h+ n- Q

9 ^6 ?2 I1 j2 Q0 P  更多帮助
' E: @2 Q5 [% P1 x* Y( H, s$ C+ J  A5 y) F$ p  l1 c
  已有的《CSS Discussion》列表是很好的资源,它收集了一个WiKiA讨论组的信息,其中包括CSS布局总结(css- discuss.incutio.com/?page=CssLayouts),CSS 技巧总结 (css-discuss.incutio.com/?page=CssHack) 以及更多。

回复 3# 的帖子

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

TOP

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