我爱电脑技术论坛's Archiver

麦迪 发表于 2008-5-5 14:19

标记语言:为指定样式

把内容与显示效果分开设定的好处之一就是灵活,通过用CSS控制网站的版面布局(在第十二章用过的方法),就能控制整个网站的设计要素,改变几条规则,就能立刻戏剧性的更新上千个页面.
`8a.VyhX/A[#P)T7Dd
:O1rO?v5P3m }"r 用CSS控制布局的的便利性示范之一,就是为<body>指定样式,通过为<body>标签加上class或者id,就能对页面的任何标签进行自定义控制.完全没有重复定义的烦恼.   u*~)r$Th$Z2~ cf"CA#l#y-S
Di:E p|9fR N
在这一章里,将探讨如何通过为<body>标签加上class而让我们用一份标记结构切换两种不同的版面配置. l%`T/i(e Kd
:DUU)W c+N1lk [
两栏或者三栏的布局
#r"E&|9r"}? o 就像用CSS版面布局技术为Fast Company重新设计网站时,挑战之一是:虽然所有页面都共享相同的导航,页尾区,但是也需要建立两种不同版面布局. I&j b(f%}@eorf
&z-R p-CW;~
第一种布局是"索引页(首页)",见图15-1,这是具备导航功能的页面,让使用者能继续深入网站的目录结构.这些页面我们决定使用三栏布局.  :O*`L\,jn:V

'X$U%RXi
3v` Te PG` [attach]21922[/attach]%a#[stj7n K

A8z,j1w5e&Yi 图15-1 Fast Company的三栏"索引页"示范 %rI Yz[-Z$Jv

fBs t3Cvi6R 第二种页面布局则是"内文页" 图15-2.任何感觉是目的地的页面都使用这种版面布局.为了提升易读性,我们决定省略左边栏,留下两栏,也就是一个大栏放置内容,另一个放广告.ORgRDQzah

3@-Z;@,lSX"O]
"q~j"[~LV [attach]21923[/attach]
)tWRA/Wdg-e 'z8j2j$FGI5fyr9YI
图15-2 Fast Company的两栏 "内文页" 示范. q;Eg7Q0s |'vN+R$BX
)@|Dgz2B mS,oI
我解释这些的原因不是为了证明我们破解了某个版面布局的伟大谜团,而是为了示范为<body>标签加上class就能调整栏宽,并且根据页面形态放置或省略去第三栏.制作这样的效果的时候,完全没有重复任何规则,也没有引入任何额外的样式表.   
_W BNq"d.z
'K5e!Ifz0[R[:aK_0L4O 标记和样式结构E-ko#u!b-JD.k z

-@a u#A7^+@'l@$R 在开始叙述两种页面共用的标记结构之后,这些叙述就会开始变得很有道理,为了达成分栏布局,会使用在第十二章里提过的绝对定位法. 3D s'GqU l/w xK-^o"F
#r)FT6REY:@%Vu+n
内文页&@H}a_,bO m,^
内文页简化过的标记结构看起来像是这样:
)G!`7i1LqL
h"uC3^ a#a
e'~z~%f!^:t <div id="header">
`5x5l&[;A M"L6H\-iY
K3`}/\/C5c*G   ...header info here...
up!y!B*eK_ m "MT5~gcQ!cnf ]4Y
</div>&n#rFG;Z{
g1U^ q;f7BY l
<div id="content">lc5?;Qt$oA
"G@,Hs*} y rQ4O`
  ...content here...]:w6~F p.l8JoF]

