teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記:選択の動作について

2019/10/08 08:37

投稿

mix-peach
mix-peach

スコア1910

answer CHANGED
@@ -70,4 +70,75 @@
70
70
 
71
71
  ※ windowsのChrome、Firefox、IE11、Edgeで簡単に動作確認はしましたが、ちょっとしか動かしてみてないので、もし不具合等ございましたらご容赦を。。
72
72
 
73
- ご参考までに。。^^
73
+ ご参考までに。。^^
74
+
75
+
76
+ ---
77
+
78
+ コメント欄で話に出た「選択の動作」について追記します。
79
+
80
+ 現状の入力欄は、```textarea```で、```overflow:hidden```に設定されているため、
81
+ そもそもこの入力欄自体が、話にでたような「選択の動作」を行ってくれません。
82
+ なので、これを実現するためには、```textarea```自体に工夫が必要になります。
83
+
84
+ 試しに、
85
+ マウスをクリックしてから離すまでの間、```textarea```の左右のスクロールを自動で調整するようにしてみました。
86
+
87
+ ```javascript
88
+ var scroller = false, dammy = false, mouse = false;
89
+
90
+ $( document ).on('mousedown', '.dammy', function(){
91
+ //.dammyの上でマウスクリックが始まった場合に、自動スクロールの処理を繰り返し動作させます
92
+ dammy = this;
93
+ scroller = setInterval(dammy_scroll, 20);
94
+ }).on('mousemove', function(){
95
+ //画面内で移動したマウスのポジションを使いたいのでここで保持しておきます。
96
+ mouse = event;
97
+ }).on('mouseup', function(){
98
+ //どこかでマウスクリックが終わったら、繰り返し処理を削除します。
99
+ if(scroller){
100
+ scroller = clearInterval(scroller);
101
+ }
102
+ dammy = false;
103
+ });
104
+
105
+ function dammy_scroll(){
106
+ if(!dammy){
107
+ return ;
108
+ }
109
+ if($(dammy).offset().left > mouse.clientX){ //入力欄エリアよりも、マウスが左側にいる
110
+ $(dammy).scrollLeft($(dammy).scrollLeft() - 5);
111
+ }else if(($(dammy).offset().left + $(dammy).width()) < mouse.clientX){//入力欄エリアよりも、マウスが右側にいる
112
+ $(dammy).scrollLeft($('.dammy').scrollLeft() + 5);
113
+ }
114
+ //divのスクロール量を、textareaに合わせます。
115
+ $(dammy).next('.copy').scrollLeft($(dammy).scrollLeft());
116
+ }
117
+
118
+ ```
119
+ 自動のスクロールを5pxにしたので、通常の「選択の動作」よりも若干ゆっくりですが、
120
+ 大体似たような感じになった気がします。
121
+
122
+ ちなみに。
123
+
124
+ ●```textarea```の、```overflow:hidden```を削除する(これだと、幅を超える文字数を入力した時に、スクロールバーが見えてしまいますので、そちらを隠す方法を検討する必要がありますね・・)
125
+ ●```textarea```ではなく```input```に変更する
126
+
127
+ のどちらかが可能なのであれば、
128
+ textarea/input自体が、話に出た「選択の動作」をしてくれるので、上記のようなコードは不要となり、
129
+
130
+ ```javascript
131
+ var dammy= false;
132
+ //画面外でマウスクリックが終わった時も反応したいので、イベント設定対象はdocumentに。
133
+ $(document).on('mousedown', '.dammy',function(){
134
+ dammy= this;
135
+ }).on('mouseup', function(){
136
+ if(dammy)
137
+ $(dammy).next('.copy').scrollLeft($(dammy).scrollLeft());
138
+ }
139
+ dammy = false;
140
+ });
141
+ ```
142
+ とするだけでも、再現は出来そうでしたよ。
143
+
144
+ ※追記のコードは、windowsのChromeで軽く動作確認しただけのものなので、その点はご了承を。