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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

2444閲覧

[JavaScript, jQuery]オブジェクトのサイズを変更させつつ、指定した方向に移動させたい

dokudoku

総合スコア13

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

1クリップ

投稿2018/10/30 14:33

編集2018/11/02 04:49

前提・実現したいこと

JavascriptかjQueryを用いて、オブジェクトのサイズを変更させつつ、指定した方向に移動させたいです。

現段階では、ボタンをクリックすると指定した場所に画像を表示させることができています。

現段階

上記の画像のボタン部分をクリックすると、赤の丸が緑の丸の部分へ、緑の丸が黄色の丸の部分へ、黄色の丸が赤の丸の部分へ移動します。

これを、大きさを変えつつ、指定した場所へ移動させたいです。

おそらく、指定場所の座標を取得して、サイズを変更しつつ移動させるのだと思いますが、どう手を付けて良いか全く分からない状態です。

何卒、ご回答の程よろしくお願いいたします。

javascript

1window.onload = function(){ 2 photo_change(); 3}; 4 5function photo_change(){ 6 var btn = document.getElementById("next-btn"); 7 btn.onclick = function(){ 8 var photos = document.getElementsByClassName("photos") 9 for (var i = 0; i < photos.length; i++) { 10 var next_num = photos[i].src[59] - 1; 11 next_num = parseInt(next_num) 12 if(next_num == 0){ 13 next_num = 3; 14 }; 15 photos[i].src = "images/photo"+next_num+".jpg"; 16 }; 17 }; 18}

###補足
皆様、ご回答ありがとうございます。

説明不足で申し訳ありません。
見にくく、無駄のあるコードかと思いますが、記載しました。
流れとしては、黒いボタンを押す→photo_changeが起動する→それぞれの画像のパスの番号(59番目)を取得する→次の表示領域に画像を移動させる
となっています。
座標の取得と移動、サイズの変更等はまだ試しておりません。
そもそもタイトルに示したことが実現できるのかどうかも分かりませんでしたので、質問させていただきました。

何をどうしたいのかというと、指定した場所へのスムーズな移動とそれに伴うサイズ変更です。
具体的には、赤の丸を緑の丸がある場所へサイズを変更しながら移動(緑の丸を黄色の丸がある場所へサイズを変更しながら移動、黄色の丸をサイズを変更しながら赤い丸がある場所へ移動)といった感じのサイクルを、黒ボタンを押すごとに実現させたいです。

このような説明で大丈夫でしょうか...?
分かりにくくて申し訳ございません。

何卒、ご回答の程よろしくお願いいたします。

###試したこと
プログラミングを始めてまだ1週間ちょっとなので、本当に無駄が多いコードだと思います...。
見にくくて申し訳ございません。

一応、それぞれのオブジェクトの座標を取得し、サイズ変更することはできました。
しかし、オブジェクト間の距離を測ってから移動させることができません。

JavaScript

