html+css 在 网页构建(web page building) 中的应用已经不是什么新鲜事了。轻盈的 div布局 方式替换了笨重 table布局 方式。而在 div布局 方面多数人使用的是 float方式 ,div 在 float 的控制下忽左忽右好不自在。但我们今天要说的不是 网页构建 ,而是 b/s结构 软件界面构建。所以我想介绍另外一种方式 position方式 。我个人比较喜欢这种方式,虽然很多人认为把 div 的 position属性 设置为 absolute 后用 top属性 和 left属性 在页面中随意定位进行布局是一种极端菜鸟的方式,但在 b/s结构 软件界面构建过程中这种 position方式 的灵活绝对会给你带来意想不到的效果。当然我所说所写 position方式 还存在很多的不足之处,这只是为了抛砖引玉,来给大家打开一个话题。
闲话:
既然我们是在说 b/s结构 软件界面的构建,那就先来介绍一下 b/s结构 吧!
b/s结构(browser/server结构) 即 浏览器和服务器结构 。它是随着internet技术的兴起,对 c/s结构(client/server结构) 的一种变化或者改进的结构。在这种结构下,用户工作界面是通过浏览器来实现(也就是说 b/s结构 软件界面可以被理解为是建立在现有浏览器所能解释的 html;css;scrip等基础之上特殊的网页),这也就使得其具有了 c/s结构 所不能比拟的跨平台性等优势…… (详见: http://www.VeVb.com/program/otherweb/other_web_2007_12_26_2534.html)
说完 b/s结构 让我们来说说既然 b/s结构 软件界面(其实就是一种特殊用途的网页)和普通网页有什么根本性的区别呢?
开篇还没写什么呢就写了这么多的闲话,我这个人就是这个优点:比较能跑题!闲话还是留着以后再说,先转入正文吧!
|||
解释 position方式
position方?在根本上是利用了 html+css 的 盒模型,在这里我就不过多的解释 盒模型 了。但要说的是由于不同浏览器或相同浏览器不同版本(且不说哪个浏览器的好坏,但同浏览器不同版本的极大差别只有某公司的某种浏览器的6.0版本和7.0版本才有这样的如黄色粘稠物一样的问题)之间的兼容性问题我们是采用了2种方式利用 盒模型 的。这2种方式分别来自 ie6.0 的 非标准盒模型 及 firefox 为代表的 标准盒模型 。
说道解释 盒模型 我们不能不提一下 doctype,因为 doctype 对浏览器解释 盒模型 有着非常大的影响。尤其体现在 ie6.0 的 非标准盒模型 的解释上。这其中的差异我就不多说了,这样的文章远有比我写的好的。在这里我只说一下我的做法:
代码1-1
运行代码框
[ctrl+a 全部选择 提示:你可先修改部分代码,再按运行]
很多人可能会说我的 doctype 写的有问题,因为按照标准 doctype 必须要书写在文件的首行。这可不是我发明的写法,最早看到这种写法是在 adobe.com(最近改版的版本已经放弃了这样的写法) 。第一行是声明 xml文档 编码为utf-8,第二行是声明 doctype 类型 为 xhtml1-strict 。其实这算是 doctype 的一种hack写法,由于 doctype 没有写在第一行 ie6.0 及以下版本浏览器不解释,而 ie7.0/firefox/opera/safari 却可以解释。我测试了很久发现这确实是一种不错的选择,因为 doctype 没让ie6.0变得更好反而更糟。所以我之后的 盒模型 都是基于这种 doctype 写法基础来解释的。
先来说 ie6.0 的 非标准盒模型,让人郁闷的是这个 非标零件 因为他的广泛使用却成为了我们必须考虑的标准。ie6.0在解释 双盒嵌套 (<div><div></div></div>) 中,子div宽度被设置为100% 时其真实宽度为 父div 宽度 – 父div 边线宽度 - 父div 内补丁宽度。父div 真实宽度为设置宽度。
代码1-2
运行代码框
[ctrl+a 全部选择 提示:你可先修改部分代码,再按运行]
以上边代码为例(见代码1-2),父div testdiv1 的真实宽度为设置的宽度600px,子div testdiv2 的真实宽度为600px - padding-left:100px - padding-right:100px = 400px
这代码对我们有什么意义呢?看一下 代码1-2 的页面(ie6.0浏览器),从左到右分别是 黄-蓝-黄,这有没有点像是”左-中-右”的布局结构呢?让我们修改一下代码再看看。
代码1-3
运行代码框
[ctrl+a 全部选择 提示:你可先修改部分代码,再按运行]
看一下 代码1-3 的页面(ie6.0浏览器),从上倒下分别是 黄-蓝-黄,这有没有点像是”上-中-下”的布局结构呢?可能你会想我是不是疯了!这个谁不知道啊!这是最简单不过的代码了……
让我们来让这些代码变得更有意义吧!在这之前我们需要先要引入一段基础代码。这段代码是我在做 b/s结构 软件界面时所倾向于的做法。它可以帮助我们将页面格式化为无整页滚动条,并根据浏览器窗口尺寸时时自动适应。
|||
代码1-4
运行代码框
[ctrl+a 全部选择 提示:你可先修改部分代码,再按运行]
看一下 代码1-4 的页面,并试着改变你浏览器的窗口尺寸。你会发现你得到了一个我许诺给你的。这段代码兼容 ie6.0/ie7.0/firefox/opera/safari 。其实这个是我对 body标签 利用 position方式 的重构。你也可以记住这种方法,因为接下来我们很多时候都会用这种方法。
好了,让我们利用这段基础代码使之前再简单不过的代码变得有意义吧!'
代码1-5
运行代码框
[ctrl+a 全部选择 提示:你可先修改部分代码,再按运行]
看一下 代码1-5 的页面(ie6.0浏览器), 展现在你面前的是一个标准的”左-中-右”布局结构。maindiv 是 父div,middlediv 是 子div 也是 主区域,middlediv 利用了其 父div 的 padding属性 来为两边的 leftdiv rightdiv 子div 也是 辅区域 div留出空白。maindiv 相对 body 宽度值是100%,middlediv 相对 maindiv 宽度值是100%,这就使得 middlediv 的宽度相对浏览器窗口尺寸是自动调整的,高度亦同。leftdiv rightdiv 分别利用 left:0px; 和 right:0px; 来相对定位居左或居右对齐。试着改变你浏览器的窗口尺寸,看看效果吧!
你可能会说:”这算什么? float方式 也可以啊!css的代码还比这个简单呢!”
那让我们来修改一下代码吧!这样可以实现的”上-中-下”布局结构,并且相对浏览器窗口尺寸是自动调整。这是 float方式 不能实现的。
代码1-6
运行代码框
[ctrl+a 全部选择 提示:你可先修改部分代码,再按运行]
这里要说明的是在 代码1-6 中的 bottom:-1px; 这是因为ie6.0浏览器对css解释错误而产生的手动修复,当 子div 使用 bottom属性 并且其 父div 的高度 真实值 为单数时, 子div 的 bottom属性 在浏览器表现出的 真实值 比 设置值 大1px。
不知道你看明白这些代码了没有,这些就是我所谓的 position方式 来实现的结构布局。你可能要说:”拽什么拽啊!你看看你的方式在firefox中的样子吧!” 别急啊!之前不是说了么由于兼容性问题我们是采用了2种方式利用 盒模型 。现在让我们来说另外一种吧!
firefox 为代表的 标准盒模型 这才是未来的王道。现在的 ie7.0/opera/safari 都可以非常好的遵循 标准盒模型 。标准盒模型 在解释 双盒嵌套 (<div><div></div></div>) 中,子div 宽度被设置为100% 时其真实宽度为 父div 的设置宽度。父div 真实宽度为设置宽度 + 父div 内补丁宽度 + 父div 边线宽度。也就是说 父div 的盒被撑大了。并且在 标准盒模型 中通常 height属性 是无效的。那我们有什么办法能解决这样的问题呢?看下边这段代码。
|||
代码1-7
运行代码框
[ctrl+a 全部选择 提示:你可先修改部分代码,再按运行]
看一下 代码1-7 的页面(firefox浏览器),发现 maindiv 并没有被 padding 和 border 撑大了。这正是利用了 body>#maindiv 这一种css的hack写法来解决了问题。具体的我就不多说了,想必大家一眼就能看明白(其实就相当于你告诉浏览器说:我要做一个盒子,盒子大小你看着办,但盒子的左边和右边都要距离墙0px远) 。但 padding属性 还是在很多时候影响了 position方式 ,所以我们尽量不在 标准盒模型 的布局中使用它。可回想一下在 非标准盒模型 中 padding属性 可是非常重要的一部分。那么为了兼容2种模型,我们使用另一种css的hack写法,在css属性前边加”_”来使这一属性只有ie6.0才能识别并解释,而 标准盒模型 的浏览器都不能解释这一css属性。
应用 position方式
综合我们上边说过的方法来整理一下代码让我们看看 position方式 能带给我们的效果吧!
代码1-8
运行代码框
[ctrl+a 全部选择 提示:你可先修改部分代码,再按运行]
这段通过 position方式 构建出的代码可以完美的运行在 ie6.0/ie7.0/firefox/opera/safari 浏览器中来实现布局结构。如果有天你想要对你的软件界面进行又改了那你也通过单纯修改css样式表的方式来
修改布局结构而不用变动丁点html代码。
代码1-9
运行代码框
[ctrl+a 全部选择 提示:你可先修改部分代码,再按运行]
通过对布局结构的组合你还可以通过 position方式 构建出更复杂的结构。
代码1-10
运行代码框
[ctrl+a 全部选择 提示:你可先修改部分代码,再按运行]
新闻热点
疑难解答