绝对定位的输入标签悬停问题

Posted

技术标签:

【中文标题】绝对定位的输入标签悬停问题【英文标题】:Input label hover issue with absolute positioning 【发布时间】:2015-12-04 09:23:26 【问题描述】:

我有<input type="text"/>:hover 上的样式,例如:

input:hover 
    border-color: red;

我想在我的输入中添加搜索图标。当我将鼠标悬停在图标上时,输入:hover 样式效果很好,试试吧:

JSFiddle

input, span 
    display: inline-block;
    vertical-align: middle;
    height: 30px;


input:hover 
    border-color: red;


span 
    background: url(https://cdn1.iconfinder.com/data/icons/hawcons/32/698627-icon-111-search-128.png) 50% 50%/100% 100% no-repeat;
    width: 25px;
    height: 25px;
<label>
    <input type="text"/>
    <span></span>
</label>

但如果我将搜索图标直观地放在输入上,则当我将图标悬停时,输入 :hover 样式将不适用:

JSFiddle

label 
    position: relative;


input, span 
    display: inline-block;
    vertical-align: middle;
    height: 30px;


input:hover 
    border-color: red;


span 
    background: url(https://cdn1.iconfinder.com/data/icons/hawcons/32/698627-icon-111-search-128.png) 50% 50%/100% 100% no-repeat;
    width: 25px;
    height: 25px;
    position: absolute;
    top: -4px;
    right: 4px;
<label>
    <input type="text"/>
    <span></span>
</label>

问题:我可以解决这个问题吗?当我将输入悬停在任何点时,我想应用输入 :hover 样式。

PS 我知道我可以在&lt;label&gt; 上设置:hover 样式或使用javascript/jQuery 设置它,但我不想这样做,因为我有很多使用@987654335 的案例@ 而在其他情况下,我没有&lt;label&gt; 和一个图标,只有&lt;input&gt;。我想要没有它的解决方案。

【问题讨论】:

【参考方案1】:

您可以为输入添加透明背景并将图标绝对放置在其下方(z-index 较小)。

    * 
        box-sizing: border-box;
    
    label 
        position: relative;
        display: inline-block;
        background: white;
    
    input 
        width: 100%;
        border: 1px solid #000;
        height: 30px;
        outline: none;
        position: relative;
        z-index: 2;
        background: transparent;
    
    input:hover 
        border-color: red;
    
    span 
        background: url(https://cdn1.iconfinder.com/data/icons/hawcons/32/698627-icon-111-search-128.png) 50% 50%/100% 100% no-repeat;
        width: 25px;
        height: 25px;
        margin-top: -13px;
        position: absolute;
        top: 50%;
        right: 4px;
        z-index: 1;
    

这是Fiddle

【讨论】:

跨浏览器支持的好解决方案。【参考方案2】:

一种解决方案是添加 poiter-events 规则:

span 
    background: url(https://cdn1.iconfinder.com/data/icons/hawcons/32/698627-icon-111-search-128.png) 50% 50%/100% 100% no-repeat;
    width: 25px;
    height: 25px;
    position: absolute;
    top: -4px;
    right: 4px;
    pointer-events: none; <!-- this line -->

演示:http://jsfiddle.net/kfgggd1b/4/

但不是很好支持:http://caniuse.com/#search=pointer

另一种方法是通过在输入之前放置 span 来稍微重组 html,然后

span:hover + input, 
input:hover 
    border-color: red;

span 
    background: url(https://cdn1.iconfinder.com/data/icons/hawcons/32/698627-icon-111-search-128.png) 50% 50%/100% 100% no-repeat;
    width: 25px;
    height: 25px;
    position: absolute;
    top: -4px;
    right: 4px;

演示:http://jsfiddle.net/kfgggd1b/5/

【讨论】:

pointer-events: none 真的很好。对于我的情况,我更喜欢这种解决方案。

以上是关于绝对定位的输入标签悬停问题的主要内容,如果未能解决你的问题,请参考以下文章

absolut绝对定位的非绝对定位用法

如何使绝对定位的图像区域地图可以用鼠标点击?

(CSS)如何在 <img> 标签上定位文本(带背景颜色)而不使用绝对定位

如何使绝对定位的元素响应?

css中,绝对定位和相对定位是啥意思?通常都是怎么用?

相对定位 绝对定位 relative absolute position 图片定位a标签