论坛首页 入门技术论坛

在链接处创建DIV,定位问题解决

浏览 2017 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-08   最后修改:2010-01-11

最近在研究指定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>";

}

 

论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics