1
A
回答
2
我不認爲這是這麼難。我做了一個快速示例,它適用於除Safari之外的大多數現代瀏覽器。 它將插入符號繪製在畫布上,並將其設置爲輸入的背景,並將其設置爲從瀏覽器插入位置計算出的位置。
它檢查瀏覽器是否支持css屬性,如果沒有,它不會做任何事情,因爲系統插入符號和我們的脫字符在同一時間都可見。從我測試的瀏覽器中,只有Safari不支持它。
$("input").on('change blur mouseup focus keydown keyup', function(evt) {
var $el = $(evt.target);
//check if the carret can be hidden
//AFAIK from the modern mainstream browsers
//only Safari doesn't support caret-color
if (!$el.css("caret-color")) return;
var caretIndex = $el[0].selectionStart;
var textBeforeCarret = $el.val().substring(0, caretIndex);
var bgr = getBackgroundStyle($el, textBeforeCarret);
$el.css("background", bgr);
clearInterval(window.blinkInterval);
//just an examplethis should be in a module scope, not on window level
window.blinkInterval = setInterval(blink, 600);
})
function blink() {
$("input").each((index, el) => {
var $el = $(el);
if ($el.css("background-blend-mode") != "normal") {
$el.css("background-blend-mode", "normal");
} else {
$el.css("background-blend-mode", "color-burn");
}
});
}
function getBackgroundStyle($el, text) {
var fontSize = $el.css("font-size");
var fontFamily = $el.css("font-family");
var font = fontSize + " " + fontFamily;
var canvas = $el.data("carretCanvas");
//cache the canvas for performance reasons
//it is a good idea to invalidate if the input size changes because of the browser text resize/zoom)
if (canvas == null) {
canvas = document.createElement("canvas");
$el.data("carretCanvas", canvas);
var ctx = canvas.getContext("2d");
ctx.font = font;
ctx.strokeStyle = $el.css("color");
ctx.lineWidth = Math.ceil(parseInt(fontSize)/5);
ctx.beginPath();
ctx.moveTo(0, 0);
//aproximate width of the caret
ctx.lineTo(parseInt(fontSize)/2, 0);
ctx.stroke();
}
var offsetLeft = canvas.getContext("2d").measureText(text).width + parseInt($el.css("padding-left"));
return "#fff url(" + canvas.toDataURL() + ") no-repeat " +
(offsetLeft - $el.scrollLeft()) + "px " +
($el.height() + parseInt($el.css("padding-top"))) + "px";
}
input {
caret-color: transparent;
padding: 3px;
font-size: 15px;
color: #2795EE;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" />
如果有興趣,我可以清理了一下,在一個jQuery插件包裹。
編輯:忘了閃爍,所以我添加了它。更好的方法是將它添加爲css動畫,在這種情況下,插入符應位於輸入中的單獨html元素中。
相關問題
- 1. 怎樣才能使文字輸出變得輕鬆簡單?
- 2. 我怎樣才能改變一個數字,字符串
- 3. 我怎樣才能擺脫選擇輸入邊界
- 4. 我怎樣才能比較用戶已輸入的字符串?
- 5. 我怎樣才能輸出這個函數是一個簡單的字符串?
- 6. 我怎樣才能擺脫路徑查詢字符串
- 7. 我怎樣才能改變數獨
- 8. 我怎樣才能改變這與jquery?
- 9. 我怎樣才能改變IE
- 10. 我怎樣才能改變/在商店
- 11. 我怎樣才能改變ATTR鏈接
- 12. 我怎樣才能改變「UPDATA」更新
- 13. 我怎樣才能改變writer.println
- 14. 我怎樣才能改變搜索條
- 15. 我怎樣才能擺脫「空白」
- 16. 我怎樣才能擺脫撇號?
- 17. 我怎樣才能擺脫0xFEEFEE在VC
- 18. 我怎樣才能增加輸入控制動態... ??? js
- 19. 我怎樣才能得到一個js變量插入iframe中
- 20. 我怎樣才能從字符串
- 21. 我怎樣才能子串字符串?
- 22. 我怎樣才能打印字符值?
- 23. 我怎樣才能從字符串
- 24. HTML-CSS-JS我怎樣才能把它變成一個'文字輪播'?
- 25. 我怎樣才能改變數字到字母C#
- 26. 我怎樣才能「地圖」的字典來改變在Python
- 27. 我怎樣才能從字符串中獲得可變數字?
- 28. 我怎樣才能真正擺脫eclipse classpath變量
- 29. 我怎樣才能讀取JS
- 30. 我怎樣才能返回gzip壓縮的CSS/JS
**否**。許多人在你之前(包括我)嘗試失敗。如果你真的想追求它(祝你好運),你需要一個帶有不可見文本的文本框,在它下面有一個'div',然後更新以包含文本,然後另一個'div'按照你想要的方式設置插入符號以查看用戶鍵入和選擇哪個移動。雖然,我認爲WebKit瀏覽器本身可以做到這一點... – Toastrackenigma
[Styling text input caret]的可能重複(https://stackoverflow.com/questions/7339333/styling-text-input-caret) – Toastrackenigma