【问题标题】:在输入框中输入时如何移动自定义文本光标?
【发布时间】:2022-01-23 07:56:45
【问题描述】:
在输入框输入时如何移动自定义文本光标?
.cursor {
position: relative;
}
.cursor i {
position: absolute;
width: 10px;
height: 80%;
background-color: blue;
left: 5px;
top: 10%;
animation-name: blink;
animation-duration: 1s;
animation-iteration-count: infinite;
opacity: 1;
}
@keyframes blink {
from {
opacity: 1;
}
to {
opacity: 0.5;
}
}
<div class="cursor">
<input type="text" />
<i></i>
</div>
虽然这成功地创建了一个闪烁的矩形蓝色文本光标,但一旦我在输入框中键入文本,它就会保持在相同的位置。如何修改上面的代码,让光标移动,类似于 Mac/Linux 终端?
【问题讨论】:
标签:
html
jquery
css
react-native
css-selectors
【解决方案1】:
您需要获取输入的值并将其放入隐藏的 div 中以获取 clientWidth。
确保为您的输入设置相同的字体系列和相同的字体大小以及 div“掩码”以使其正常工作。
我添加了 +3 像素以进行更正。
我使用 css css() 进行左移。
let elemDiv = document.getElementById("mask"),
elemInput = document.getElementById("typing");
elemInput.oninput = function() {
elemDiv.innerText = elemInput.value;
// css version
$(".cursor i").css({"left":(elemDiv.clientWidth + 3) + "px"});
// debug infos
console.clear();
console.log((elemDiv.clientWidth + 3) + "px");
}
.cursor {
position: relative;
}
.cursor i {
position: absolute;
width: 10px;
height: 80%;
background-color: blue;
left: 5px;
top: 10%;
animation-name: blink;
animation-duration: 1s;
animation-iteration-count: infinite;
opacity: 1;
}
#typing {
width:100%;
font-family:arial;
font-size:12px;
}
#mask {
font-family:arial;
font-size:12px;
width: auto;
display: inline-block;
visibility: hidden;
position: fixed;
overflow:auto;
}
@keyframes blink {
from {
opacity: 1;
}
to {
opacity: 0.5;
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="cursor">
<input type="text" id="typing" />
<i></i>
</div>
<div id='mask'></div>
但您也可以使用animate()。
let elemDiv = document.getElementById("mask"),
elemInput = document.getElementById("typing");
elemInput.oninput = function() {
elemDiv.innerText = elemInput.value;
// animated version
$(".cursor i").animate({"left":(elemDiv.clientWidth + 3) + "px"}, "fast");
// debug infos
console.clear();
console.log((elemDiv.clientWidth + 3) + "px");
}
.cursor {
position: relative;
}
.cursor i {
position: absolute;
width: 10px;
height: 80%;
background-color: blue;
left: 5px;
top: 10%;
animation-name: blink;
animation-duration: 1s;
animation-iteration-count: infinite;
opacity: 1;
}
#typing {
width:100%;
font-family:arial;
font-size:12px;
}
#mask {
font-family:arial;
font-size:12px;
width: auto;
display: inline-block;
visibility: hidden;
position: fixed;
overflow:auto;
}
@keyframes blink {
from {
opacity: 1;
}
to {
opacity: 0.5;
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="cursor">
<input type="text" id="typing" />
<i></i>
</div>
<div id='mask'></div>