标题:
HTML结构化:DIV+CSS网页布局入门指南
[打印本页]
作者:
admin
时间:
2007-10-6 22:55
标题:
HTML结构化:DIV+CSS网页布局入门指南
你正在学习CSS布局吗?是不是还不能完全掌握纯CSS布局?通常有两种情况阻碍你的学习:
/ [8 w! b' T9 Z+ S. Y+ j
5 b2 x; g5 e: \ [1 ~. u
第一种可能是你还没有理解CSS处理页面的原理。在你考虑你的页面整体表现效果前,你应当先考虑内容的语义和结构,然后再针对语义、结构添加CSS。这篇文章将告诉你应该怎样把HTML结构化。
1 V5 b1 }6 M9 p/ K% h5 W' h
$ j6 i! v5 p9 `
另一种原因是你对那些非常熟悉的表现层属性(例如:cellpadding,、hspace、align="left"等等)束手无策,不知道该转换成对 应的什么CSS语句。
2 N: ]5 d4 E8 u% c/ a& H
0 o% e1 O. b# z: @0 w
当你解决了第一种问题,知道了如何结构化你的HTML,我再给出一个列表,详细列出原来的表现属性用什么CSS来代替。
3 z8 A- v9 s) k) o* J
; u9 p: e6 a) y. ]. J
结构化HTML
; _0 L! P. S; f+ U) p
) ~+ g- W; m/ {8 w% F8 O3 L
我们在刚学习网页制作时,总是先考虑怎么设计,考虑那些图片、字体、颜色、以及布局方案。然后我们用Photoshop或者Fireworks画出来、切割成小图。最后再通过编辑HTML将所有设计还原表现在页面上。
9 [# J- E0 O$ {# K7 x( U" r
; N9 D H' p! X% R1 G) y, z
如果你希望你的HTML页面用CSS布局(是CSS-friendly的),你需要回头重来,先不考虑“外观”,要先思考你的页面内容的语义和结构。
# B+ z5 B. V2 b8 m5 Z) x. L# E5 @
+ k) W& T: }+ r; M0 z) |( I) Z
外观并不是最重要的。一个结构良好的HTML页面可以以任何外观表现出来,CSS Zen Garden是一个典型的例子。CSS Zen Garden帮助我们最终认识到CSS的强大力量。
+ ~# n; A7 ?7 Z6 F' l
5 q. Z; W: S9 c8 S5 j
HTML不仅仅只在电脑屏幕上阅读。你用photoshop精心设计的画面可能不能显示在PDA、移动电话和屏幕阅读机上。但是一个结构良好的HTML页面可以通过CSS的不同定义,显示在任何地方,任何网络设备上。
' a* q/ h2 `; q! x
7 @3 p, u. \) A+ b
开始思考
$ ]) d9 t/ ?& F$ N; o; k; i
7 X; b8 O. K) [& J" z$ u+ v0 O
. h! W, ^$ |& E8 N4 \" v
% B( y" U- E& j
首先要学习什么是"结构",一些作家也称之为"语义"。这个术语的意思是你需要分析你的内容块,以及每块内容服务的目的,然后再根据这些内容目的建立起相应的HTML结构。
5 Y! h0 y' F( I7 C- M
8 a) r2 l6 P, k! a
如果你坐下来仔细分析和规划你的页面结构,你可能得到类似这样的几块:
# _% }: z8 a9 b9 h
. w1 ]9 p" q# l7 t
标志和站点名称
" l# B- L. U0 Y3 ~2 g
主页面内容
8 i+ n5 ?& `: E( B$ } Q
站点导航(主菜单)
: |" a" ~% }! \# d: w
子菜单
9 S+ s D8 v1 I9 ]7 |7 U6 G4 ]4 i) W
搜索框
: @+ `+ I! I5 ^% ?# T
功能区(例如购物车、收银台)
# i( X, e1 Y' Q, |5 X6 F
页脚(版权和有关法律声明)
& ~+ P9 t& g% q
9 z! A* H4 C7 c B1 A# m. j
$ b/ N* K1 n+ B9 H% Y1 J, X/ y6 L
我们通常采用DIV元素来将这些结构定义出来,类似这样:
: G! N0 C& z4 K. m
# I5 ^0 K+ l7 \& n
<div id="header"></div>
, f9 z9 Z" n0 ^/ m( ?. G- I& N' R
1 Z1 y2 E9 M! Z6 ]# m0 l
<div id="content"></div>
8 _9 @, v7 ?. Q: |4 s
8 |7 x1 k) {$ j# Y8 t! L
<div id="globalnav"></div>
1 u5 D+ R1 b" i- o$ H
1 k) ^- i" ^! B" ~4 I& d
<div id="subnav"></div>
4 H+ r" a& M/ J, T. ^5 o: @
" ~, J! d6 k# G5 d: S# h# B& f
<div id="search"></div>
+ K) }8 j, ?: i* a& w; C$ v
: ?+ N* M6 v/ o8 b
<div id="shop"></div>
! t" X) b }+ t1 ?, q
; k6 h E6 \( X% {
<div id="footer"></div>
+ g3 q* X4 y( ^/ V% [
4 B5 J+ a6 N8 I' Z7 E8 w4 r$ t6 e
这不是布局,是结构。这是一个对内容块的语义说明。当你理解了你的结构,就可以加对应的ID在DIV上。DIV容器中可以包含任何内容块,也可以嵌套另一个DIV。内容块可以包含任意的HTML元素---标题、段落、图片、表格、列表等等。
4 G) h: G9 G" V# |
" g( t+ l! g) d2 s) Z# E$ M% r+ k* X
根据上面讲述的,你已经知道如何结构化HTML,现在你可以进行布局和样式定义了。每一个内容块都可以放在页面上任何地方,再指定这个块的颜色、字体、边框、背景以及对齐属性等等。
" |2 p# W+ [7 U. F
+ D$ g. N! v, ?# _2 q5 X
使用选择器是件美妙的事
5 {, d2 \ y0 G1 d1 j2 c% @
id的名称是控制某一内容块的手段,通过给这个内容块套上DIV并加上唯一的id,你就可以用CSS选择器来精确定义每一个页面元素的外观表现,包括标 题、列表、图片、链接或者段落等等。例如你为#header写一个CSS规则,就可以完全不同于#content里的图片规则。
- o; k, A5 G/ `+ K% u" d, e
; q, S5 N7 k8 H" }
另外一个例子是:你可以通过不同规则来定义不同内容块里的链接样式。类似这样:#globalnav a:link或者 #subnav a:link或者#content a:link。你也可以定义不同内容块中相同元素的样式不一样。例如,通过#content p和#footer p分别定义#content和#footer中p的样式。从结构上讲,你的页面是由图片、链接、列表、段落等组成的,这些元素本身并不会对显示在什么网络 设备中(PDA还是手机或者网络电视)有影响,它们可以被定义为任何的表现外观。
5 N! m' L. s) y! x% F6 i
7 E2 ?4 \2 @0 T% a" Z, F. T9 k) ]
一个仔细结构化的HTML页面非常简单,每一个元素都被用于结构目的。当你想缩进一个段落,不需要使用blockquote标签,只要使用p标签,并对p 加一个CSS的margin规则就可以实现缩进目的。p是结构化标签,margin是表现属性,前者属于HTML,后者属于CSS。(这就是结构于表现的 相分离.)
+ u5 J5 E; F1 |% r0 p! ], K* p ]
良好结构的HTML页面内几乎没有表现属性的标签。代码非常干净简洁。例如,原先的代码<table width="80%" cellpadding="3" border="2" align="left">,现在可以只在HTML中写<table>,所有控制表现的东西都写到CSS中去,在结构化的HTML中, table就是表格,而不是其他什么(比如被用来布局和定位)。
) ~* x2 n& u) E2 ?% P
3 u) f; j$ Y5 V1 `- U- B
亲自实践一下结构化
% \. a5 J! ?3 f3 Z u% |
3 c! }% h, R* _
上面说的只是最基本的结构,实际应用中,你可以根据需要来调整内容块。常常会出现DIV嵌套的情况,你会看到"container"层中又有其它层,结构类似这样:
# Z' A1 v1 Z0 O) U0 l1 _: L
: ^4 c6 u7 T6 j
<div id="navcontainer">
. `- s, m, f* O
" l1 W( M% t$ z: F# e
<div id="globalnav">
! H" L( |+ b. m/ _+ c6 n
6 P3 d$ ]( O% j! w' s+ l, _$ K5 G
<ul>a list</ul>
1 ^7 i( R4 U6 s+ ?, G; M7 d4 u3 o
$ X, R& a% k5 b; G
</div>
0 C; \0 z; ?; u* Z# t
9 ~; X: k, r# o& b/ [( Z" A
<div id="subnav">
7 v; R/ W7 S2 Q) O& p5 u# j3 t
/ k# s2 S- V: a+ S% _+ Q
<ul>another list</ul>
) j( [9 L( `: u8 _5 q, t
- t. D; A Q! {0 O" U
</div>
2 ?4 G! T2 k: E6 N) d
. |$ y( q* L5 A
</div>
# ~0 h# x2 N- C/ _
7 l- f" `8 c/ y8 S
嵌套的div元素允许你定义更多的CSS规则来控制表现,例如:你可以给#navcontainer一个规则让列表居右,再给#globalnav一个规则让列表居左,而给#subnav的list另一个完全不同的表现。
! h2 n! H7 a. g! q- l8 O7 E. p! I, X
0 S) o- f+ i& B* A6 \
2 K1 z) c9 x1 B: N+ @* z5 `
用CSS替换传统方法
, N* a( a/ p$ J5 p7 W
下面的列表将帮助你用CSS替换传统方法:
; U9 w1 U7 J |; b% j& {
9 l9 i8 n+ W" l: B/ w" W0 B, G! ]
HTML属性以及相对应的CSS方法
/ L- Z# E& G! ~" F. Q
HTML属性
p9 X+ @) H$ n- C) C
% A2 S& Y+ E. D, [) g
_0 Y1 N# l3 q2 D- x; h2 ]8 u' G
CSS方法说明
) ]! z, H) H9 H& L U
align="left"
/ }, h W- p. \" h6 d) W
# C a ?3 `! i# o7 F" z& Y
align="right" float: left;
: q3 G% T/ H0 D5 ]0 d
" N9 o" ~4 i" a
float: right; 使用CSS可以浮动 任何元素:图片、段落、div、标题、表格、列表等等
* K1 Q9 Q7 |1 F; Z" V! v
" R+ N. b2 g% V' ~ |
当你使用float属性,必须给这个浮动元素定义一个宽度。
3 ?" Z) @" c: R& x
6 `" ~9 U3 J- I4 L l* S. H, Y
marginwidth="0" leftmargin="0" marginheight="0" topmargin="0" margin: 0; 使用CSS, margin可以设置在任何元素上, 不仅仅是body元素.更重要的,你可以分别指定元素的top, right, bottom和left的margin值。
& J+ ^0 j# B8 F1 T
1 P" G- n5 a# N' H$ F3 |% s
vlink="#333399" alink="#000000" link="#3333FF" a:link #3ff;
% a q- U6 e* v, ?4 w- E5 A: L3 u8 x
I7 R& Y- t1 V/ H J1 O) {
a:visited: #339;
8 t! }5 A' f' h3 h1 c, {4 S* r
1 }0 D0 l0 l. m5 Y3 z( ~8 j
a:hover: #999;
; `3 v- r: l6 V
& p4 f- s2 L0 S, i! _1 l4 K
a:active: #00f;
" Q( \% ^' C) t# T/ W" N
在HTML中,链接的颜色作为body的一个属性值定义。整个页面的链接风格都一样。使用CSS的选择器,页面不同部分的链接样式可以不一样。
( t( d: F' O2 d) {! b- I
U) u4 |2 `" K1 r
bgcolor="#FFFFFF" background-color: #fff; 在CSS中,任何元素都可以定义背景颜色,不仅仅局限于body和table元素。
, R" t' Q& c8 }1 h
( S& G" l$ l' F: x$ N
bordercolor="#FFFFFF" border-color: #fff; 任何元素都可以设置边框(boeder),你可以分别定义top, right, bottom和left
7 M$ K2 c' L+ } G5 J, u
5 C, V6 B( d1 z: V
border="3" cellspacing="3" border-width: 3px; 用CSS,你可以定义table的边框为统一样式,也可以分别定义top, right, bottom and left边框的颜色、尺寸和样式。
! A) `5 x' S0 q/ u. i1 c5 B
6 U3 p( {& z1 H, |* v* E
你可以使用 table, td or th 这些选择器.
, C$ W2 @: ~" d3 J
) c1 W6 m8 C5 {* _: r7 w
如果你需要设置无边框效果,可以使用CSS定义: border-collapse: collapse;
% o0 Q8 K0 a5 x7 l ^3 w
6 l; {8 S* ~6 I& x, W a3 {
<br clear="left">
Y1 H/ }! @. P4 j) G/ |
& n- l" R% Y' W, i, I( {/ Q. \
<br clear="right">
* L1 K7 H: T! O3 [6 B" C/ Z7 X
" b: m ?( T$ p2 |4 M6 X: n* F2 z
<br clear="all">
- E8 s: z4 ]" ?: b2 I% u
, D- S: f4 @9 o$ t
clear: left;
1 t9 q# f$ z% `, d3 A2 ^6 N
; | L, K* E- [+ q1 d0 N$ Y
clear: right;
$ N+ s( P8 x- y5 E4 b# o" y
, u% Z- M' R& G1 |4 ~+ f& T
clear: both;
0 X/ r3 c% h* h7 M5 j$ @8 z- h7 Z& P
许多2列或者3列布局都使用 float属性来定位。如果你在浮动层中定义了背景颜色或者背景图片,你可以使用clear属性.
$ u" D! F. [' X D6 h
0 f# C+ I1 S6 d* l
cellpadding="3"
0 y6 J; U* b9 F4 j
& _: S) Y8 [; G4 ?6 D
vspace="3"
+ {: A$ a5 V9 V7 b: \( W' _
5 o: z- z& t' h: K6 T8 P, m) s
hspace="3" padding: 3px; 用CSS,任何元素都可以设定padding属性,同样,padding可以分别设置top, right, bottom and left。padding是透明的。
: t" l) i' u" _2 a
- l l! i6 N) p( k# V9 n& U) Y
align="center" text-align: center;
. v* k u* X% L
1 E8 ^' C+ U9 D i% k& L4 G2 ?
margin-right: auto; margin-left: auto;
( `9 [/ M# P9 I$ i- A/ p! ~/ K3 x7 g& B
Text-align 只适用于文本.
6 b8 |+ m1 ]4 M' q( n3 Q! o, ?
- j3 g/ J" p' C
象div,p这样的块级可以通过margin-right: auto; 和margin-left: auto;来水平居中
7 X- m$ N$ Z, f* K/ d
# j9 N& W3 t; H
一些令人遗憾的技巧和工作环境
6 \ N3 w. _8 N5 ?% d& U* O7 k4 _6 d
! X; s7 h+ _, ?- [3 k" W
r& Z4 ?5 J* }) e
由于浏览器对CSS支持的不完善,我们有时候不得不采取一些技巧(hacks)或建立一种环境(Workarounds)来让CSS实现传统方法同样的效 果。例如块级元素有时侯需要使用水平居中的技巧,盒模型bug的技巧等等。所有这些技巧都在Molly Holzschlag的文章《Integrated Web Design: Strategies for Long-Term CSS Hack Management》中有详细说明。
: e" j' }( I, \5 C/ M
另外一个关于CSS技巧的资源站点是Big John和Holly Bergevin的“Position is Everything”。
K! Z( k' V8 w: G' a/ S7 J5 H4 _
' M+ R6 n4 T9 t: @
理解浮动行为
- z) e2 L% `: M% _# b+ ]# S/ f
# D6 w' q, D7 f+ \. w. i/ ^
Eric Meyer的《Containing Floats》将帮助你掌握如何使用float属性布局。float元素有时候需要清除(clear),阅读《How To Clear Floats Without Structural Markup》将非常有帮助。
1 G0 Q, f+ x+ S$ G( k
. f/ x2 c: H2 l) ]
更多帮助
, J9 `+ { u# ]& |( ]- { T
# S8 E9 A4 S* y4 T2 y
已有的《CSS Discussion》列表是很好的资源,它收集了一个WiKiA讨论组的信息,其中包括CSS布局总结(css- discuss.incutio.com/?page=CssLayouts),CSS 技巧总结 (css-discuss.incutio.com/?page=CssHack) 以及更多。
作者:
伪装淑男
时间:
2007-10-7 19:54
现在似乎很流行div+css布局哟
! v: o5 K, Y( y
要逐渐的用div取代table布局 好像是table不方便用dom操作
作者:
love
时间:
2007-11-3 23:18
看了头都大了啊。我是初学,都不知道从哪入手啊
作者:
admin
时间:
2007-11-4 09:05
标题:
回复 3# 的帖子
初学者先到 建站交流 版块学习一下吧
欢迎光临 捌玖网络工作室 (http://www.89w.org/)
Powered by Discuz! 7.2