那么我该怎么做呢?我需要在另一个div 上方设置/停靠一个div 元素(包含一些其他div 和表单对象(。对接div 充当某种输入框对话框,它应该出现在您单击的元素的正上方,就我而言,我将 onClick()
事件设置在...
Click <span onClick="showInputbox()">here</span> to set value
元素。
不确定这是否可以仅使用 CSS 实现,但我将不胜感激任何帮助。提前非常感谢!
编辑:我实际上在定位方面遇到了问题:将一个元素(我应该说(放在另一个元素(标签或跨度文本元素(之上,而不是显示隐藏元素。
至于剧本:
function showInputbox(){
var txt = document.getElementById("txtHere").style;
var dlgInput = document.getElementById("dlgInput").style;
dlgInput.top = txt.top + dlgInput.height;
dlgInput.left = txt.left;
dlgInput.visibility = "visible";
}
这行不通,我的意思是,.top
和.left
总是显示null
,我做错了什么?
由于你想将两个同级divs
一个放在另一个之上,你可以利用它们具有相同父级的事实并使用 CSS 进行定位。
第一个示例可以在这里看到。这是做什么的:
- HTML 是一个简单的结构,正如您所说,具有 2 个具有共同父级的 2
divs
。 - 在CSS中,我为
divs
和背景提供了宽度和高度。另外,我将开头应该隐藏的第一个div
的display
设置为none
. - 我还将隐藏
div
设置为position:absolute
.这允许我使用诸如bottom
、left
、right
、top
之类的东西。 -
您可以看到我向父元素添加了
position:relative
。我这样做是因为position:absolute
将相对于position
为relative
或absolute
的第一个父元素进行定位。 -
比我使用 jQuery 库添加
onClick()
事件,该事件将在单击第二个div
时将display:block
添加到隐藏div
。 -
确保在 DOM 完全加载时添加
onClick()
事件(DomReady,在发布的 jsFiddle 中选择,使用 jQuery,您有ready
事件(。
注意:jQuery部分也可以只用javascript完成,但我建议使用它,因为它节省了大量的工作时间,而且它真的很常见。
更新:
http://jsfiddle.net/GLf4X/5/
.HTML:
<div id="parent">
<div id="child1">
</div>
<div id="child2">
</div>
<div id="child3">
</div>
</div>
.CSS:
#child1{
width:300px;
height:50px;
background:#333;
display:none;
position:absolute;
bottom:100%;
}
#child2{
width:300px;
height:50px;
background:#666;
margin-bottom:100px;
}
#child3{
width:300px;
height:50px;
background:#999;
}
#parent{
margin:60px auto;
position:relative;
}
Javascript:
function getOffset( el ) {
var offset = { top: 0, left:0 };
if( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {
offset.left = el.offsetLeft - el.scrollLeft;
offset.top = el.offsetTop - el.scrollTop;
}
return offset;
}
function displayAboveElement(event){
event.stopPropagation();
var divToShow = document.getElementById('child1'),
clickTarget = event.target;
offset = getOffset(clickTarget);
divToShow.style.display = 'block';
console.log(clickTarget.style);
divToShow.style.top = (offset.top - clickTarget.clientHeight) + 'px';
divToShow.style.left = offset.left + 'px';
}
document.getElementById('child2').onclick = displayAboveElement;
document.getElementById('child3').onclick = displayAboveElement;
你的问题是什么:
- 您正在尝试从未设置的元素中读取
left
和top
。这就是为什么它们是空的。 -
left
和top
仅对position:absolute
元素有效。
据 - 我所知,元素的
style
返回内联样式属性,我认为您不希望这样做。
如您所见,在没有库的情况下编写 javascript 时需要考虑很多事情(此外,您必须支持 4-5 个浏览器,在一个浏览器中工作的代码可能无法在另一个浏览器中工作(。这就是为什么我建议使用像jQuery这样的库。
我做了什么:
- 计算单击元素相对于其直接父级的顶部和左侧偏移量。
- 将这些值作为内联样式添加到必须显示的
div
。