2014-09-26 134 views
1

我想要做一个组合类似的东西,我需要在输入上方对齐div。javascript:将绝对div对齐到另一个div上

我该如何计算正确的bottom css property的列表才能在输入上方显示?

示例代码:

HTML

<div style="position:absolute;top:150px; left:150px;"> 
    <input/><span class="btn">V</span> 
</div> 
<div class="list" style="display:none;"> 
    <ul> 
     <li>Item 1</li> 
     <li>Item 2</li> 
     <li>Item 3</li> 
     <li>Item 4</li> 
    </ul> 
</div> 

CSS

.btn { 
    width: 10px; 
    height:10px; 
    background-color: black; 
    cursor: pointer; 
} 

.list { 
    position: absolute; 
    border: solid 1px black; 
} 

JS

$('.btn').click(function(){ 
    var list = $('.list'); 
    list.show(); 

    var inputOffset = $('input').offset(); 

    list.css({ 
     bottom: inputOffset.top, 
     left: inputOffset.left 
    }); 
}); 

FIDDLE

注: 的投入将工作就像一个过滤器,这样列表的高度将发生变化。 我想让浏览器保持列表对齐。这就是为什么我想在列表中设置正确的bottom值。

+0

如何纠正任何错误?请阅读您自己的问题并更正。 – spender 2014-09-26 13:55:25

+0

所以你试图让列表直接出现在输入和按钮之上? – sma 2014-09-26 13:57:25

回答

0

使用top代替bottom和减去listinput位置的高度:

list.css({ 
    top: inputOffset.top - list.outerHeight(), 
    left: inputOffset.left 
}); 

http://jsfiddle.net/kdez58q9/2/

enter image description here

+0

这很好,但输入将像过滤器一样工作,因此列表的高度将会改变。我想让浏览器保持列表对齐。这就是为什么我想在列表中设置适当的底部值。 – Levi 2014-09-26 14:19:24

0

你可以用CSS做

http://jsfiddle.net/Rykus0/kdez58q9/3/

(只注意到你想在上面输入...以下是有一些调整,更新的小提琴做到这一点:http://jsfiddle.net/Rykus0/kdez58q9/5/

HTML

<div class="dropdown"> 
    <input/><span class="btn">V</span> 
    <div class="list" style="display:none;"> 
     <ul> 
      <li>Item 1</li> 
      <li>Item 2</li> 
      <li>Item 3</li> 
      <li>Item 4</li> 
     </ul> 
    </div> 
</div> 

CSS

.btn { 
    width: 10px; 
    height:10px; 
    background-color: black; 
    cursor: pointer; 
} 

.list { 
    position: absolute; 
    border: solid 1px black; 

    /* To make the list on top, change to bottom: 100%;*/ 
    top: 100%; 

    left: 0; 
} 

.dropdown { 
    position: relative; 

    /* If you want the list on top, be sure to add some space above the input */ 
} 

JS

$('.btn').on('click', function(){ 
    $('.list').toggle(); 
}); 
+1

看起来不错,但我的组件并不那么简单。该列表将作为身体的孩子呈现,但输入和按钮可以在dom中的任何级别上。 – Levi 2014-09-26 14:23:43

+0

我明白了,所以这两个可能无法在DOM中拥有相同的祖先。我不确定你的浏览器需求是什么,但你可以查看HTML5'datalist'元素并输入'list'属性。这是来自Wufoo http://www.wufoo.com/html5/attributes/05-list.html的演示。这里是一个polyfills列表:https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills#datalist – 2014-09-26 18:49:35