fv.qE \ </div>
i8y!_{ j|UEA_#j;c H MP5d S h0LjsE
<div id="right">*E-bnXn/~
xQ1Y%I(~
  ...right column info...
?R2^w,E*O a Ihx#|/O
</div> P@{ oc

j({_'PdZlaC <div id="footer">2w ^xU-n/{%kv5k
q+~;x!js
  ...footer info...I3tz5If8p\D(c
/Cn0Fx(n3Aj%]Y X#`
</div> +E1g-p3J*?V

H @4Xd(m/hUF"R#_
b|'Y(y7Ek?$wAo!F 以CSS规则为#content与#footer加上足以使用绝对定位法放进#right的右外补丁,在这个例子中,190像素刚好可以满足. ,?N+f,hgZ)MF
ks(hrAY1l
%B6V7JwXr9KX
#content, #footer {
#Z8UP:b;T [zww2F
4I x E6MZ$Cp:kx4g   margin: 10px 190px 10px 10px;j"pYX"Z3^Et:nE
,Ft| h9Ku\
  } #@-c,~_bfF
$oJoh)S6p7YK _g4M
索引页
j@}%zH;E 对索引页来说,标记结构完全相同,因此不必复制一份共享的CSS规则,但是在#content左侧加了额外的<div>作为第三栏(#left). :P4uX7f6s1H z{
/g;q9\"{[|` a1t8~8n
<div id="header">
T cXN^H+CYC
/kHJL|]g&r jxI   ...header info here...
p.`"e2BN5{1{4W1P 0z-TS2ct+@I
</div>
lm0UnH
!S_(t x5f&l <div id="content">-Pu7s#tHB
:O'~5LH/}*u
  ...content here...
%_L(QAk4or/GB Q 1z)[*q)F'A&Po
</div>-q)Wj d m6v.IU4d

z ^cdO R <div id="left">
n`6ce]~ /J R8v`x}N9n
  ...left column info...
7ml p YJLt
J,KcZ@.me m </div>m@b"u;T^0C Nk
8p4uYL]|*a
<div id="right">+]*MZ5R&R#` nr
"[a8e @f M6M"F,fe+?
  ...right column info...
7~2En0[%v#A6\n
'S$US]4\wLgj+L </div>
's#C.e's:P-uQ :A;c"pg)~'P_2L
<div id="footer">D%A"vBe
6y"N?Tj1S
  ...footer info...oq6S6Z6bcK
3xR+y$k ~i4w#~6\
</div> 8s|{'L7Jg
!~4@Y(nH_GC
!|? c_!]+P
对这份三栏结构来说,不仅要为#content与#footer设定右外补丁以容纳右栏,还要设定左外补丁,容纳新加进来的左栏. gNTo#nU n
@c G.St!Fp
但是先前已经把左外补丁设为10像素了,以配合只拥有双栏的预设内文页布局.
T$~~\R7|u!]#H
6l P#`]V6}Z 哇,我们卡住了,该怎么继续呢?请继续往下阅读.

麦迪 发表于 2008-5-5 14:19

这个<body>有分类
c/x'@N,\jZ
FQ;^"A5y{ Wt 这就是<body>标签加入游戏的地方:通过为<body>指定class,指定这个是索引页,就能为这个分类编写特殊的规则了. "T;W'u(mp.K)hO8b/B ?
"Ud6W7o8\ L"V
举例来说,为了要覆盖预设的10像素左外补丁,就需要为索引页的<body>标签加上一下这个分类.
Y(On:wdx7B*` 3T,c[6bp&a#L
<body class="index">
'qCwZ4OjM0S ` -@}+g'[{y
在原本为#content 与 #footer设定补丁的规则之后,我们加上以下的CSS:   7t:s4F$W1Ef

(CO,s ]]a3S3fB #content, #footer {
Z.Hre z B_E"]Q F $v+z"v }'C]8v
  margin: 10px 190px 10px 10px;
~4F*tY QR7l pb3uc+O%fyY
  }
W+S$kI}2C\t/r6GT f
`Ne0Qan%?2F q7Wq body.index #content, body.index #footer {
%F[[8OS-T-@|.{
4lqa2OKU   margin-left: 190px;+MPR hM VD~
^)p8n&IZ;?!BAx)h
  }
$k#`f,F'uMN4z 'eK!]3~\X
在把<body>标签设为index分类的页面里,左边扩大190像素(与右边相同)可以用来容纳左栏,如果不指定index分类的话,左外补丁就会是预设值里声明的10像素了.
+YY"d'Lq5U D!t5Yf2Vi
现在就能在两栏,三栏布局之间切换了,只要为<body>标签指定分类,在需要的时候为标记源代码加上额外的<div>即可,你也能指定更多分类,能处理的页面类型数目并没有限制.
(@9ar)l*NQ;Rc[k tN^"^ I;v%C
标记区域与名称可以维持相同,根据页面类型进行微调即可. NH I+O{
pPYx#R(wnQ:N
不止处理分栏dEU6E(@S)f!?

4|4@R'WtG'm v 我以切换Fast Company网站的分栏数目作为例子,但是相同的想法也能自定义页面上的任何元素.
H*i(^7J5{)y Q-i1D2T P!v2b(S`
举例来说,如果在索引页上让所有以<h1>标注的页面标题以橘色(而不是预设的颜色)显示,你可以在预设值之后加上额外的CSS声明.在所有页面上,都能使用以下这段CSS: k]7IM4R"^ A\Q

*k#} WzN @;M h1 {JqsB/f
1{-fs2b1Yy+N
  font-family: Arial, Verdana, sans-serif;5k5Yr"['@a
HGR6FJ
  font-size: 140%;%Wr'Z+X cP,x"i
R.XrV,Q V
  color: purple;
`8a3dNY%r
QV~&q9c   } 9Af O7D7O g_
7{)@tYh@c
而这段CSS只会对索引也发生作用. D@\j6[$or$F,V

ihz r6C$mPX body.index h1 {9}v/_JB]
K+k)y*I.r p{,@Eo
  color: orange;,E1Te%by*_ o

d,?9l2q t E:B'l   }
"X$Dr,W:];_%qa +eIy6cp p%mH9dU
你应该已经发现了,只需要在专门用于索引页的声明里面加上跟预设值不同的规则即可.在这个例子中,再使用<body class="index">的页面上,<h1>标签会以140%大小的橘色Arial字体显示,但不必为<h1>加上class,或是加上其他额外的标签. I"E8\8q\\p5ul

'HC5_;K6A 我在这里用的是非常简单的例子.不过你能开始想象为<body>标签指定适当的class,建立多种页面类型的可行性,这些分类可以用来触发完全不同的版面布局,色彩组合与设计,只需要单一的CSS文件,十分类似的标记源代码结构就能办到.

麦迪 发表于 2008-5-5 14:21

你在这里"
Oy+u1DO6F A^ t-Zs-w&HDb
除了为<body>标签加上分类属性之外,加上id也能得到有趣的结果.
y_^ s:P`M -h f)TBy?
举例来说,技术高超的设计师或许能以<body>标签的id处罚导航元素,提示使用者目前位于哪个页面,让我们看看这要如何才能办到. VuS.j1g$C:h^"d'v
*c Cl9crk(q,Z
导航清单'e:fcD sCh-@
r/D2i{K.M]3e
在这个例子中,将借用第一章"技巧延伸"里面提到的迷你分页标签,这边的导航条用了一个单纯的无序清单,里面包含了几个链接,像是这样:
&c!\F im5Q-gE8vk 2~ [t DUk6@
<ul id="minitabs">
L)`X!R~e
YSo N)@+Am$s   <li><a href="/apples/">Apples</a></li>ktQ `R,}
%LXg.Up%LQ%u cKD
  <li><a href="/spaghetti/">Spaghetti</a></li> O4{H9ppR(Z

M$qe@"l-R_/Z   <li><a href="/greenbeans/">Green Beans</a></li>
F\'}:u;p9v%I pmN6ig?8J,r;wj
  <li><a href="/milk/">Milk</a></li>1LQ_e5A
f8@;Tm4NB~
</ul> 7h2[Agh}0u a#G%F @,A

p t(~,g%L(O&ngT 你或许记得我们以CSS为这个清单加上样式,把项目转成水平排列,同时在鼠标移过的时候显示标签.图15-3是浏览器显示的效果.
/Z/Q]fL1T+~k XvE C&m*h*yc
[attach]21924[/attach] d~'VAC;F;F
-N$Wf4|5s aG
图15-3 水平导航条,显示标题效果
g*m+At8m1m| 你或许还记得为了达成 "你在这里" 的效果(将某个链接的标签固定在"选定"状态),而将想要固定的链接加上了class: iLKqD,Y7s9_6Tt
&sm;{V^
<li><a href="/spaghetti/" class="active">spaghetti</a></li>
'l6c_"n\$l J
3h;S:a)r.if] FX1K 我们也加了一条CSS规则,为class="active"的链接应用background-image:
T _\lQP9l$I
N e1S6h%},W #minitabs a.active {
,x4v k&^"L:p)J
*}PG"x"X!NO]]"\0GG   color: #000;*q7N_P!_b-n6n
4?6a4D0E*w8~
  background: url(tab_pyra.gif) no-repeat bottom center;
uEvu} cQ+u| ^v{
  } 6z'j-q;DQhA

s/r_7o"}Qn jY/E9s 然而有另一种方法可以完成这个效果,能不动到导航条的标记源代码,但是又能突出使用者目前所在的页面,那就是为"body"标签指定id.
9S.z.E Gx-h|Y%wtP !A!W JpA^yDd
bE;o T5c2n j@ j
判别组件 m&c4g!z?5{q@ J
*r.X }L$r-@2xp
首先必须先为导航条的每个<li>标签加上id属性,这只需进行一次,接着这个无序清单可以不经变动直接用在每一页上,甚至能显示"你在这里"的效果.
j;EX`N+? S u;I3t })Y2{
<ul id="minitabs">Z![8y#]RU-b

rcu2KL   <li id="apples_tab"><a href="/apples/">Apples</a></li> X4Jd7} Yc c1B P6Q
3Y4jex;e2z
  <li id="spag_tab"><a href="/spaghetti/">Spaghetti</a></li>h$q:]4a8n y&t4kU(L
W^5ew/Dm#yB%n;~
  <li id="beans_tab"><a href="/greenbeans/">Green Beans</a></li>
/wW+e+k8hx,C(n q[5k"Fp7Pu
  <li id="milk_tab"><a href="/milk/">Milk</a></li>
W%y\1zTQ
6G;[7upF </ul>
t,|O&Q ZY
[#k-T(GN$NmD$Qu X XNE Gq6| W.F/s$r
在前面这一小段源代码里,我们为每个li加了个简短的id,字字符串尾加上_tab以避免重复.稍后就能看出道理何在.
x7Ted&U b)``4Y)@kc1] aQ Q&f` ^[y:h h
现在完成了清单的标记语法,现在我们能把它忘了,这可能很方便,视你使用的模板,内容管理系统而定.
x)c8w0k~ a$ed6rO o_
这个效果唯一需要变动的地方只有<body>标签的id,这样就能凸显使用者所在的页面.举例来说,如果想告诉浏览器目前正位于Apples页,就可以像这样为<body>加上id:   
]?F+H*V-kHFQ 4c.tksH.?"{
<body id="apples">   xx!n/Z Fj7a

J;pS6iq/L5} h:c 或者是,加上id代表目前正处在Beans页面:
s)NL~*z&?W9Px 0o.wC4X3_F}o
<body id="beans">
:ceK\+~| F/p Pi:f)t @7a |
以此类推.   c!\ F#S ?/|%VL~
tg S(Ep%A
CSS的魔力 eQ kH@RD
,t!K-z7osKX:ub/NQ8M;c I
要根据<body>的id来"点亮"标签,只需要一组CSS声明,告诉浏览器每种可能发生的组合: %{R Q0`G\ s
}*ri&l)b|5t
body#apples #apples_tab a,
$Y}4j.x#oY"}/p a@ $kM @ p*Op3DIC:C
body#spag #spag_tab a,$g.S7?U PX,L
2h [3R M(J$l
body#beans #beans_tab a,"Bz |:Nj m!\6QG

4K{x+U8B3D8uNG body#milk #milk_tab a {
w?S/A`h 9N_"X/q|G
  color: #000;
&G+u6ZL6z@
5?1\j,j l$z   background: url(tab_pyra.gif) no-repeat bottom center;
6\nT*e~"?H
2}1~Y L0Z-@U   }   P o$}Xbl
h8C:UKB"[
基本上这就代表了:当<body>标签的id是apples的时候,就为#apples_tab清单项目加上链接背景,同时把连接色彩换成黑色,然后为,每个标签选项重复类似的声明. e6Tlil3w{G

'V B/@ N$s9m 现在需要"点亮"导航条内正确的动作只剩下变更<body>标签的id了.这段CSS会处理好剩下的事情,同时能在未来网站新增页面时进行修改,以便处理更多种组合.
#X5i%K CZDE
4_B~-m7~ 举例来说,如果想根据使用者目前位于这一页,"点亮"Beans标签的话,只需要像这样为<body>标签指定id即可. {y g\TAy:q%l

F!g*^1m:IR6~,_S <body id="beans_tab">
(y"Q x3aa)Q-O1Z `
3d#xlR$L6P \0z,B 然后正确的标签就会凸显出来,就像图15-4一样(这边我们用了第一章解释的"mini-tab"样式). $x)XVqgp
_*f/^3u&?y
[attach]21925[/attach]V*zR"^2V(? Kf

-H|'dnNa 图15-4 为<body>标签指定id所选定的标签 +U8?8u)|h/cz
我们也能为<body>指定其他在标记源代码,CSS里都声明过的id,"点亮"我们希望凸显的其他分页标签. C\yZc

3XW!v7ECe3w9n7iT 除此之外,你也能以相同的概念触发页面里其他与内容相关的事件,像是子导航目录,或者根据页面的id轮换颜色.由于<body>标签位于顶层,因此它的id可以用来控制页面里任何在它底下的标签. B&\1R(W:NPrL@%W

6cr-^*n c2c 归纳
3IwQ-M:d d_ 迁移到用CSS作为基础的布局方法后,你一定会对更大的灵活性感到惊讶.在这一章里,我们看了善用这种灵活性的方法之一:也就是使用<body>标签的class或是id来控制页面的分栏结构,或是标识使用者目前所在的页面.   _GI3i6\A'{E

$E9\8Umd 使用标准,模块化开发网站有何好处?这些不过只是简单的例子而已,通过<body>标签的一个属性,就能改变整个页面(甚至是网站)的布局,设计与样式.

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.