テキスト入力値の最初の文字を選択し、スタイルシートで CSS を介してその色を変更する方法はありますか? たとえば、私は
<input type="text" name="address" value="* Property Address :" />
valueプロパティの頭文字(*)のみを選択し、CSSで赤色に変更したいです。それは実際に css で行うことができますか?
編集: カーソルがとで間違った場所に移動するバグが Chromeにあることに気付きました。他の場合でも機能します。contenteditable
::first-letter
少し前に、と<div contenteditable="true">
組み合わせて使用するための独自の (主に CSS) ソリューションを開発しました。<input type="hidden">
テキスト入力をエミュレートしますが、div です。div
がクラスの場合、text
入力は強制的に 1 行になります (それ以外の場合は a に近くなりますtextarea
)。div には、そのdata-placeholder
属性であるプレースホルダーが付属しています。属性は、div の値を保持するform-remote-input
JS にシグナルを送信します。input
要件を満たすために、 に追加::first-letter {color: #F00;}
しましたdiv
。コード スニペットを実行して、誤った入力を確認します。
function remote_input_updater(element, scope) {
var scope = typeof scope !== 'undefined' ? scope : document;
var remote_id = element.getAttribute('form-remote-input');
var remote_element = scope.querySelector("#" + remote_id);
// Load initial value
element.textContent = remote_element.value;
// Add blur event updater
var update_remote = function(e){
remote_element.value = element.textContent;
if(element.textContent == "") { // Remove extra <br>s that get added
while (element.firstChild) {
element.removeChild(element.firstChild);
}
}
}
element.addEventListener('blur', update_remote);
};
[].forEach.call(document.querySelectorAll('[form-remote-input]'), function(element){remote_input_updater(element)});
[contenteditable] {
color: #000;
border: 1px solid black;
padding: 3px;
min-height: 1.2em;
}
[contenteditable]:empty::before{
content: attr(data-placeholder);
color: #666;
}
[contenteditable=true]:empty:focus::before{
content: "\00a0";
}
[contenteditable]:focus {
outline: none;
}
/* Forces single line */
.text[contenteditable] br{
display:none;
}
.text[contenteditable] * {
display: inline;
}
#first-red::first-letter {
color: #F00;
}
<body>
<div class="text" id="first-red" data-placeholder="This is essentially an input" contenteditable="true" form-remote-input="remote-id"><!-- Must be no whitespace in here --></div>
<input type="hidden" id="remote-id" />
</body>
入力ボックスで最初の文字のスタイルを変更できるとは思いません。OS がそれを可能にしていないようです。したがって、div
withcontentEditable
プロパティを に等しくし"true"
、そのコンテンツを JavaScript で取得するか、2 つの入力を水平方向に並べる小さな回避策などを行うことができます。これを参照してください:
<html>
<head>
.leftInput{
border-bottom: 1px solid black;
border-left: 1px solid black;
border-top: 1px solid black;
border-right: 0px;
width:10px;
color:red;
}
.rightInput{
border-bottom: 1px solid black;
border-right: 1px solid black;
border-top: 1px solid black;
border-left: 0px;
margin-left: 0px;
}
</head>
<body>
<input type="text" name="address" value="* " class="leftInput" /><input type="text" name="address" value="Property Address :" class="rightInput" />
</body>
</html>
.leftInput {
border-bottom: 1px solid black;
border-left: 1px solid black;
border-top: 1px solid black;
border-right: 0px;
width: 10px;
color: red;
}
.rightInput {
border-bottom: 1px solid black;
border-right: 1px solid black;
border-top: 1px solid black;
border-left: 0px;
margin-left: 0px;
}
<input type="text" name="address" value="* " class="leftInput"
/><input type="text" name="address" value="Property Address :" class="rightInput" />
「入力タグ」を使用して行うことはできません。
div タグを使用する必要があります (参照:編集可能な DIV をテキスト フィールドのように見せるにはどうすればよいですか? )。次に、最初の文字だけに別のタグ (div など) を使用し、それにスタイルを適用します。
<html>
<head>
<style>
#input {
-moz-appearance: textfield;
-webkit-appearance: textfield;
background-color: white;
background-color: -moz-field;
border: 1px solid darkgray;
box-shadow: 1px 1px 1px 0 lightgray inset;
font: -moz-field;
font: -webkit-small-control;
margin-top: 5px;
padding: 2px 3px;
width: 398px;
}
</style>
</head>
<body>
<div id="input" contenteditable><span style="color: red;">*</span>Property Address :</div>
</body>
</html>
DivinusVox による別の解決策 (最初の文字が文字の場合にのみ機能します):
<html>
<head>
<style type='text/css'>
#input:first-letter {
color: red;
}
#input {
-moz-appearance: textfield;
-webkit-appearance: textfield;
background-color: white;
background-color: -moz-field;
border: 1px solid darkgray;
box-shadow: 1px 1px 1px 0 lightgray inset;
font: -moz-field;
font: -webkit-small-control;
margin-top: 5px;
padding: 2px 3px;
width: 398px;
}
</style>
</head>
<body>
<div id="input" contenteditable>o Property Address :</div>
</body>
</html>
入力にパディングを与え、相対位置の div で入力をラップしてから、テキスト ボックスのこのパディング内に " * " を含む絶対位置の div を追加してみてください。
jQueryまたはjavascriptを使用して、フォーカスのあるdivを非表示にし、値が空の場合はぼかしで再度表示します
<div style="position: relative">
<input type="text" style="padding-left: 20px;" name="address" value="Property Address :" onfocus="$('#placeholder1').hide();" onblur="if ($(this).val() == '') {$('#placeholder1').show();}" />
<div id="placeholder1" style="position: absolute; top: XXpx; left: XXpx; color: #123456;">*</div>
</div>
パディング、上と左の値は単なる例です。適切な値を見つける必要があります
このようにjavascriptとjqueryでこれを行うことができます
var firstLetter = $("input").val().charAt(0);
var val = $("input").val();
$("input").val(val.substr(1));
var span = "<span style='color:red'>" + firstLetter + "</span>";
$(span).insertBefore("input");