Zeal Blog - 泽欧里
梦想 就像鸡蛋
要么孵化 要么臭掉
WWW Zeal Blog

兼容标准XHTML的浮动层特效实现

zeal 2005-05-23 17:36 于 WebDev , 4157 字 |  + 0 - 1   English
Made In Zeal 转载请保留原始链接:http://www.zeali.net/entry/62
标签 ( Tags ):  , 
近日对自己的blog进行代码兼容性的改进,发现了原来的很多问题。之前修改了一些基本的CSS语法错误,基本实现了在IE和Firefox下页面观感上的一致。但对于一些js特效,尤其是浮动层的显示上面的问题,一直留着,今天才花功夫进行了修改,使得浮动层的滚动,鼠标拖放都得到了兼容处理。

1. 浮动层的显示、移动

一个简单的例子:
<div id="mydiv" style="position:absolute;">my div contents</div>
<script language="javascript">
var dX = 10;
var dY = 10;
function mydivMove(x, y){
    var id = 'mydiv';
    if (document.layers){
        document.layers[''+id+''].left = x;
        document.layers[''+id+''].top = y;
    }
    else if (document.all){
        document.all[''+id+''].style.left=x;
        document.all[''+id+''].style.top=y;
    }
    else if (document.getElementById){
        document.getElementById(''+id+'').style.left=x+"px";
        document.getElementById(''+id+'').style.top=y+"px";
    }
}

mydivMove(dX,dY);
</script>

主要的问题在于不同浏览器对于层的坐标获取方式不同,尤其要注意当通过getElementById来获取层坐标的时候(非IE浏览器),改变坐标的时候要加上"px"后缀,而不是直接进行数字赋值。

2. 关于window.onscroll

g_myBodyInstance = (document.documentElement ? document.documentElement : window);
g_myBodyInstance.onscroll = mydivScrollFunc;

上面的代码实现了兼容的onscroll事件处理。可以看到对于Firefox来说onscroll事件是隶属于document.documentElement对象而不是window对象。

但似乎Firefox浏览器对于通过鼠标中键滚动页面的操作并不会去触发onscroll事件,而只有拖动右边的窗口滚动条才会触发,这给我带来极大的困扰,这样如果想要让用户浏览页面的任何时候某个浮动层(比如我的导航条)始终位于页面可见范围的话,就不得不使用setInterval或者setTimeout来不停的改变这个浮动层的位置。而不能采用触发onscrollonresize这两个事件进行显示位置重置。这显然是低效率的方法。幸好标准XHTML提供了一个CSS属性值,可以通过设置这个值来曲线达到目的:
<script>
var id = 'mydiv';
if (document.layers){
    document.layers[''+id+''].position = 'fixed';
}
else if (document.all){
    document.all[''+id+''].style.position='fixed';
}
else if (document.getElementById){
    document.getElementById(''+id+'').style.position='fixed';
}
</script>

position的fixed属性让该层能够始终位于窗口的指定位置。从显示效果来看,在Firefox上的显示效果比IE中通过onscroll触发层的位置移动处理显示效果要好很多,看不到层的闪动。

Updated 2005-9-23 14:24 -- 学海无涯提供了另外的一种实现移动层的方法

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
<head>
<style type="text/css">
body
{
    margin
:0; /* 必须 */
    border
:0;
    height
:100%; /* 必须 */
    overflow-y
:auto;/* 必须 */
    }
#menu
{display:block; top:10px; left:150px; width:130px; position:fixed;} /* IE并不认识fixed,而FF认识 */
* html #menu
{position:absolute;} /* 这个只有IE认识 */

</style>
<!--[if IE 6]>
   <style type="text/css">
   /*<![CDATA[*/
html {overflow-x:auto; overflow-y:hidden;}
   /*]]>*/
   </style>
<![endif]
-->
</head>

<body>
<div>
<ul style="list-style-type:decimal">
<script language=javascript>
for(i=0;i<500;i++) document.write('<li></li>');
</script>
</ul>
</div>
<div id="menu">
<img src="http://www.cnblogs.com/images/cnblogs_com/goodspeed/795/o_o_mylogo.gif" />
</div>
</body>
</html>

