为了通过捕捉表单中的未点击来增强UX,我在每个文本字段周围的边界框上使用了以下代码:
focusMethod = function getFocus() {
document.getElementById("myTextField").focus();
}这可以很好地将焦点设置在离用户单击位置最近的文本字段上,即使不是直接在文本字段本身上。但是,文本插入点(插入符号)始终自动放置在输入的左侧,而不是最近的输入x点。
使用vanilla JS,我如何进一步找到文本插入点(插入符号)并将其移动到与用户单击的位置最接近的位置(假设字段中包含文本)?
发布于 2020-01-23 07:18:27
您可以覆盖一种较大的粗糙文本输入,然后使用它的文本定位来实现真正的输入。
否则,很难弄清楚字符的位置……字体很奇怪,我不知道js中的字体到底在哪里。
const byId = (id) => document.getElementById(id);
const on = (el, event, cb) => el.addEventListener(event, cb);
const textEl = byId("Text");
const hackEl = byId("Hack");
on(textEl, "input", () => hackEl.value = textEl.value);
on(hackEl, "click", () => {
const charFocusPos = hackEl.selectionStart;
textEl.focus();
textEl.selectionStart = textEl.selectionEnd = charFocusPos;
});#Container {
position: relative;
display: inline-block;
}
#Hack {
transform: translate(-50%, -50%) scaleY(5);
position: absolute;
top: 50%;
left: 50%;
width: 100%;
opacity: 0;
padding-top: 0px;
padding-bottom: 0px;
height: 16px;
border: none;
outline: none;
}
#Hack.showOnHover:hover {
opacity: 0.1;
}
#Hack, #Text {
font-size: 16px;
font-family: arial;
}<div id="Container">
<input type="textbox" id="Text">
<input type="textbox" id="Hack"></div>
</div>
<button onClick="byId('Hack').classList.toggle('showOnHover')">Toggle Hack Layer</div>
发布于 2020-01-23 08:48:00
你可以做到这一点。我做了一些可以作为起点的东西:
<div id="container">
<input type="text" id="input">
<br>
<br>
</div>
<script type="text/javascript">
var testInput = document.getElementById("input");
var testContainer = document.getElementById("container");
document.getElementById("container").addEventListener("click", function(event) {
testInput.focus();
var padding = 0;
console.log(event.clientX);
console.log(testInput.getBoundingClientRect().left);
console.log(testInput.getBoundingClientRect().right);
if (event.clientX > testInput.getBoundingClientRect().right) padding = (testInput.getBoundingClientRect().right * 0.8);
else if (event.clientX > testInput.getBoundingClientRect().left) padding = (event.clientX - testInput.getBoundingClientRect().left);
testInput.style["padding-left"] = padding + "px";
});
</script>和
#container {
width: 90%;
margin: auto;
background-color: gray;
}
#input {
width: 80%;
margin-top: 100px;
margin-left: 10%;
-webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
-moz-box-sizing: border-box; /* Firefox, other Gecko */
box-sizing: border-box; /* Opera/IE 8+ */
}请参阅:https://jsfiddle.net/mLqj17xe/1/
这个想法是找出光标应该在哪里,并使用它作为padding。
https://stackoverflow.com/questions/59869131
复制相似问题