前提・実現したいこと
inputのような「範囲を超えた分を左右キーで表示」を、divに実装したいです。
たとえば次のコードならば、範囲を超えた「さしすせそ」あたりも左右キーで表示させることができますよね?
<input type="text" value="あいうえおかきくけこさしすせそ">このような機能をdivに対しても実装したいと考えております。
尚、divの中身はtextareaの入力値をコピーしたものになります。
発生している問題
下記のソースコードですが、表示用のdivの文字が長いとき、見えなくなってしまうのが問題です。
先のinputでいえば「さしすせそ」あたりが見えなくなってしまうということです。
これを解決し、inputのような「範囲を超えた分を左右キーで表示」をdivにも実装したいわけです。
該当のソースコード
html
1 <div class="box"> 2 <textarea class="dammy"></textarea> 3 <div class="copy"></div> 4 </div>
css
1 .box { 2 position: relative; 3 width: 200px; 4 height: 40px; 5 margin: 0; 6 } 7 .dammy, 8 .copy { 9 border: none; 10 padding: 0.75rem 1rem; 11 width: 100%; 12 height: 40px; 13 line-height: 1.5; 14 min-height: 40px; 15 font-size: 1.5rem; 16 font-family: sans-serif; 17 white-space: nowrap; 18 overflow: hidden; 19 } 20 .dammy { 21 position: absolute; 22 z-index: 1; 23 caret-color: blue; 24 border: none; 25 background: transparent; 26 color: transparent; 27 resize: none; 28 } 29 .copy { 30 height: auto; 31 position: relative; 32 z-index: 0; 33 background: #ddd; 34 } 35 .copy .within { 36 color: blue; 37 white-space: nowrap; 38 display: inline; 39 } 40 .copy .overed { 41 color: red; 42 white-space: nowrap; 43 display: inline; 44 }
jquery
1 // 入力 2 $( document ).on( 'input', '.dammy', function( e ){ 3 const $dammy = $( this ); 4 // 改行禁止 5 enter( $dammy, e ); 6 // コピー 7 const lim = 5; 8 copy( $dammy, lim ); 9 }); 10 11 // 改行禁止 12 function enter( $dammy, e ){ 13 $dammy.on( 'keydown', function( e ) { 14 if ( e.which == 13 ) { return false; } 15 }); 16 const val = $dammy.val(); 17 const reg = new RegExp( "[\r\n]", "g" ); 18 if ( val.match(reg) ) { 19 const replace = val.replace( reg, '' ); 20 $dammy.val( replace ); 21 } 22 } 23 24 // コピー 25 function copy( $dammy, lim ){ 26 const $copy = $dammy.next( '.copy' ); 27 const val = $dammy.val(); 28 if ( val.length > lim ) { 29 const within = val.substr( 0, lim ); 30 const overed = val.slice( lim ); 31 $copy.html('<div class="within">' +within+ '</div>'); 32 $copy.append('<div class="overed">' +overed+ '</div>'); 33 } 34 else{ 35 $copy.html('<div><div class="within">' +val+ '</div></div>'); 36 } 37 }
試したこと
上は「textareaの入力値をdivにコピーする」という方法ですが、他にも「contenteditableをtrueにする」という方法を試しました。これならば「範囲を超えた分を左右キーで表示」が可能です。
ですが、お詳しい方ならご存じかと思いますが、HTMLを加えるとキャレット位置がズレてしまい修正が困難であったり、その他いろいろな点で問題がございましたので見送りました。
補足情報(FW/ツールのバージョンなど)
補足情報は特に現状ではありませんが、質問内容に不足などございましたら仰ってください。
質問は以上になります。ご協力いただけましたら幸甚に存じます。
何卒よろしくお願い致します。
回答2件
あなたの回答
tips
プレビュー