|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
你正在学习CSS布局吗?是不是还不能完全掌握纯CSS布局?通常有两种情况阻碍你的学习:
7 t' N6 |( V3 E' V3 o: W2 C
4 x) F4 Z$ e/ w, h' ? 第一种可能是你还没有理解CSS处理页面的原理。在你考虑你的页面整体表现效果前,你应当先考虑内容的语义和结构,然后再针对语义、结构添加CSS。这篇文章将告诉你应该怎样把HTML结构化。
' M' g2 y; v$ \: m" Z) L
9 Q4 q5 M1 h1 u9 t K, l$ n 另一种原因是你对那些非常熟悉的表现层属性(例如:cellpadding,、hspace、align="left"等等)束手无策,不知道该转换成对 应的什么CSS语句。
k9 X9 j% J7 U: \3 Q4 ]/ f; ^+ b- [6 \# F6 h, O, t
当你解决了第一种问题,知道了如何结构化你的HTML,我再给出一个列表,详细列出原来的表现属性用什么CSS来代替。
/ [' j$ v/ J6 ^0 W* r$ E b, L/ Z# `$ j$ O
结构化HTML
% H; m( M' q7 o/ b" s0 c. g2 o$ [: Y" M
我们在刚学习网页制作时,总是先考虑怎么设计,考虑那些图片、字体、颜色、以及布局方案。然后我们用Photoshop或者Fireworks画出来、切割成小图。最后再通过编辑HTML将所有设计还原表现在页面上。 1 x) a% S* }# p- c8 p3 z4 E# I
' P, ~! v, O+ I6 Y
如果你希望你的HTML页面用CSS布局(是CSS-friendly的),你需要回头重来,先不考虑“外观”,要先思考你的页面内容的语义和结构。
5 R+ p% y# {9 L
8 G+ s2 `: u- f- {" [: q, v 外观并不是最重要的。一个结构良好的HTML页面可以以任何外观表现出来,CSS Zen Garden是一个典型的例子。CSS Zen Garden帮助我们最终认识到CSS的强大力量。
$ i: x1 `% S! H* \
+ t0 e: d7 x! k- ?) U% C HTML不仅仅只在电脑屏幕上阅读。你用photoshop精心设计的画面可能不能显示在PDA、移动电话和屏幕阅读机上。但是一个结构良好的HTML页面可以通过CSS的不同定义,显示在任何地方,任何网络设备上。
6 k2 r @0 ?7 [4 i+ Y2 \& s4 n- D& i# R# {$ u0 I W# c
开始思考 8 P( _# n" s8 u6 ?4 i) q- [3 X# v+ r
8 C9 b; R! G$ g1 F7 P0 y
4 c0 Z6 L- h$ R* q8 j
! g- W3 Y- Q; A9 I6 B- p6 v& y
首先要学习什么是"结构",一些作家也称之为"语义"。这个术语的意思是你需要分析你的内容块,以及每块内容服务的目的,然后再根据这些内容目的建立起相应的HTML结构。
# q5 p+ n7 h) Y& X. y
6 e8 z) i& Z1 u- e: J2 [5 c- j% ? 如果你坐下来仔细分析和规划你的页面结构,你可能得到类似这样的几块:
3 e8 P, g% S% G
4 ?6 a8 p$ M9 F 标志和站点名称 , \; _! p \9 ?) g4 ^
主页面内容
! i) m6 ?5 U6 m" f0 q* s ~ 站点导航(主菜单) , [& t' c q3 A) V& |9 Q
子菜单
9 Z2 k% {8 q- y9 e 搜索框
+ W2 i3 w" r0 c9 z 功能区(例如购物车、收银台) 5 Q1 w: v& P* f3 [0 U1 m; U
页脚(版权和有关法律声明)
3 Q/ e6 s8 z6 i/ a, Q0 C3 O5 h2 v, Q9 [9 | K" b5 i) v/ e
$ l j7 M0 `3 k. M5 h/ ]
我们通常采用DIV元素来将这些结构定义出来,类似这样: k& G; v; @4 \2 p
, U* ]# r8 i, @3 m! R1 y7 k& F <div id="header"></div> 5 a( W3 B) m0 S& n
, ]! X5 h7 K$ _8 s+ A' j <div id="content"></div>
5 ^" S! o% w* n8 ~
4 U5 ]0 L3 y; J- v2 |7 H <div id="globalnav"></div> " {. k6 G0 N1 s x
# P- C2 P/ H% C& {9 I <div id="subnav"></div> 4 C6 z0 \7 \1 E, y4 x+ Z
" a" h" W7 c5 T) \) t0 @+ D! N
<div id="search"></div>
* j% Y' ? [/ U: W) {+ T
8 ` Y8 S8 M$ P, v' p! k% K <div id="shop"></div>
5 o2 `$ k& K V* V# i
! j" M9 s. a9 g- K( d4 Y <div id="footer"></div> ) \% \" p, i7 d; k
; z# v6 R3 u6 \4 ~6 ]4 G 这不是布局,是结构。这是一个对内容块的语义说明。当你理解了你的结构,就可以加对应的ID在DIV上。DIV容器中可以包含任何内容块,也可以嵌套另一个DIV。内容块可以包含任意的HTML元素---标题、段落、图片、表格、列表等等。 # N1 T; F9 C& R2 [' s) J9 x5 ^
) k3 o$ D. V+ Q' O* j
根据上面讲述的,你已经知道如何结构化HTML,现在你可以进行布局和样式定义了。每一个内容块都可以放在页面上任何地方,再指定这个块的颜色、字体、边框、背景以及对齐属性等等。 ! a5 d7 C: R5 t. s9 s$ }
: t: k0 K( J1 | s; Z; [$ P 使用选择器是件美妙的事
, J& u- e1 M7 K0 `id的名称是控制某一内容块的手段,通过给这个内容块套上DIV并加上唯一的id,你就可以用CSS选择器来精确定义每一个页面元素的外观表现,包括标 题、列表、图片、链接或者段落等等。例如你为#header写一个CSS规则,就可以完全不同于#content里的图片规则。 0 F \+ K+ O/ u! i% `. K
+ i6 R' E$ T) S# J# }) N* S. w: V8 L
另外一个例子是:你可以通过不同规则来定义不同内容块里的链接样式。类似这样:#globalnav a:link或者 #subnav a:link或者#content a:link。你也可以定义不同内容块中相同元素的样式不一样。例如,通过#content p和#footer p分别定义#content和#footer中p的样式。从结构上讲,你的页面是由图片、链接、列表、段落等组成的,这些元素本身并不会对显示在什么网络 设备中(PDA还是手机或者网络电视)有影响,它们可以被定义为任何的表现外观。 6 z: W w F& a5 O/ C
4 j) m n7 k' W/ F( h/ H 一个仔细结构化的HTML页面非常简单,每一个元素都被用于结构目的。当你想缩进一个段落,不需要使用blockquote标签,只要使用p标签,并对p 加一个CSS的margin规则就可以实现缩进目的。p是结构化标签,margin是表现属性,前者属于HTML,后者属于CSS。(这就是结构于表现的 相分离.)8 w- \$ |: l, m& y5 C. F
良好结构的HTML页面内几乎没有表现属性的标签。代码非常干净简洁。例如,原先的代码<table width="80%" cellpadding="3" border="2" align="left">,现在可以只在HTML中写<table>,所有控制表现的东西都写到CSS中去,在结构化的HTML中, table就是表格,而不是其他什么(比如被用来布局和定位)。
( J( e$ Z- g" H+ S5 w* p* h# S/ ^2 }; s& o9 o: T6 v* v8 Q% ~$ x
亲自实践一下结构化
8 U: g3 k, ^" z# `7 O6 W
1 g4 ?) ]& X- N& D* f: P% D5 e 上面说的只是最基本的结构,实际应用中,你可以根据需要来调整内容块。常常会出现DIV嵌套的情况,你会看到"container"层中又有其它层,结构类似这样: ! t- z) c' z: g7 b7 S
5 l+ D2 W9 Q; E$ r
<div id="navcontainer">
- d) W' _! F" C" N0 w5 K
5 @- X& v" o/ v& d1 S <div id="globalnav">
$ j' i1 ?" | N* l# _: q) w. Z' e: m# v; x p
<ul>a list</ul>
3 d7 y1 g$ i& r. z$ Z# j8 J: B5 p% p8 A- Y* l6 Q7 R
</div>
: S$ [% ]* {, ?8 F+ D2 c+ h+ B: h1 J* h# l
<div id="subnav">
A8 ^: `6 Z/ t' l; t
0 j" l$ E8 K$ |5 T- q <ul>another list</ul> % o) }5 z5 g8 U& _+ u5 a
4 h g" K( F4 _$ ]. W </div>
" F% Q; H, V; e p
0 j; ~6 W; E! P </div>
0 |0 G. R- _& {0 k
% R( }+ S0 m- ~8 m& q8 ` 嵌套的div元素允许你定义更多的CSS规则来控制表现,例如:你可以给#navcontainer一个规则让列表居右,再给#globalnav一个规则让列表居左,而给#subnav的list另一个完全不同的表现。
5 M0 n; T$ u0 M2 v- C9 j/ s0 B" t
1 ?+ b2 h' H* V/ M1 w
$ j& d; P; [- F7 ` 用CSS替换传统方法 ) ^0 d- c* I& e9 d# V& M8 p
下面的列表将帮助你用CSS替换传统方法:
) I" K6 D6 z( J4 |( n* J* l! l) V0 G: b
HTML属性以及相对应的CSS方法 7 k. m, N8 B" a& W4 T
HTML属性 % ~- e4 p; r' {5 d2 @
9 t2 _$ j6 K$ L3 E$ @4 M1 ~' J0 i
9 L& H, l3 k7 U7 y CSS方法说明 * M$ A& R6 {& D- e0 g. b
align="left" " p5 q2 P; B. ?. @& q6 |
. o ^+ V$ Y2 g' r9 d; O
align="right" float: left;
: v5 h- ]. `$ Q6 H0 J$ G. t- U8 {" B q) y7 x3 j. q3 G8 ~
float: right; 使用CSS可以浮动 任何元素:图片、段落、div、标题、表格、列表等等
2 ^* b$ W1 l4 \; Q8 F2 t* x3 A
" ?6 a* g5 q6 W5 l% `) c6 d; l 当你使用float属性,必须给这个浮动元素定义一个宽度。 4 J8 m6 K- z& u9 A
' A0 ?) m4 i: Q* B
marginwidth="0" leftmargin="0" marginheight="0" topmargin="0" margin: 0; 使用CSS, margin可以设置在任何元素上, 不仅仅是body元素.更重要的,你可以分别指定元素的top, right, bottom和left的margin值。
- e* [0 c: ^2 Y: n9 Q" j
# J! E+ K& z1 F0 b# \( @2 r; s' K vlink="#333399" alink="#000000" link="#3333FF" a:link #3ff;
Z/ \! A: m- {2 X- k% V+ Y: ~. I& |1 k
a:visited: #339; ; z! e' ^2 ]. X. p
& y& i7 j7 |4 ~; A. n8 k0 U a:hover: #999; , t; ?* K2 ]2 j$ y t
/ W' `% _! C) C- F, B
a:active: #00f;
3 t% d" l; n8 |& k 在HTML中,链接的颜色作为body的一个属性值定义。整个页面的链接风格都一样。使用CSS的选择器,页面不同部分的链接样式可以不一样。 }5 D* P7 ?0 U3 P1 y
' {* B! Q N" x/ H( }
bgcolor="#FFFFFF" background-color: #fff; 在CSS中,任何元素都可以定义背景颜色,不仅仅局限于body和table元素。 , ~ g+ O) N- D0 Q7 K
7 A: h3 \+ H5 i2 O ` d4 t bordercolor="#FFFFFF" border-color: #fff; 任何元素都可以设置边框(boeder),你可以分别定义top, right, bottom和left
+ o7 i, u! L1 ^: F" W0 i# {9 n
! P8 u- O2 I4 ~1 [# y! }9 } border="3" cellspacing="3" border-width: 3px; 用CSS,你可以定义table的边框为统一样式,也可以分别定义top, right, bottom and left边框的颜色、尺寸和样式。
" ]# j" U4 M7 f; g+ \( `% c- [0 }5 H8 v! e% h- p
你可以使用 table, td or th 这些选择器.
5 I$ K) M8 x9 M& s7 O; G+ U" j( L/ {. F \, R$ l0 B! a
如果你需要设置无边框效果,可以使用CSS定义: border-collapse: collapse; 5 b r3 C- e [1 E/ ~* o
" W$ P% i) k/ }
<br clear="left"> ' z6 }6 M3 g" D. T- x& U& W! N
2 |, R+ _9 S2 Y7 D! Z
<br clear="right">
) A$ p! h$ K- ?3 D
( P" q$ W1 I6 v: ]/ ~' ^" A <br clear="all"> & f7 R5 o: [& q* ?& N0 t. h
! j2 Y7 H1 B% L9 X( n \ clear: left;
4 v6 c$ G% u% ?' l: l* X* e( S+ m) H, S4 K' G6 Y
clear: right; 9 |; g& |/ c$ a+ D5 ^# u
; p; H8 Y" o; f& X" F) _/ U5 J
clear: both; # u& z. F/ D/ P0 g) v; P3 y
许多2列或者3列布局都使用 float属性来定位。如果你在浮动层中定义了背景颜色或者背景图片,你可以使用clear属性.
$ E1 |6 A! x5 Z) E
) M5 l: M6 Z) [ cellpadding="3"
% h0 t& ~/ u' \
+ T- {' r2 c; W7 R vspace="3" " D4 Q! _/ Q8 v7 ]
! B$ O3 U8 G0 ~8 j0 H
hspace="3" padding: 3px; 用CSS,任何元素都可以设定padding属性,同样,padding可以分别设置top, right, bottom and left。padding是透明的。
( H c- c$ |1 b" Y$ f9 G4 J6 m. e, Q' \' n) \6 I9 g
align="center" text-align: center;
) A9 v' u- H2 t- i% |. f% F& V ^2 S5 r1 K
margin-right: auto; margin-left: auto; ! o% o( X+ x" o t4 d6 M4 @
Text-align 只适用于文本.
: \) Z# I( @" v
# u6 u% z& g* i/ W' F 象div,p这样的块级可以通过margin-right: auto; 和margin-left: auto;来水平居中
4 z" u% s! k/ J% L# P
5 E, L$ H/ m) ?; g: p4 L0 @6 l. \ 一些令人遗憾的技巧和工作环境
2 z# p7 p ~+ i7 T: g" y3 c6 x+ w. q* Y4 F
6 B* o J X) A& b由于浏览器对CSS支持的不完善,我们有时候不得不采取一些技巧(hacks)或建立一种环境(Workarounds)来让CSS实现传统方法同样的效 果。例如块级元素有时侯需要使用水平居中的技巧,盒模型bug的技巧等等。所有这些技巧都在Molly Holzschlag的文章《Integrated Web Design: Strategies for Long-Term CSS Hack Management》中有详细说明。
5 L0 S" [7 V( y2 |" b; T 另外一个关于CSS技巧的资源站点是Big John和Holly Bergevin的“Position is Everything”。
! F$ u4 m. U# N1 G
2 i# ?2 C7 Y( B& g 理解浮动行为
/ x3 C- c3 t5 K. E7 h. X; y2 l
5 m2 u. m% U3 j! O0 c& s$ c Eric Meyer的《Containing Floats》将帮助你掌握如何使用float属性布局。float元素有时候需要清除(clear),阅读《How To Clear Floats Without Structural Markup》将非常有帮助。
( E3 c8 ]- q8 X! N+ n2 g. C& X" o+ K6 |: @$ _4 @
更多帮助
% s8 B: T% t+ d! [
# X$ y9 y6 c/ L. A& z$ D" O- r6 h2 H 已有的《CSS Discussion》列表是很好的资源,它收集了一个WiKiA讨论组的信息,其中包括CSS布局总结(css- discuss.incutio.com/?page=CssLayouts),CSS 技巧总结 (css-discuss.incutio.com/?page=CssHack) 以及更多。 |
|