私は以前に次のものを使用しましたが、他の何よりも画像を使用することを選択した理由は、入力に動的に追加されたテキストが混乱を引き起こし、ユーザーが編集したいときに邪魔になる可能性があるためです。画像を使用するということは、画像が常にそこにあり、ユーザーの入力の邪魔にならないことを意味します。
それはうそをついているのでjQueryでのみ書かれており、これは純粋なjsで簡単に書き直すことができ、簡単に最適化することができます。
http://jsfiddle.net/pafMg/
css:
input {
border: 1px solid black;
background: #fff;
padding: 2px;
}
マークアップ:
<input class="right-aligned" type="text" />
<input class="left-aligned" type="text" />
コード:
次のコードでは、padding-leftとpadding-rightは、使用する画像の幅を考慮に入れる必要があります。
$(function(){
/* For left aligned additions */
$('input.left-aligned')
.css({
'padding-left': '20px',
'background-image': 'url(/favicon.png)',
'background-position' : '2px center',
'background-repeat': 'no-repeat'
});
});
左揃えのバージョンは本当にシンプルですが、右揃えのバージョンはもう少し複雑になります。
$(function(){
/* For right aligned additions */
$('input.right-aligned')
.bind('keypress keyup', function(e){
var input = $(this), measure, text = input.val(), x, w, y;
/// You can calculate text width, but it's not easily cross-browser
/// easier method, inject the text to a span and measure that instead
if ( !input.data('measure') ){
/// only build our measuring span the first time
measure = $('<span />')
.hide() // hide it
.appendTo('body')
/// try and match our span to our input font
/// this could be improved
.css({
'font-weight':input.css('font-weight'),
'font-family':input.css('font-family'),
'font-size':input.css('font-size')
});
/// store the measure element for later
input.data('measure', measure );
}
/// handle if the user types white space
text = text
.replace(/\s/g,' ')
.replace(/</g,'>');
measure = input.data('measure');
measure.html(text);
w = measure.width();
y = input.width();
/// calculate the image position (minus padding)
x = w + parseInt(input.css('padding-left')) + 2;
/// take into account the scroll ability of an input
x -= ( w > y ? w - y : 0 );
/// reposition our image background on the input
input
.css({
'padding-right': '20px',
'background-image': 'url(/favicon.png)',
'background-position' : x + 'px center',
'background-repeat': 'no-repeat'
});
}).trigger('keyup');
});