質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

0回答

801閲覧

テキストエリアの角に要素が追従できるようにしたい

rei78087487

総合スコア12

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/08/11 07:36

概要:

◆操作
//全体ソースコード参照
・ダブルクリックで要素を作成
・作成した要素をクリックでアクティブ状態にすると角に四角い要素が表示される
・テキストエリアをドラッグすると移動でき、角の要素も追従して移動する
・角をドラッグするとテキストエリアが拡大・縮小する
・右クリックでメニューが表示される
・角度メニューを選択して値を変更する事により、テキストエリアの角度が変わる

◆角の要素追従によるイベントの動き
・テキストエリアの移動による角の要素の追従 →マウスムーブイベント
・角の要素の移動によるテキストエリアの拡大・縮小 →マウスムーブイベント
・角度メニューによるテキストエリアの角度変更 →クリックイベント
・文字入力時のテキストエリア拡大による、角の要素(左下、右下)による移動 →インプットイベント

やりたいこと:

角度が変わった状態でも、角の要素がテキストエリアの四隅に追従できるようにしたい。

通常の状態だと、角の要素はテキストエリアに追従できるようになっているが、
角度が変わると角の要素の追従が上手くいかない。

試してみたこと:

角の要素
左上: lt
右上: rt
右下: rb
左下: lb

試しに角度メニューより、
テキストエリアの左上の座標を取得して、その値をlbに入れることにより、追従できないか試みてみた。
active.parentNode.querySelector('.lt').style.left = parseInt(getComputedStyle(active).left) + 'px';
active.parentNode.querySelector('.lt').style.top = parseInt(getComputedStyle(active).top) + 'px';
この方法で値を取得は出来たが、角度メニューのイベントを行っても値は変化せず固定されたままだった。

次の方法として、
前回はstyleの値を取得しようとしたが、今回は座標位置を取得しようとして、各要素の座標位置を減算しながら値を取得しようとした。
active.parentNode.querySelector('.lt').style.left = active.getBoundingClientRect().left - active.closest('.canvas-parent').getBoundingClientRect().left - 5 + 'px';
active.parentNode.querySelector('.lt').style.top = active.getBoundingClientRect().top - active.closest('.canvas-parent').getBoundingClientRect().top

角度メニューを行う度ににlbの要素は移動したが、テキストエリアの角度が90度以上になると何故か移動した位置を逆に移動し始めた。
可能性として回転して角の位置が変わる事により、lb→rbの位置として認識される?

ご教示頂きたく何卒お願い致します。

全体ソースコード:

https://codepen.io/mio-rei/pen/abWXNrd

ソースコード抜粋:

JavaScript

1// 角度メニュー 矢印↑クリック 2 const angleUp = document.querySelector('.agup-arrow'); 3 4 angleUp.onclick = () => { 5 if(inputAngle.value >= 360) { 6 alert('359以上の数値は入力できません。'); 7 return; 8 } 9 if (!document.querySelector('.ip-check') && 10 !document.querySelector('.ip-check2')) { 11 const active = document.querySelector('.active'); 12 active.style.transform = `rotate(${Number(inputAngle.value)}deg)`; 13 active.parentNode.querySelector('.lt').style.transform = `rotate(${Number(inputAngle.value)}deg)`; 14 15 // active.parentNode.querySelector('.lt').style.left = parseInt(getComputedStyle(active).left) + 'px'; 16 // active.parentNode.querySelector('.lt').style.top = parseInt(getComputedStyle(active).top) + 'px'; 17 active.parentNode.querySelector('.lt').style.left = active.getBoundingClientRect().left - active.closest('.canvas-parent').getBoundingClientRect().left - 5 + 'px'; 18 active.parentNode.querySelector('.lt').style.top = active.getBoundingClientRect().top - active.closest('.canvas-parent').getBoundingClientRect().top - 5 + 'px'; 19 20 21 22 } 23 24 for (const cks of checkAll) { 25 if (cks.checked == true) { 26 cks.nextElementSibling.style.transform = `rotate(${Number(inputAngle.value)}deg)`; 27 } 28 } 29 for (const cks2 of checkAll2) { 30 if (cks2.checked == true) { 31 cks2.nextElementSibling.style.transform = `rotate(${Number(inputAngle.value)}deg)`; 32 } 33 } 34 inputAngle.value = Number(inputAngle.value) + 1;
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問