制作网页时手写CSS应该注意的一点技巧
1. CSS字体属性简写规则 + I" P8 h5 |& W( C' G. m
一般用CSS设定字体属性是这样做的:
/ }( P5 i- A; u; M" `- j; n+ N1 ^* N% `: ]+ w
font-weight: bold;
) d# c1 U8 _8 ?7 t9 O3 Z. efont-style: italic;% a* {7 X# L7 U5 c& l9 [! E& g
font-varient: small-caps;
/ G s' T% [. Zfont-size: 1em;
$ a$ v4 H, \0 [! [line-height: 1.5em;# f5 r: p& o- w- u0 e6 R
font-family: verdana,sans-serif
; i* `, g' l6 D% ~5 I3 V
4 f: U0 `' z5 q$ ^# b# @但也可以把它们全部写到一行上去:" N5 e( S% k, ]
7 a2 O& `- H n3 F- n# y& H
font: bold italic small-caps 1em/1.5em verdana,sans-serif
6 P, {& X0 X, N: A9 o2 l6 |# f2 L. w: f! L) }4 ^
真不错!只有一点要提醒的:这种简写方法只有在同时指定font-size和font-family属性时才起作用。而且,如果你没有设定font-weight, font-style, 以及 font-varient ,他们会使用缺省值,这点要记上。1 P. \0 }( b$ c9 t; `
: r! \% ^3 p' W6 Q2. 同时使用两个类, h$ v2 y) |9 b' e- o1 R7 \+ l
8 ?# T8 ?' D/ }1 `7 {# v# G$ p6 g
一般只能给一个元素设定一个类(Class),但这并不意味着不能用两个。事实上,你可以这样:+ A; N- h/ h, C. M
8 M6 q9 I! A% W& P0 T<p class="text side">...</p>8 A6 T# {. T+ x( V) e9 R
) X, j( }/ @% ?2 Z) e( I
同时给P元素两个类,中间用空格格开,这样所有text和side两个类的属性都会加到P元素上来。如果它们两个类中的属性有冲突的话,后设置的起作用,即在CSS文件中放在后面的类的属性起作用。- U+ S. y& R- c2 e9 i
& ~) C% X! J5 N0 p! y3. CSS border的缺省值! V+ s+ J+ t8 b1 n/ b
; B: {" @3 d% U W+ s0 ~$ Z7 g5 k
通常可以设定边界的颜色,宽度和风格,如:; y; r& J- ~2 U& v1 c
% d |1 e+ {) }' `: X& }9 J6 Eborder: 3px solid #000
2 h9 Q, \" b( e- U: f; I$ V4 Z/ N) l) B7 {
这位把边界显示成3像素宽,黑色,实线。但实际上这里只需要指定风格即可。
% q; T$ M& h$ ^1 y7 p2 _/ L. Z$ X" W2 k1 o# o
如果只指定了风格,其他属性就会使用缺省值。一般地,Border的宽度缺省是medium,一般等于3到4个像素;缺省的颜色是其中文字的颜色。如果这个值正好合适的话,就不用设那么多了。
9 m* ]/ ^. M4 d, m' _6 Y
+ j% O6 a& g; z: L/ W. [+ P4. CSS用于文档打印
. y L0 _' K/ ^8 L, ?* T
; Q7 c9 A1 ^ H! ?. z# @许多网站上都有一个针对打印的版本,但实际上这并不需要,因为可以用CSS来设定打印风格。
( \$ W3 u# ^, L: {( K4 Y) `1 L: x& q
也就是说,可以为页面指定两个CSS文件,一个用于屏幕显示,一个用于打印:5 P% n$ q0 p9 w" a
. h" `: n4 T& H8 y- e+ t: A3 G' K8 y
<link type="text/css" rel="stylesheet" href="stylesheet.css" media="screen" />3 k% q2 w+ l: _( a
" [; ^4 y6 w5 E) _; P, d4 G<link type="text/css" rel="stylesheet" href="printstyle.css" media="print" />
8 o6 U$ u$ ^* b- I8 F8 H
9 [6 K1 A/ i) U7 j! v& C. s. ?第1行就是显示,第2行是打印,注意其中的media属性。
. |7 }7 k8 u9 J! z' p' G: L) P# }1 _1 T* q1 ^
但应该在打印CSS中写什么东西呢?你可以按设计普通CSS的方法来设定它。设计的同时就可以把这个CSS设成显示CSS来检查它的效果。也许你会使用 display: none 这个命令来关掉一些装饰图片,再关掉一些导航按钮。要想了解更多,可以看“打印差异”这一篇。
/ a ^& r9 F0 K) V4 Y% j9 Y
+ y) ~; ~6 M; I1 g) U5. 图片替换技巧; s N0 E* f' w$ m9 L; u7 ]
/ a1 u3 ?% ]/ v* g
一般都建议用标准的HTML来显示文字,而不要使用图片,这样不但快,也更具可读性。但如果你想用一些特殊字体时,就只能用图片了。
: a, o* R' M) A' [9 I5 v8 X# X6 w2 F& u, ^0 t1 M w
比如你想整个卖东西的图标,你就用了这个图片:
: P' _1 i0 S" s9 a, ^* {* m+ h3 ]! N- G9 W: i7 K+ W+ r
<h1><img src="widget-image.gif" alt="Buy widgets" /></h1>
: U1 W3 v& i, ?+ @3 r1 l9 G# F' g9 Q* b8 n
这当然可以,但对搜索引擎来说,和正常文字相比,它们对alt里面的替换文字几乎没有兴趣这是因为许多设计者在这里放许多关键词来骗搜索引擎。所以方法应该是这样的:8 T7 x# Z6 f: `
' V/ G3 v" B1 C: I" w/ N
<h1>Buy widgets</h1>1 v) }5 F2 a! U2 N
) H; z- z; `; @7 K. p/ F* s但这样就没有特殊字体了。要想达到同样效果,可以这样设计CSS:: H; X+ {5 C/ h1 \# [, K9 E2 \
- t) C" l; e7 ]
h1
5 a$ [. Q8 ?+ h1 m- E9 Z{
4 q; Z6 _4 L/ U$ U8 c, Z& L9 Jbackground: url(widget-image.gif) no-repeat;2 R& W" L) F7 J0 v
height: image height) z, P8 C6 l0 E0 [$ N$ G
text-indent: -2000px
. K1 M5 k, o2 ~. ?1 t+ ^}; h! A' z; f! H
( G! x0 e/ j! D$ z
注意把image height换成真的图片的高度。这里,图片会当作背景显示出来,而真正的文字由于设定了-2000像素这个缩进,它们会出现在屏幕左边2000点的地方,就看不见了。但这对于关闭图片的人来说,可能全部看不到了,这点要注意。
" r6 @ l/ p6 I2 e& O( m6 z& @5 k; `
6. CSS box模型的另一种调整技巧+ }- E* {8 _1 w1 E W* B; x" M" l* ?
$ S1 t- n! A: S% q! r" T. t这个Box模型的调整主要是针对IE6之前的IE浏览器的,它们把边界宽度和空白都算在元素宽度上。比如:. Y6 b. s- T% T M' }9 O
* r0 ~8 \) f1 C( y9 i% _
#box( m$ h. y0 M/ K9 X
{! _' d, o) Z3 ^* J" j5 e
width: 100px;
+ G Q: c6 p0 i4 K# u% Eborder: 5px;0 f# D. Y* C J' B% i) K
padding: 20px( A. C( u: Q' h) A) u
}# A$ ?9 r' f$ a/ Z$ W" @3 X' w
! o4 _" C5 g6 `' _这样调用它:. r$ Y. a* {1 y$ @% x. Y+ S
3 z p/ G8 a5 `$ `8 n8 Q; }: }+ q
<div id="box">...</div>' O) J3 {/ U- ]) M, f/ |6 d5 H6 w
' I; i# K9 u! K4 Q; c这时盒子的全宽应该是150点,这在除IE6之前的IE浏览器之外的所有浏览器上都是正确的。但在IE5这样的浏览器上,它的全宽仍是100点。可以用以前人发明的Box调整方法来处理这种差异。
. s! |+ B; n& s" r" P6 d. _7 H
但用CSS也可以达到同样的目的,让它们显示效果一致。* b+ N; f; ?5 b3 ?' w z) l8 Q
- d& @ S$ ]* T$ |% {& T: K
#box
' j( P: W6 q# o2 f{
, ^% P3 g1 U" e5 kwidth: 150px5 u6 w3 p6 I* Y( O: \2 Q
}( M) ^* \# {! ~; e) r
! l3 S& e0 Q# c6 _& ~& u( t* T#box div
' @7 [9 x0 J9 @: K9 n{; Q$ H9 w$ V8 h2 N
border: 5px;
( j( e+ K' a9 V8 Z. `padding: 20px* r3 d: j, A2 R! L# K
}
0 `, X! E! H( R' N e, ]! M
0 M/ C. ~% W9 ]) }这样调用:
5 n# z2 p, T6 i) d9 K! [8 `) B( Y% p/ R/ l3 |4 K2 }+ e; Y5 q
<div id="box"><div>...</div></div>
( H1 ~( L9 ?3 ~8 `' k5 {6 H' y ^4 v6 |& S6 z3 ]% z2 U* Y" F' P8 y
这样,不管什么浏览器,宽度都是150点了。
5 h: N Z& }6 G) y, d( ~
* b& Z, D0 r2 Y; r9 W9 q2 M7. 块元素居中对齐) @% _0 C$ u: G1 o z9 D. ^
' b, n, | n# Q# G% X# P如果想做个固定宽度的网页并且想让网页水平居中的话,通常是这样:! U8 z# V, [6 F+ {7 g, o- n
8 S$ Q! T4 \% C' N7 A5 y
#content8 X5 p- I4 c' ~9 b) G; O) U
{
& f4 s* i' o8 U5 l* t, Wwidth: 700px;- k9 b1 @- j- b' l% F
margin: 0 auto
! E! @3 I4 v! j}! e9 s. S. T/ W" q) g( Q# u
" @! H8 v7 }' h3 h* u; g+ D& R1 Q你会使用 <div id="content"> 来围上所有元素。这很简单,但不够好,IE6之前版本会显示不出这种效果。改CSS如下:
5 Z5 G5 M( N( d" c$ f1 B, @/ D6 |) @, k0 ?) s/ ]
body0 r4 o9 i, g0 L( a7 |. ]; ~
{
5 [* u1 W: {( P. D: x. Atext-align: center
9 @4 Y( Y; g/ u" d/ g1 u}
, e* @" x5 g( n8 W& x' N: P1 o: [: o8 B
) q. y$ w: n/ V! M9 o9 @1 N' h#content* M1 \' `% U7 |4 J
{
2 g) o. E+ v; I& r3 Xtext-align: left;
' q/ f, w! ^6 J# @7 [9 l& J" Dwidth: 700px;8 h0 H- ]' z4 w, Y i
margin: 0 auto% @* B3 }( C6 V1 S6 J
}$ C! A- o* s# ?9 L
8 `( W! A9 h& e5 t" f: k这会把网页内容都居中,所以在Content中又加入了
6 U1 O, k! I n" r: h2 n+ jtext-align: left 。
! z0 B- C* H& Q' ?; ]1 Z! T6 @2 H4 \7 @9 G
8. 用CSS来处理垂直对齐
! i7 M& L" l' \9 B; O. ~3 {4 Y" J1 Z) I: z3 ?
垂直对齐用表格可以很方便地实现,设定表格单元 vertical-align: middle 就可以了。但对CSS来说这没用。如果你想设定一个导航条是2em高,而想让导航文字垂直居中的话,设定这个属性是没用的。; q, ~& g/ {9 o% G6 p. A; T3 Y
. ]% q& A- ~$ y r
CSS方法是什么呢?对了,把这些文字的行高设为 2em:line-height: 2em ,这就可以了。6 w% j5 q/ @- M2 k+ V. v0 ]
2 d4 z% F, M) Z( V; U" P O w9. CSS在容器内定位
# R6 U8 b: d; J( X" [- `. X) [" d# w1 t
CSS的一个好处是可以把一个元素任意定位,在一个容器内也可以。比如对这个容器:& t, ?5 z" E- C+ `
c2 k$ E, L3 F7 q, ]
#container
. D' F; K+ Z X4 c% d3 D{& B5 O; N1 A: S. e
position: relative
( Q; S5 B; k9 X1 Y! x- g; p- z}/ N, M) k- S; B8 ~& u# w
2 l. t! D1 o, S: g, r# x
这样容器内所有的元素都会相对定位,可以这样用:
l- u% Y/ |6 u% s' o& s. X, k+ A$ [* F/ o
<div id="container"><div id="navigation">...</div></div>9 N# x7 i# H- d4 [9 T5 f" V
4 {. n6 o: G# \* _* U% T$ z" b3 R
如果想定位到距左30点,距上5点,可以这样:. w- a: S6 P* v$ S$ j) s% ]& D Z+ w4 ~+ o
7 f0 a8 C/ p, _#navigation+ j1 g. t2 f. A% p4 `
{
- h- ], V1 h5 b$ y0 J! pposition: absolute;' ~& B9 g1 j* V& D
left: 30px;: P9 u! p& l, [# n/ U
top: 5px
+ S, \: M, n, \9 R6 f}/ X+ p7 j5 V9 V& [: e; ^
- A8 j- e' U* f* e& Y5 L: i, L当然,你还可以这样:
/ }: F4 j5 n* w/ b w$ {
+ ~: ^6 ?# e2 N+ _% w" ~& jmargin: 5px 0 0 30px
" M+ p- c5 _6 G' R& l! s5 ]6 p" `. m3 f- F. U8 ^* U, S% I
注意4个数字的顺序是:上、右、下、左。当然,有时候定位的方法而不是边距的方法更好些。
* x4 P) h) I4 o1 c
, ]9 y, g# C% e: z/ @10. 直通到屏幕底部的背景色
/ F2 a+ v7 S5 C, j. ^9 Q+ ?
$ J- |' K+ L" k Y在垂直方向是进行控制是CSS所不能的。如果你想让导航栏和内容栏一样直通到页面底部,用表格是很方便的,但如果只用这样的CSS:7 w6 V# H& G/ `/ c
& V; H' K) ?8 }( v#navigation/ Q+ F$ K4 r7 |4 F5 P
{6 h2 p# p5 C6 t
background: blue;$ m2 @$ [' I( w A
width: 150px" u7 L- P5 M& o, ]5 t+ r% S6 Z
}$ Y: |: D5 y: R+ r% T4 {' D
* W; N: L$ A, c8 v. N+ B! W5 j! Y较短的导航条是不会直通到底部的,半路内容结束时它就结束了。该怎么办呢?
) a* J* v5 B# ^0 m. @+ H
0 E$ b& g# ?; z! X不幸的是,只能采用欺骗的手段了,给这较短的一栏加上个背景图,宽度和栏宽一样,并让它的颜色和设定的背景色一样。" V2 F4 s; D" Y. q# b
. R8 S! N. w- Z7 P. Z* |7 v( m3 `
body
9 h6 {: _( Q& X+ |& m{
9 H4 a, g$ f* c7 N6 l/ lbackground: url(blue-image.gif) 0 0 repeat-y
# [( B* U" o( H}0 p. X% q& K2 [$ }% d8 u
7 x" O! `1 _) D' C' ]3 M$ k3 G2 l此时不能用em做单位,因为那样的话,一旦读者改变了字体大小,这个花招就会露馅,只能使用px。