_____SK_____
@_____SK_____

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

jsのanimateが実行されない

ユーザーに最初の色と最後の色とその色を変化させる時間を決めてもらいjavascripのanimateで実行しようと思ったのですが、エラーなしで実行されません。
背景色を変化させるにはどうすればいいでしょうか

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>study</title>
	<link rel="stylesheet" href="style/style.css">
	<!-- links -->
	<link rel="preconnect" href="https://fonts.googleapis.com">
	<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
	<link href="https://fonts.googleapis.com/css2?family=Dancing+Script:wght@400;700&display=swap" rel="stylesheet">
</head>
<body id="body">

	<div class="all">
		<!-- color -->
		<h1 class="title dancing first-title">color</h1>
		<p class="color-txt txt-one">start color</p>
		<select name="color-one" id="color-one" class="color-choice">
			<option value="#ff0000">red</option>
			<option value="#ff6347">tomato</option>
			<option value="#ffa500">orange</option>
			<option value="#ffff00">yellow</option>
			<option value="#008000">green</option>
			<option value="#adff2f">yellowgreen</option>
			<option value="#0000ff">blue</option>
			<option value="#4169e1">royalblue</option>
			<option value="#800080">purple</option>
			<option value="#ffc0cb">pink</option>
			<option value="#ff1493">deeppink</option>
			<option value="#a52a2a">brown</option>
			<option value="#808080">gray</option>
			<option value="#000000" selected>black</option>
			<option value="#ffffff">white</option>
		</select>

		<p class="color-txt txt-two">end color</p>
		<select name="color-two" id="color-two" class="color-choice">
			<option value="#ff0000">red</option>
			<option value="#ff6347">tomato</option>
			<option value="#ffa500">orange</option>
			<option value="#ffff00">yellow</option>
			<option value="#008000">green</option>
			<option value="#adff2f">yellowgreen</option>
			<option value="#0000ff">blue</option>
			<option value="#4169e1">royalblue</option>
			<option value="#800080">purple</option>
			<option value="#ffc0cb">pink</option>
			<option value="#ff1493">deeppink</option>
			<option value="#a52a2a">brown</option>
			<option value="#808080">gray</option>
			<option value="#000000">black</option>
			<option value="#ffffff" selected>white</option>
		</select>

		<!-- time -->
		<h1 class="title dancing second-title">time</h1>
		<select name="time" id="time" class="time-choice">
			<option value="300000">5minutes</option>
			<option value="600000">10minutes</option>
			<option value="1800000">30minutes</option>
			<option value="3600000">60minutes</option>
			<option value="7200000">120minutes</option>
		</select><br>


		<span>OK</span>
	</div>

	<!-- scripts -->
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
	<script src="script/script.js"></script>
</body>
</html>

css

@charset 'utf-8';
body{
	padding: 0;
	margin: 0;
	text-align: center;
}

.dancing{
	font-family: 'Dancing Script', cursive;
}

.all{
	position: absolute;
    top: 50%;
    transform: translate(-50%, -50%);
	left: 50%;
}

select{
	text-align: center;
}

.title{
	margin: 0;
	text-align: center;
}

.title p{
	margin: 0;
	display: inline-block;
}