1function Test(){ 2 var btn = document.getElementById("next-btn"); 3 btn.onclick = function(){ 4 //3つの円を取得 5 var photos = document.getElementsByClassName("photos") 6 //サイズ変更と移動のための変数を初期化 7 var now_width = []; //幅 8 var next_width = []; 9 var now_height = []; //高さ 10 var next_height = []; 11 var now_pos_obj = []; //座標オブジェクト 12 var next_pos_obj = []; 13 var now_left = []; //画面左からの距離 14 var next_left = []; 15 var now_top = []; //画面上からの距離 16 var next_top = []; 17 var distance_x = []; //自分自身と次に移動すべきオブジェクト間の距離 18 var distance_y = []; 19 20 //クリック時の座標を取得 21 //自分自身の座標と次に移動すべきオブジェクトの座標を取得 22 for (var i = 0; i < photos.length; i++) { 23 var next_num = i + 1; 24 if(next_num == 3){ 25 next_num = 0; 26 }; 27 28 now_pos_obj.push(photos[i].getBoundingClientRect()); 29 next_pos_obj.push(photos[next_num].getBoundingClientRect()); 30 }; 31 32 //移動に必要な情報を取得 33 for(var j = 0; j < 3; j++){ 34 //次のサイズを取得 35 next_width.push(next_pos_obj[j].width.toString()); 36 next_height.push(next_pos_obj[j].height.toString()); 37 38 //距離を求めるための値を取得 39 now_left.push(now_pos_obj[j].left); 40 next_left.push(next_pos_obj[j].left); 41 now_top.push(now_pos_obj[j].top); 42 next_top.push(next_pos_obj[j].top); 43 }; 44 45   //現在地から次の目的地までの距離を算出 46 for(var k = 0; k < 3; k++){ 47  //横方向 48 distance_x.push((next_left[k] - now_left[k]).toString()); 49 //縦方向 50 distance_y.push((next_top[k] - now_top[k]).toString()); 51 52 //それぞれのオブジェクトをサイズ変更&移動させる 53  //******************************移動部分が上手くいかない****************************** 54 for(var l = 0; l < 3; l++){ 55 $(photos[l]).animate({"top":distance_y[l]+"px", "left":distance_x[l]+"px", 56 "width":next_width[l]+"px", "height":next_height[l]+"px"}); 57 }; 58 };

###テスト画面
クリック前
1回クリック
2回クリック
3回クリック

現在はその場でそれぞれのオブジェクトのサイズが変わっているだけなのですが、
これと同時に(時計回りの順番で)移動させるにはどうしたら良いでしょうか?
例えば、一回目のクリック時(二枚目の写真)には赤を緑の位置へ、緑を黄色の位置へ、黄色を赤の位置へ移動させる感じです。

何卒、ご回答の程よろしくお願いいたします。

###ログ画面
ログ画面

リストの中に値は格納されているのですが、サイズだけが変更されて、移動部分が動作しません。
そもそも、距離の計算方法が間違っているのでしょうか...?

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

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

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

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

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

kei344

2018/10/30 14:38

ご自身で試されたコードを質問文に追記し、「何」が「どのように」わからないのか、コードのどの部分で詰まっているのかなどを具体的に追記されたほうが回答が望めると思います。
akihiro3

2018/10/30 14:55 編集

コードを提示をお願いします。あと上記の画像ボタン部分がどれか分かりません(たぶん黒丸三角?)あと、聞きたい事を具体的に教えてください。「座標取得をやったけど出来ない」「サイズ変更が反映されない」「エラーが出ていて対処しても何も変わらない」などなど。。。
guest

回答1

0

ベストアンサー

・座標取得のやり方を聞かれてるのでしょうか?
座標取得

・margin操作(animate)でもできます
margin操作

・他だと、こんなのもありました
画面内でのオブジェクトの移動

よければ参考にしてみてください

追記

補足とコード確認しました

・サイズ変更の方法です
画像サイズの変更
jsでCSSの変更

試してない事は上の方法などを参考にしてみてください
あとsrc[59]は連続した数字がループ内で取得できるか?(「i」以外で)
というのが分かれば良いですか?

js

1 var length = 59; 2 var src = 59; 3 function result() { 4 console.log('photos[' + i + ']'); 5 console.log('src[' + src + ']'); 6 } 7 8 for ( var i = 0; i < length; i++ ) { 9 if ( i == length - 1 ) { 10 src = 3; 11 result(); 12 } else { 13 src--; 14 result(); 15 }

良ければこちらも参考にしてください
コード追記

html

1<!DOCTYPE html> 2<html lang="ja" dir="ltr"> 3<head> 4 <meta charset="utf-8"> 5 <title>test</title> 6 <style media="screen"> 7 * { 8 margin: 0px; 9 padding: 0px; 10 } 11 12 .container { 13 width: 340px; 14 height: 140px; 15 margin: 50px auto; 16 border: 1px solid #faf; 17 } 18 19 .circles { 20 height: 140px; 21 position: relative; 22 } 23 24 .circle { 25 display: inline-block; 26 position:absolute; 27 } 28 29 .red { 30 background: #f00; 31 width: 100px; 32 height: 100px; 33 border: 1px solid #000; 34 border-radius: 50%; 35 top: 20px; 36 left: 20px; 37 } 38 39 .green { 40 background: #0f0; 41 width: 30px; 42 height: 30px; 43 border: 1px solid #000; 44 border-radius: 50%; 45 top: 20px; 46 left: 50%; 47 } 48 49 .yellow { 50 background: #ff0; 51 width: 50px; 52 height: 50px; 53 border: 1px solid #000; 54 border-radius: 50%; 55 bottom: 20px; 56 right: 20px; 57 } 58 59 .btn { 60 background: #000; 61 width: 20px; 62 height: 20px; 63 border: none; 64 border-radius: 50%; 65 color: #fff; 66 line-height: 20px; 67 position: absolute; 68 bottom: 30px; 69 left: 50%; 70 } 71 </style> 72 <link rel="stylesheet" href="./test.css"> 73 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 74</head> 75<body> 76 <div class="container"> 77 <ul class="circles"> 78 <li class="circle red"></li> 79 <li class="circle green"></li> 80 <li class="circle yellow"></li> 81 <button type="button" class="btn"></button> 82 </ul> 83 </div> 84 85 </div> 86 <script type="text/javascript"> 87 $(function() { 88 var circle = $('.circle'); 89 90 $('.btn').click(function() { 91 $('.circle').each(function(i) { // 兄弟要素に繰り返し処理 92 if (i == circle.length - 1) { // html上で次の要素が無い時 93 var next = circle.eq(0).position(); // 次の要素の座標を取得 94 var width = circle.width(); // 次の要素の幅を取得 95 var height = circle.height(); // 次の要素の高さを取得 96 97 $(this).animate({ 98 'top': next.top, // 移動先のy座標 99 'left': next.left, // 移動先のx座標 100 'width': width, // 移動先での幅指定 101 'height': height, // 移動先での高さ指定 102 },1000) // 1000ミリ秒(1秒)の速さで変化 103 104 } else { // html上で次の要素がある時 105 var next = $(this).next().position(); // 次の要素の座標を取得 106 var width = $(this).next().width(); // 次の要素の幅を取得 107 var height = $(this).next().height(); // 次の要素の高さを取得 108 109 $(this).animate({ 110 'top': next.top, // 移動先のy座標 111 'left': next.left, // 移動先のx座標 112 'width': width, // 移動先での幅指定 113 'height': height, // 移動先での高さ指定 114 },1000) // 1000ミリ秒(1秒)の速さで変化 115 116 } 117 }); 118 }); 119 120 }); 121</script> 122</body> 123</html>

投稿2018/10/30 15:10

編集2018/11/04 18:26
akihiro3

総合スコア955

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

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

akihiro3

2018/10/30 17:32

補足確認して追記しました 試してない事を試してください
dokudoku

2018/11/02 03:25

ご回答ありがとうございます! 教えていただいたサイトを参考にコードを書いてみました。
akihiro3

2018/11/02 03:39

始めたばかりなのにスゴイですね 何かおかしいと思ったらまずデベロッパ確認するとヒントがありますよ (右クリック→検証) エラーは出てますか? 出てたら何と出てますか? そのエラー1文をコピーして検索すると ヒントや対処情報が沢山確認もできますよ これからの為にこの癖は付けといた方がいいですよ
dokudoku

2018/11/02 04:45

楽しくて毎日やってます! デベロッパ確認してみましたが、エラーは出ていません...。 ログを出したりしてキチンと値が格納されているかも確認したのですが、移動だけがどうしてもうまく動作しません...。 アドバイスありがとうございます! これからはエラー部分も含め具体的に質問するよう心がけます!
akihiro3

2018/11/04 18:28 編集

大きさは変わってるし、 エラーが無いという事は構文などは合ってるという事かな? htmlとcssを見てみたいところですが position:absoluteを忘れてませんか? とりあえず、作ってみたのでコード追記しておきます。
akihiro3

2018/11/04 18:49

あ!!ごめんなさい。。。 animateはjqueryだけと思います そして、私のコードはjqueryで作ってます jquery無しでスムーズな動き出来ますが面倒なコードになるので、 cssでtransitionだと思います
dokudoku

2018/11/08 06:31

コードありがとうございます! 思っていた通りの挙動でした!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問