最近在研究指定HTML元素的offsetLeft与offsetTop的值,当前的版本兼容IE6+,FireFox3+,可以在mouse移动到链接上时,在链接右中下角准确创建div。
效果如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>divpostion.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
<style type="text/css">
.report{
margin:10px;
width:500px;
border:2px;
border-style: solid;
border-color: green;
}
.conts{
margin:20px;
width:60%;
border: 1px;
border-style: solid;
border-color: blue;
}
.hrefs{
margin: 15px;
width:50%;
border-width:2px;
border-color: #999;
border-style: solid;
}
ul.tes{
height:220px;
}
ul.tes li{
height:50px;
line-height:30px;
display:inline;
}
ul.tes li a {
width: 150px;
height: 30px;
border: 1px;
border-color: red;
border-style: solid;
}
a:hover {
background: #cfc;
}
</style>
<script type="text/javascript">
function createTip(){
var _tips = document.getElementById("myTip");
if(typeof(_tips)=="undefined"||_tips == null)
{
_tips = document.createElement("div");
_tips.id = "myTip";
_tips.style.position = "absolute";
_tips.style.borderWidth = "1px";
_tips.style.fontSize = "9pt";
_tips.style.filter = "progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135,strength=3)";
_tips.style.padding = "5px 8px 3px 8px";
_tips.style.width="300px";
_tips.style.height="200px";
_tips.style.display="none";
_tips.style.background="url(images/tip.gif) no-repeat left top";
document.body.appendChild(_tips);
}
return _tips;
}
/**
判断IE版本
function IEversion(){
var version=navigator.appVersion;
//alert(navigator.appVersion);
if(navigator.appName =="Microsoft Internet Explorer")
alert("your browser is IE"+parseInt(version.split(" ")[3]));
}
*/
function showtips(link){
var tip=createTip();
tip.style.display="";
var obj=link;
var left=obj.offsetLeft;
while((obj=obj.offsetParent)!=null){
left+=obj.offsetLeft;
/* 这里有一个问题尚未解决,因为IE7以下版本,offsetLeft与offsetTop没有将borderWidth的值加进去。
当border-width大于0时,这里就漏加了N*borderWidth. 这里遇到一个问题是,border-width的默认属性是medium,
所以没有手动设置border或者border-width时,默认为medium,用parseInt()转得到的是NAN,到底怎么解决????
var wid=obj.style.borderLeftWidth;
wid=parseInt(wid);
alert(wid||0);
left+=wid>0?wid:0;
*/
}
left+=30;
obj=link;
var top=obj.offsetTop;
var parent=obj.offsetParent;
if (window.ActiveXObject) { //IE浏览器
while(parent!=null && parent!=document.body){
top+=parent.offsetTop;
//var wid=obj.style.borderLeftWidth;
// wid=parseInt(wid);
//alert(wid||0);
//top+=wid||0;
parent=parent.offsetParent;
}
top+=35;
} else { //其他
top+=15;
}
tip.style.left=left+"px";
tip.style.top=top+"px";
tip.innerHTML="<p>offsetLeft="+left+"<br>offsetTop="+top+"</p>";
}
function chartlivess(){
var _tips = document.getElementById("myTip");
if(_tips!=null)
{
_tips.style.display="none";
}
}
</script>
</head>
<body>
<div class="report">
<div class="conts">
<div class="hrefs">
<ul id="testul" class="tes">
<li>
<a href="#" onmouseover="showtips(this)"
onmouseout="chartlivess()">click me1 </a>
</li>
<li>
<a href="#" onmouseover="showtips(this)"
onmouseout="chartlivess()">click me2 </a>
</li>
<li>
<a href="#" onmouseover="showtips(this)"
onmouseout="chartlivess()">click me3 </a>
</li>
<li>
<a href="#" onmouseover="showtips(this)"
onmouseout="chartlivess()">click me4 </a>
</li>
<li>
<a href="#" onmouseover="showtips(this)"
onmouseout="chartlivess()">click me5 </a>
</li>
</ul>
</div>
</div>
</div>
</body>
</html>
不过,目前的版本仍然存在一些问题,待解决。
因为FF的offsetLeft与offsetTop是相对body定位的,而IE则是相对上一级的,所以
1.当设置ul,li,a的height时,FF都是正确的,IE就有错位。
2.还有一个问题没有解决的是,当上级对象有borderWidth时,定位也有问题。
因为IE7以下版本offsetLeft与offsetTop没有将borderWidth的值加进去。
当border-width大于0时,这里就漏加了N*borderWidth. 这里遇到一个问题是,border-width的默认属性是medium,所以没有手动设置border或者border-width时,默认为medium,用parseInt()转得到的是NAN,到底怎么解决????
2010-1-11号更新版本,解决上面两个问题,目前测试过IE6、IE7,FireFox3.5,IE8暂时没有测试。
由于border-width如果设置的话,一般是用px,而默认为medium,似乎等同于0的效果(个人鄙见,因为我现在只计算设置为border:xxpx和border-width:xxpx的情况,在IE与FireFox下测试,似乎定位没有问题。)
修改的部分如下:
function showtips(link){
var tip=createTip();
tip.style.display="";
var obj=link;
var left=obj.offsetLeft;
while((obj=obj.offsetParent)!=null){
left+=obj.offsetLeft;
/* 这里有一个问题尚未解决,因为IE7以下版本,offsetLeft与offsetTop没有将borderWidth的值加进去。
当border-width大于0时,这里就漏加了N*borderWidth. 这里遇到一个问题是,border-width的默认属性是medium,
所以没有手动设置border或者border-width时,默认为medium,用parseInt()转得到的是NAN,到底怎么解决????
*/
var wid=0;
if (window.ActiveXObject) {
wid=obj.currentStyle.borderLeftWidth;
}else{
wid=obj.style.borderLeftWidth;
}
if(wid.indexOf("px")!=-1){
var wids=wid.split("px");
wid=parseInt(wids[0]);
//alert(wid);
left+=wid>0?wid:0;
}
}
left+=30;
obj=link;
var top=obj.offsetTop;
/*IE浏览器,因为对于FireFox游览器,offsetTop是相对于Body的,而不是相对于上级对象,
所以不需要累加父级offsetTop,并且,FireFox已经所有对象的borderWidth都已经算在offsetTop/offsetLeft中了,所以也不需要再累加
各层的borderLeftWidth/borderTopWidth
*/
if (window.ActiveXObject) {
while((obj=obj.offsetParent)!=null){
top+=obj.offsetTop;
var wid=obj.currentStyle.borderTopWidth;
if(wid.indexOf("px")!=-1){
var wids=wid.split("px");
wid=parseInt(wids[0]);
top+=wid>0?wid:0;
}
parent=parent.offsetParent;
}
top+=35;
} else { //其他
top+=15;
}
tip.style.left=left+"px";
tip.style.top=top+"px";
tip.innerHTML="<p>offsetLeft="+left+"<br>offsetTop="+top+"</p>";
}

被折叠的 条评论
为什么被折叠?



