使用绝对定位和虚拟元素,您可以非常准确地完成此操作。
我解决这个问题的方法是使用一个包含输入当前值的虚拟(不可见)内联元素。确保此元素具有完全相同的字体设置,我们可以轻松测量其宽度,然后我们可以使用它来抵消自动完成值。
输入字段和自动完成元素都绝对定位在相对定位的容器中,因此它们重叠。我给自动完成一个低于输入字段的 z-index 并使输入的背景透明,因此自动完成不会干扰单击输入字段。
我使用 text-indent 将自动完成文本定位在右侧,但您也可以使用 left 属性来实际移动元素。
HTML
<div id="container">
<input type="text" id="foo">
<div id="ac"></div>
<span id="dummy"></span>
</div>
CSS
#container { position: relative; }
#foo, #ac, #dummy {
font-family: monospace;
font-size: 16px;
}
#foo, #ac {
position: absolute;
top: 0;
left: 0;
}
#foo {
z-index: 2;
border: solid 1px black;
background: transparent;
}
#ac {
top: 1px;
left: 2px;
z-index: 1;
color: #999;
}
#dummy { visibility: hidden; }
JavaScript
(使用 jQuery,但应该明白这一点)
$('#foo').keyup(function(event) {
//get autocomplete value
var autoComplete = dummyAutoComplete($(this).val());
//if a value is found, show it in #ac and adjust position
if (autoComplete !== null) {
//add in value and make visible
$('#ac').html(autoComplete).removeClass('hidden');
//dummy gets the same value as the input, to measure its width
$('#dummy').html($(this).val());
//add autocomplete text-indent based on dummy width + some adjustmet
$('#ac').css('text-indent', $('#dummy').outerWidth() + 'px');
} else {
//hide autocomplete
$('#ac').html('').addClass('hidden');
}
);
我有一个在 jsfiddle 上运行的示例。