`
远去的渡口
  • 浏览: 472872 次
  • 性别: Icon_minigender_2
  • 来自: 上海转北京
社区版块
存档分类
最新评论

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

阅读更多

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

}

 

分享到:
评论

相关推荐

    div+css布局制作箭头步骤流程样式 - div+css教程

    总结一下,`div+css`布局制作箭头的步骤流程包括:创建`div`元素、定义边框、调整角度、定位箭头以及可能的复杂形状实现。这不仅有助于提升网页设计技能,也有助于理解CSS的灵活性和强大性。对于志峰创业室这样的...

    div table的使用

    在现代Web开发中,`div`通常作为布局的基础,通过CSS Grid或Flexbox来创建复杂的页面结构。 其次,`table`元素则用于展示结构化的数据,如表格形式的数据。`table`包含`thead`(表头)、`tbody`(主体内容)和`...

    C#硬件+Div

    Div元素是构建网页布局的基础,它可以被用来创建复杂的网格系统、定位元素,甚至实现响应式设计,适应不同设备的屏幕尺寸。 CSS是用于控制网页元素外观的关键技术,它允许我们改变字体、颜色、大小、间距、位置等...

    asp+div模板网站

    在网页设计中,DIV通常被用作页面布局的基础,通过组合多个DIV,可以创建复杂的网页结构。 “asp+div模板网站”是一个基于ASP技术的新闻发布系统模板,利用了DIV进行页面布局。这个模板对于开发者来说,提供了快速...

    JS绘制简单流程图JS+DIV超级半成品

    在JavaScript(JS)中绘制简单流程图是一种常见的需求,特别是在创建交互式网页应用程序时。JS+DIV技术可以实现这一目标,无需依赖任何图形库。在这个“JS绘制简单流程图JS+DIV超级半成品”项目中,开发者可能已经...

    div css淘宝物流订单流程图样式代码

    在创建流程图时,每个步骤通常会被表示为一个 `div` 元素,每个 `div` 可以通过设置不同的类名来区分其样式,例如“step1”,“step2”等。 接下来,我们利用 `css` 来定义这些 `div` 的外观和布局。以下是一些关键...

    精通DIV+CSS网页样式与布局

    5. **定位**:CSS的position属性(static、relative、absolute、fixed)用于控制元素的位置,特别是在复杂布局中,绝对定位和相对定位经常被用来创建层次感和动态效果。 6. **浮动**:float属性可以使得元素在容器...

    XHTML+DIV+CSS

    3. 连接样式表:在XHTML文档中引入CSS文件,使用`&lt;link&gt;`标签链接外部样式表,或直接在`&lt;style&gt;`标签内编写内联样式。 4. 调整布局:利用CSS的布局技巧,如浮动、定位、Flexbox或Grid,调整元素的位置和大小。 5. ...

    asp.net +div +css 学院网站

    在“asp.net +div +css 学院网站”项目中,ASP.NET起到了核心的后端开发作用,负责处理用户请求、数据交互、业务逻辑和服务器端脚本。 【CSS与Div布局】 CSS(Cascading Style Sheets)是用于描述HTML或XML(包括...

    弹出可拖动的Div,里面还有树形菜单

    在IT领域,创建一个弹出且可拖动的Div元素是一项常见的需求,尤其在构建用户界面时。这个Div通常用于展示一些临时信息或者提供交互功能,比如本例中的树形菜单。下面我们将深入探讨如何实现这样的功能,并结合提供的...

    AJAX可以拖动的DIV块.rar

    4. **跨域问题**:使用AJAX时,可能会遇到跨域限制,需要理解CORS(跨源资源共享)机制来解决。 综上所述,这个压缩包中的"AJAX可以拖动的DIV块.htm"很可能是演示如何使用JavaScript和AJAX技术创建一个可拖动的DIV...

    div css制作简易订单步骤流程效果图

    在这个“div css制作简易订单步骤流程效果图”的主题中,我们将深入探讨如何利用这两个技术来创建一个清晰、易懂的订单步骤流程。 首先,理解`div`的用途至关重要。`div`(division)是一个通用的容器,可以包含...

    jtopo.rar (jtopo拓扑图两节点双线连接bug修复)

    2. **定位问题**:找出导致双线连接显示异常的具体原因,可能与线条的坐标计算、渲染顺序、重叠处理等有关。 3. **修改源码**:对存在问题的代码段进行修正,确保每条连接线都能正确地显示出来,不互相遮挡。 4. **...

    获取图片或者div上的点坐标--带例子

    标题“获取图片或者div上的点坐标--带例子”所涉及的知识点主要是如何在JavaScript中实现这一功能。这里将详细讲解这一过程,并结合描述中的应用场景——制作图片地图描边,来展开讨论。 首先,我们需要了解HTML的`...

    基于ASP的DIV+CSS 企业网站管理系统源码 ASP源码

    通过CSS(Cascading Style Sheets)样式表,我们可以对这些DIV进行布局控制,实现网页的精确定位。DIV+CSS布局是现代网页设计的主流方式,相比传统的表格布局,它具有更好的可维护性、扩展性和更高的页面加载速度。...

    精美蜂窝状图片 css+div

    虽然这是一种创新的布局方式,但在实际应用中可能会遇到性能问题,特别是在元素数量庞大的情况下。因此,优化CSS选择器、减少不必要的计算以及合理使用CSS缓存都是提高页面加载速度的关键。 总结,"精美蜂窝状图片 ...

    DIV+CSS布局大全

    - **解决问题策略** 为了克服这些问题,首先需要转变思维方式,从关注内容的语义和结构入手,而不是一开始就考虑外观设计。其次,提供一份详尽的对照表,帮助理解传统表现层属性与CSS属性之间的对应关系。 #### ...

    纯div+css制作的圆形导航

    在网页设计中,"纯div+css制作的圆形导航"是一种常见的实现方法,它通过HTML结构和CSS样式来创建一个既美观又功能完备的导航菜单,完全不依赖于JavaScript或其他图像处理技术。这种方式的优点在于代码简洁,易于维护...

    E文DIV+CSS的YAHOO小偷 -ASP源码.zip

    【标题】"E文DIV+CSS的YAHOO小偷 -ASP源码.zip"涉及到的主要技术是ASP(Active Server Pages)以及网页布局技术DIV+CSS。ASP是一种由微软开发的服务器端脚本环境,用于创建动态交互式网页。它允许开发者在HTML中嵌入...

Global site tag (gtag.js) - Google Analytics