据说IE7已提供了fixed的支持。

使用上面的代码你必须注意:body里的元素不能有 position:relative ,否则这个元素将不会滚动。

3. 关于onmousemove

对于IE来说,模拟鼠标拖放操作相关处理如下:
// 捕获鼠标移动
mydiv.setCapture();
document.onmousemove = mydivMoveFunc;
// 释放鼠标移动
mydiv.releaseCapture();
document.onmousemove = null;

对于Firefox浏览器来说,要这样处理:
// 捕获鼠标移动window.captureEvents(Event.MOUSEMOVE);
window.onmousemove = mydivMoveFunc;
// 释放鼠标移动
window.releaseEvents(Event.MOUSEMOVE);
window.onmousemove = null;

可见IE支持细化到某个层的事件捕获,而Firefox只能是捕获整个页面所有的相同事件。从实际显示效果来看,IE的表现出来的拖拉效果要明显好一些。关于完整的鼠标拖放的实现可以参见可移动层的实现示例一文

题外话:发现原来style="cursor:pointer;"才是标准用法,以前一直都写成style="cursor:hand;"的说,呵呵。

This Entry was Last Modified on 2007-05-24 17:29
引用本文(TrackBack): 此功能无限期关闭ing ... 如有引用请在文中标明出处并提供超链接 已有2条引用:
     兼容标准XHTML的浮动层特效实现 2005-10-31 17:03 via mark-leung
     兼容标准XHTML的浮动层特效实现 2005-10-31 16:50 via mark-leung
(Login to delete trackbacks)
4 条评论:
- Yao 于 2007-01-29 09:50
Updated 2005-9-23 14:24 -- 学海无涯提供了另外的一种实现移动层的方法:
不加doctype时这个实现就不能工作。
- metalrush (link) 于 2007-11-13 14:45
发现原来style="cursor:pointer;"才是标准用法,以前一直都写成style="cursor:hand;"的说,呵呵。

hehe,原来是这样的,我一直也是用cursor:hand
- Poon 于 2008-05-21 10:10
用js 输入的时候 出现两个Y滚动条,去掉doctype时候就不能用CSS了,郁闷的很
- 厦门SEO (link) 于 2008-08-23 20:51
嗯,不错,我也是很喜欢用DIV+CSS写网页,有空大家交流下,http://www.seo-xm.cn
对于这篇日志您有什么想法?我想听听您的高见。
如果您不是没有思想的机器Spammer,请告诉我 4 + 8 =
然后任选以下两种方式之一告诉我您的身份:
1. 使用您的 OpenID
2. 使用传统留言格式
(必填) 名字
如何称呼您?
(选填) URL
在此填写您的 Blog / Homepage 的地址,我将非常乐于访问
(选填) Email
Email地址将在经过防SPAM处理后显示在页面。如果您不希望公开自己的Email,请略过此栏
并写下您的见解:
(由于需要进行SPAM过滤,如果评论提交速度慢请耐心等待)
记住我?

  如何进行评论                   当有新回复时给我发送邮件通知
除了 <b> 和 <i> 之外,其他的HTML标签都将从您的评论中去除. URL 或 Email 地址会被自动加上链接.
当您点击发表或者预览之后,系统会自动保存您此次评论的内容,以便当网络原因发表失败时直接按Ctrl-V重新粘贴上次评论内容。
注意:快捷键及自动拷贝功能仅对IE浏览器有效。
发贴统计

Tot 618/1354

日志存档
2008年
2007年
2006年
本 Blog 原创内容
遵循以下授权:

Creative Commons
(创作共用) CC

署名-非商业性
-相同方式分享
Zeal Blog 基于
Powered byPivot - 1.24.1: 'Arcee'
Pivot1.24.1
开发
Launched @
2005-04-27
 里,居也。——《说文》    里,邑也。——《尔雅》。李注:“居之邑也。”沪ICP备05024379号 Back To Home All Links Loading