だからクリッピングマスクの使用に関するTemani Afifの答えが好きです。それは素晴らしいと思います。私は別の解決策を提案したいと思いました(少しエレガントではありません)。私はFirefoxを使用してこの問題もテストしました。テキスト領域の外側(フォーカスを失う)をクリックしても、1桁目が再表示されないか、テキスト入力の文字列が通常に戻ります。
問題はあなたが設定した文字間隔のcss属性letter-spacing: 31px;
であると私は信じています。そして、これはほとんどのブラウザが持っている「点滅」キャレットに当てはまると私が信じているという事実です。Chromeを使用すると、フォーカスを失ったときにこれを削除するように見えますが、Firefoxはフォーカスを失った後もこれを保持します。
最初の解決策は、blur()関数を手動で呼び出して、入力がフォーカスを失うようにすることでした。これはChromeで動作します(自己実行匿名関数を使用):
<input type="text" id="number_text" maxlength="6" onkeyup="(function()
{
var x = document.getElementById('number_text');
let value = x.value
if (value.length >= 6){
x.blur()
return false
}
})();"
pattern="\d{6}" value="1234" >
または、number_text入力によって次のように呼び出される定義済み関数としても:
<script>
handleMaxInput = function(){
var x = document.getElementById('number_text');
let value = x.value
if (value.length >= 6){
x.blur()
return false
}
};
</script>
<input ... id='number_text' ... onkeyup="handleMaxInput()" ... >
Chromeで少し遅れがわかりますが、Firefoxでこれを呼び出しても問題は解決しません。
基本的には、Firefoxでも同じ動作を強制できます。少し遊んでみたところ、Chromeがぼかしの文字間隔を更新/再計算していることがわかりました。私のプレイセッションは、Firefoxにこの値をプログラムで再計算させることができることを示しました:
- 入力のletter-spacing属性のインラインスタイルを別の値に変更します(number_textのCSSクラスは、ドキュメントのスタイルセクションでスタイルタグ全体を書き直すなどの手間がなければプログラムで編集できないため)。
- 入力からクラスnumber_textを削除してください。
- 1と2は交換可能です。クラス属性を「メモリに」保存せずに、Firefoxに設定したインラインスタイルのみにフォールバックする必要があります。
- インラインスタイルを削除して、number_text CSSクラスを再適用します。これにより、ブラウザは必要に応じて文字の間隔を再計算します。
コードでは、次のJavaScript関数のようになります。
handleMaxInput = function(){
var x = document.getElementById('number_text');
let value = x.value
if (value.length >= 6){ // if the input is 6 or more characters
x.classList.remove('number_text') // remove the class
x.style.letterSpacing = '0px' // reset the spacing
setTimeout(function() { // set time to let browser refresh updates
x.classList.add('number_text') // Re-add class after browser refresh
setTimeout(function() { // Remove inline-style after more reculculations
x.style.removeProperty('letter-spacing') // Remove inline style to let class styles apply
x.blur // optional, will force input field to lose focus. Else comment out to avoid that.
}, (1)); // waits 1 millisecond
}, (1)); // waits 1 millisecond
}
}
FirefoxでもChromeと同じようにちらつきが発生します。
注:タイムアウト関数は、ブラウザが更新する時間を与え、実際に必要なものを更新するためのものです。
注:関数で.blur()を呼び出してテキストボックスにフォーカスを失うか、または省略しても、数字のエラーなしで入力フィールドに表示されます。
これがあなたの概念の理解と問題の解決に役立つことを願っています。他の一部の個人は、ちらつきの全体を回避し、FirefoxとChromeの両方で動作する優れたソリューションを提供しました!