.first-title{
	background: linear-gradient(0deg,#264653,#2a9d8f,#e9c46a,#f4a261,#e76f51);
	background: -webkit-linear-gradient(0deg,#264653,#2a9d8f,#e9c46a,#f4a261,#e76f51);
	-webkit-background-clip: text;
	-webkit-text-fill-color: transparent;
	padding-left: 1px;
}

.second-title{
	background: linear-gradient(0deg,#ef476f,#ffd166,#06d6a0,#118ab2);
	background: -webkit-linear-gradient(0deg,#ef476f,#ffd166,#06d6a0,#118ab2);
	-webkit-background-clip: text;
	-webkit-text-fill-color: transparent;
}

.color-txt{
	margin: 0;
}

span{
	display: inline-block;
	margin-top: 50px;
	color: white;
	background: linear-gradient(90deg,#F7CD39,#67BFD5);
	padding: 4px 25px;
	border-radius: 15px;
	cursor: pointer;
	border: gray 2px solid;
}

#time{
	margin-top: 10px;
}

.h2{
	background: linear-gradient(0deg,#264653,#2a9d8f,#e9c46a,#f4a261,#e76f51);
	background: -webkit-linear-gradient(0deg,#264653,#2a9d8f,#e9c46a,#f4a261,#e76f51);
	-webkit-background-clip: text;
	-webkit-text-fill-color: transparent;
}

/* PC */
@media (min-width:1000px){
	.title{
		font-size: 10rem;
	}

	.color-txt{
		font-size: 2rem;
	}

	.txt-one{
		margin-bottom: 20px;
	}

	.txt-two{
		margin: 20px 0;
	}
}

/* pad */
@media (min-width:421px) and (max-width:999px){
	.title{
		font-size: 10rem;
	}

	.color-txt{
		font-size: 2rem;
	}

	select{
		height: 24px;
    	width: 114px;
    	font-size: 16.7px;
	}

	.txt-one{
		margin-bottom: 25px;
	}

	.txt-two{
		margin: 24px 0;
	}
}

/* mobile */
@media (max-width:420px){
	.title{
		font-size: 7.5rem;
	}

	.color-txt{
		font-size: 1.75rem;
	}

	.txt-one{
		margin-bottom: 12px;
	}

	.txt-two{
		margin: 10px 0;
	}

	#time{
		margin-top: 15px;
	}
}
$(function(){
	$('span').click(function(){
		let start_color = document.getElementById('color-one').value;
		let end_color = document.getElementById('color-two').value;
		let time = document.getElementById('time');
		$("body").animate({
	  		background:[`${start_color}`, `${end_color}`],
		},{
			iterations: Infinity,
			duration: parseInt(time)
		});
	})
})
0

4Answer

他の回答者もおっしゃっていますが、質問の前提が全く不明です。

jsでanimateを使っていたら

の部分ではWeb Animation APIの話かと思ったら、

htmlでjqueryを読み込んだのですが

と後からjQueryが話題に入ってきたりと、全体像が全く見えません。

一応、参考になりそうなリンクを載せておきます。

追記

私の環境では下のコメントの通りに書いて問題なく動きますが・・・

See the Pen qiita-questions-1fb42861a34bb2d6be9c by _y_s (@ys-j) on CodePen.

0Like

Comments

  1. @_____SK_____

    Questioner

    すいません説明不足でした。
    jsのコードがこちらです

    let start_color = document.getElementById('color-one').value;
    let end_color = document.getElementById('color-two').value;
    let time = document.getElementById('time').value;
    $("body").animate({
    background:[`${start_color}`, `${end_color}`],
    },
    {
    iterations: Infinity,
    duration: `${time}`
    });
    body要素に
  2. @_____SK_____

    Questioner

    すいません途切れました。
    変数はhtmlのselectの値を取得したものが入っています。
    これでやってみたのですが、どうやらhtmlで読み込んだjQueryに問題があり、いろいろ読み込むリンクを変えてみたのですが、変わりませんでした。
  3. jQueryに問題があるわけではなく、そういう仕様なんだと思います。上記のリンクにも記載がありますが、

    > All animated properties should be animated to a single numeric value, except as noted below; most properties that are non-numeric cannot be animated using basic jQuery functionality (For example, width, height, or left can be animated but background-color cannot be, unless the jQuery.Color plugin is used).

    とのことです。
  4. @_____SK_____

    Questioner

    jQuery.Colorを使わないとできないということですか?
  5. jQueryのanimateはそうみたいですね。

    Web Animation APIであれば以下で済むと思いますが・・・
    document.body.animate({ backgroundColor: [start_color, end_color] }, { duration: time, iterations: Infinity });
  6. @_____SK_____

    Questioner

    丁寧にありがとうございます。
    document.body.animate({ backgroundColor: [start_color, end_color] }, { duration: time, iterations: Infinity });
    でやってみたのですが、animateのところでエラーが出ました。
    エラー

    script.js:7 Uncaught TypeError: Failed to execute 'animate' on 'Element': duration must be non-negative or auto
    at HTMLSpanElement.<anonymous> (script.js:7:17)
    at HTMLSpanElement.dispatch (jquery.min.js:2:42571)
    at v.handle (jquery.min.js:2:40572)
  7. すみません、timeは正数(Number型)である必要があるということですね。
    time = .value→.valueAsNumber(<input type=number>の場合)とするか、
    duration: parseInt(time)とすれば解決しないですか?

    ※このレベルのエラーであれば、逐一質問するのではなく、自分でエラーの内容を理解しないといつまでもスキルアップできないような気がします…
  8. @_____SK_____

    Questioner

    .valueAsNumber
    <input type=number>
    duration: parseInt(time)
    をやってみてduration: parseInt(time)以外は前と同じ結果でしたが、duration: parseInt(time)はエラーも何もなくanimateが実行されないという結果になりました。
    他にもstart_color,end_colorのところを変数ではなく16進数にしてみましたがダメでした。
  9. start_color, end_colorはCSS上有効な値になっていますか?(例:black・white等の色名、#000000・#ffffff等のHEX値、等)
  10. @_____SK_____

    Questioner

    はい全ての値が16進数の#ffffffのような値になっています。
  11. 上の回答に追記しましたのでご確認ください。
  12. @_____SK_____

    Questioner

    返信遅れてすみません。
    たくさんの方、回答ありがとうございました。
    とても勉強になりました。
    これからも数値型には気をつけていきたいと思います。
    みなさん本当にありがとうございました。

timeはちゃんと取れてますかね.
idを間違えていて値が取れてないとかいうのはよくあるので確認してください.
質問文を編集して全てのソースを掲載することを推奨します.

0Like

Comments

  1. @_____SK_____

    Questioner

    idは合っています。
    3つの変数のところを、書き換えて(#000000,#ffffff,5000)やってみましたが
    Uncaught TypeError: k.easing[this.easing] is not
    というエラーが1秒に何十回も出ました。
  2. 元の質問文が編集できますのでそっちに載せてください.
    コードブロックをお忘れなく.

いろいろ試した感じjQuery.animateだとbackgroundColorをkeyframes指定できないっぽいですね.
@_y_s さんの回答通りにWeb Animations APIのElement.animate()を使うのが簡単そうです.

あと1か所訂正

JavaScript
-		let time = document.getElementById('time');
+		let time = document.getElementById('time').value;
0Like

Your answer might help someone💌