.styleがうまくいかない!?

このQ&Aのポイント
  • JavaScriptの`.style`を使ってCSSの変更を試みていますが、うまくいきません。
  • 特に、`position`の変更が思った通りに反映されないようです。
  • また、複数のCSSを一括指定する方法も分からない状況です。
回答を見る
  • ベストアンサー

.styleがうまくいきません。

.styleがうまくいきません。 var debu = mathGetClass.style.position = 'fixed'; mathGetClass.style.position = 'top mathRandom + px'; mathGetClass.style.position = 'left mathRandom + px'; console.log(debu); としてもdebuの中身がfixedになってしまいます。 また、複数のCSSを一括指定したい場合は、 連想配列を使うのでしょうか? https://codepen.io/anon/pen/QpKzPR?editors=1111

noname#226032
noname#226032

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

> position fixedとして変数に代入したかったのですが、 >その場合は具体的にどうすればよかったのでしょうか? >そしてそうならない理由はなぜなのでしょうか? たとえば a=1; a=2; a=3; colsole.log(a); としたとき、1,2,3の合計の6ではなく3がconsole出力されますが、それはわかりますよね。 同じく mathGetClass.style.position = 'fixed'; mathGetClass.style.position = 'top' + mathRandom + 'px'; mathGetClass.style.position = 'left' + mathRandom + 'px'; とすると、mathGetClass.style.position に入ってるのは、 最後のだけです。 position, top, leftにそれぞれの値を確保したいなら、それ用のプロパティに対してセットするように mathGetClass.style.position = 'fixed'; mathGetClass.style.top = mathRandom + 'px'; mathGetClass.style.left = mathRandom + 'px'; です。

noname#226032
質問者

お礼

でしたね、左が同じだとただの再代入になるという事でしたね。

その他の回答 (2)

回答No.2

1) イコールの優先度とかは、この話では関係ありません。 > var debu = mathGetClass.style.position = 'fixed'; >mathGetClass.style.position = 'top mathRandom + px'; > mathGetClass.style.position = 'left mathRandom + px'; > console.log(debu); > としてもdebuの中身がfixedになってしまいます。 となるのは、なぜかという御質問に対して、 debuへ代入しているのは1行目だけで、 2行目と3行目ではdebuは変更していなのだから、最後のcolsole.log(debu);としたら 1行目でdebu変数に代入した値のが出てくるだけ という回答をしたつもりでした。 つまり、 1行目では、mathGetClass.style.positionに入れた'fixed'というその時点の値を 別の debuという変数へ値をコピーしているますが、 2行目でそのコピー元のmathGetClass.style.positionを変更しても コピー先のdebuの中身は変更される訳ではありません。ということです。 ただし、余計混乱させるかもしれませんが、今回は1行目でdebu変数へ値をコピーしていますが、 debu = ~ の 右辺が配列だったりオブジェクトだった場合は”参照渡し”になるのでこの場合は別です。 2) > 文字列として値を渡すからといって、その値をひとつづつ文字列にしないとcssの値として認識せず、 > 別の物と認識してしまうのですね。 違います。  CSSに限った話ではなく、プログラミングにおける文字列と変数の取り扱いの問題です。 ~ = '…変数名…' のように  変数名を ' 'で囲んでいたのでは、 '…変数名…'という文字列そのものを代入しているだけになってしまいます。 また、文字列連結の+演算子も、 ' 'の外にないと、単に +をいう文字をそのまま使ってしまうだけになります。 たとえば var a= 1; var b = 'a+2'; alert(b); とすると、「a+2」と表示されます。 この2行目をvar b = a + 2;とすれば「3]になります。 これと同じで、 変数名の中身をとりだして、それを文字列の一部に使いたいなら、 変数名を ' ' の外に出す必要があります。例えば var a= 10; var b = 'a + px'; alert (b);  だと、 「a + px」 と表示されてしまいますので、 「10px」と表示させたいなら 2行目は正しくは、 var b = a + 'px';  です。 > 複数のCSSのプロパティと値を当てることを想定していたのですが、 すみませんが、意味が理解できません。 もし、異なるクラス名であっても、特定のタグ名のプロパティーを全部ということなら クラス名を指定する方法でなく、タグ名を指定する方法を使えばよいです。

noname#226032
質問者

お礼

var debu = mathGetClass.style.position = 'fixed'; がなぜ、fixedが mathGetClass.style.position に代入されて、その後 var debu に代入されないかが謎です。 position fixedとして変数に代入したかったのですが、 その場合は具体的にどうすればよかったのでしょうか? そしてそうならない理由はなぜなのでしょうか? また、ちょっと混乱しているのですが、 下記はmathGetClass.style.positionという変数に再代入したいのではなく、 三つのpositionプロパティにそれぞれの値を付けて、 cssのpositionをjsで使いたかったという事です。 恐らくこれは伝わっていると思いますが、 下記の書き方で、cssを三つ当てられますよね。 ただ同じ要素に充てるのに三つ同じ要素を書くのはよろしくないので、 値だけを連想配列にすれば三つ書かなくてもいいかと思った次第です。 mathGetClass.style.position = 'fixed'; mathGetClass.style.position = 'top mathRandom + px'; mathGetClass.style.position = 'left mathRandom + px'; ・つまりこれで良いという事ですよね。 mathGetClass.style.position = 'fixed'; mathGetClass.style.position = 'top' + mathRandom + 'px'; mathGetClass.style.position = 'left' + mathRandom + 'px'; https://codepen.io/anon/pen/BWpmzB?editors=1111 >>> すみませんが、意味が理解できません。 もし、異なるクラス名であっても、特定のタグ名のプロパティーを全部ということなら クラス名を指定する方法でなく、タグ名を指定する方法を使えばよいです。 同じ要素に複数のCSSを当てるという事です。 .a { color:red; backrgound-color:red; } これをJSで行うという事です。

回答No.1

問題は3つあって、 1) debu = mathGetClass.style.position = 'fixed'; の行では、 =での代入が2つあるので、 'fixed'という文字列が debu変数にも、~.positionプロパティーにも代入されますが mathGetClass.style.position = 'top mathRandom + px'; の行では debuには代入されていないので、 debu変数の中身は、そのまえの状態のままです。('fixed'のまま) このため、console.log(debu);では'fxed'になります。 2) ~ = 'top mathRandom + px' としても、このままの文字列を代入しているだけです。 多分、やりたいのは、例えばmathRandon変数の中身が 10のときなら、 これを使って、 'top 10px'を代入 したいのでしょうから ~ = 'top mathRandom + px' と全体を' 'で囲んだ 1つの文字列にするのではなく、 '文字列' +  変数  + '文字列' で、 文字列や変数を連結するように ~ = 'top ' + mathRandom + 'px'; と記載する必要があります。 (ただし、次の件があるので、これではNGです) 3) mathGetClass.style.position = 'top ~'; mathGetClass.style.position = 'left ~''; として 'top ~ という文字列を ~positionプロパティに代入していますが、 ~.positionに代入して有効なのは、'static' 'absolute' 'relative' 'fixed'です top座標を指定したいなら positionプロパティーではなく topプロパティーを使って mathGetClass.style.top = mathRandom + 'px'; です。 (leftも同様) --------------------------------------------------------- > また、複数のCSSを一括指定したい場合は、連想配列を使うのでしょうか? 同じクラスがついているのを一括でstyleを変更したいときは JavaScriptのみで行うなら var elements = document.getElementsByClassName("class名"); for (var i=0;i<elements.length;i++) {  elements[i].style.position = 'fixed'; } みたいにして配列をループで回すのが、一般的です。 ただ、jqueryを使うと $('.class名').css('position', 'fixed'); で一括指定できます。

noname#226032
質問者

お礼

>>> 1) debu = mathGetClass.style.position = 'fixed'; の行では、 =での代入が2つあるので、 'fixed'という文字列が debu変数にも、~.positionプロパティーにも代入されますが mathGetClass.style.position = 'top mathRandom + px'; の行では debuには代入されていないので、 debu変数の中身は、そのまえの状態のままです。('fixed'のまま) このため、console.log(debu);では'fxed'になります。 イコールが二つある場合、優先度は同じなので、プログラミングでは同じ優先度の場合は、 より右にある方が優先されるのですか? debu = (mathGetClass.style.position ='fixed'; ) とすればcssとして当たってくれるんですかね? >>> 2) ~ = 'top mathRandom + px' としても、このままの文字列を代入しているだけです。 多分、やりたいのは、例えばmathRandon変数の中身が 10のときなら、 これを使って、 'top 10px'を代入 したいのでしょうから ~ = 'top mathRandom + px' と全体を' 'で囲んだ 1つの文字列にするのではなく、 '文字列' +  変数  + '文字列' で、 文字列や変数を連結するように ~ = 'top ' + mathRandom + 'px'; と記載する必要があります。 (ただし、次の件があるので、これではNGです) そうですね。cssの値として認識させるためには、 文字列として値を渡すからといって、その値をひとつづつ文字列にしないとcssの値として認識せず、 別の物と認識してしまうのですね。 文字列なのになぜCSSの値として認識するのかちょっと不思議なのですが、 値として文字がぴったり当てはまった時はcssの値とわかるんですかね? >>> 2) ~ = 'top mathRandom + px' としても、このままの文字列を代入しているだけです。 多分、やりたいのは、例えばmathRandon変数の中身が 10のときなら、 これを使って、 'top 10px'を代入 したいのでしょうから ~ = 'top mathRandom + px' と全体を' 'で囲んだ 1つの文字列にするのではなく、 '文字列' +  変数  + '文字列' で、 文字列や変数を連結するように ~ = 'top ' + mathRandom + 'px'; と記載する必要があります。 (ただし、次の件があるので、これではNGです) 仰る通りです、これはcssの問題ですね。 >>> 同じクラスがついているのを一括でstyleを変更したいときは JavaScriptのみで行うなら var elements = document.getElementsByClassName("class名"); for (var i=0;i<elements.length;i++) {  elements[i].style.position = 'fixed'; } みたいにして配列をループで回すのが、一般的です。 ただ、jqueryを使うと $('.class名').css('position', 'fixed'); で一括指定できます。 うまく伝わらなくて大変恐縮です。 複数のCSSのプロパティと値を当てることを想定していたのですが、 わかりにくくてすいません。 同じクラス名の要素が複数あった場合に同じcssを当てるというお話でしょうか? これはわざわざforを使わないといけないというのは衝撃ですね。 やっぱりライブラリを使わないと厳しいといわれるのもわかります。 var elements = document.getElementsByClassName("class名")[0,1,2,3]; としても複数に荒れられないのでしょうか? var elements = document.getElementsByClassName("class名")[*]; というやり方は恐らくできないのでしょうね。 i<elements.lengthこちらは配列の要素数を取得して要素数分ループさせて、 [0,1,2,3]のような状態を再現しているのですね。

関連するQ&A

  • JSがうまくいかない

    クリックするたびにポイントが10加算されるようにしたかったのですが、なぜかクリックするとNANになってしまいます。 codepen上ではうまく再現できていないですが、ソースを張っておきました。 https://codepen.io/anon/pen/oWbvEe?editors=0001 またインスペクタで確認してNanだったのですが、codepenはインスペクタのようにソースを見る機能はないのですか?

  • 疑似フレームがIEだと成り立たない

    疑似フレームがIEだと成り立たない 以下のようなCSSですが、FIREFOXやクローム等では反応するのですが、 IEだと処理されません。 どうすればいいのでしょうか? 教えてください。お願いします。 ちなみにCSSというものは初心者です。申し訳ありません。 <STYLE> <!-- BODY .menu1 { width : 12%; height : 100%; left : 0px; top : 100px; position : fixed; overflow: auto; } .menu2 { width : 12%; height : 100%; right : 0px; top : 100px; position : fixed; overflow: auto; } .main { position : absolute; z-index : 1; } --> </STYLE>

  • fizzbuzzがうまくいきません

    fizzbuzzがうまくいきません https://codepen.io/anon/pen/mWbvbp?editors=1112 fizzbuzzだけになってしまいます。 つまりあまりが両方ともすっと0になっているようですが、 なぜ1づつ増えて行っていないのでしょうか? インスペクタで見ると3fizと5fizは0になっています。 始めは0割る3はあまりが0なので初めのあまりは0だからでしょうか? するとループ処理の結果どうなっているかというのはインスペクタで見ることはできないのでしょうか?

  • CSSのスタイルシートについて教えて下さい。

    現在、ASP.NETにてメイン画面に使用する4分割のアプリケーションを作りたいと考えているのですがWeb Developer 2005 ではframesetが使えないので代替案を模索していました。 そこでCSSのスタイルシートにて作成しているのですが、見ようみまねでサンプルを加工しても記述を見ても経験が浅い為全く分からなくて困っています。 勉強が足りず恐縮ですがご教示下さい。 4分割フォームの詳細は ・ヘッダー部分「Title.aspx」→ 両端に画像が入った題名のみのファイル ・左部分「left.aspx」→  検索ボックスと検索ボタンが4つあり。キーを入力して   次の検索結果フォームへ異動する。 ・右部分「right.aspx」→ left.aspxと全く同じ作りです。           (東日本と西日本が分かれているようなイメージです。) ・下部 → 署名(フォームではなく文字列) <BODY> <HEAD> <link rel="stylesheet" type="text/css" href="pseudoframe_lmr.css"> </HEAD> <DIV class="menu"> メニュー </DIV> <DIV class="bar"> タイトル </DIV> <DIV class="main"> メインコンテンツ </DIV> <DIV class="bar2"> <p align="right">Copyrigth &copy 2006-2007 Name all rights Reserved</p> </DIV> </BODY> <STYLE> /* Opera/mozilla/共通用CSS */ <!-- BODY{ background-color : #e0fef8; } .menu{ width : 50%; top : 15%; left : 50px; top : 15%; position : absolute; background-color : #e0fef8; z-index : 1; } .bar{ width : 100%; height : 15%; left : 0px; top : 0px; position : fixed; overflow: auto; z-index : 2; } .main{ width : 50%; top : 15%; left : 20%; position : absolute; background-color : #e0fef8; z-index : 1; } .bar2{ width : 100%; height : 15%; left : 0px; top : 85%; position : fixed; overflow: auto; z-index : 2; } --> </STYLE> <!--[if gte IE 5 ]> /* IE5以上に適用させるCSS */ <STYLE> BODY{ width : 100%; margin : 0px; overflow : hidden; padding : 0px; } .menu{ position : absolute ! important; } .bar{ position : absolute ! important; } .main{ height : 70%; overflow: auto; } .bar2{ position : absolute ! important; } </STYLE> <![endif]--> コードを載せましたのでどの様に記述すればよいのかご教示下さいませ。 皆様、宜しくお願い致します。

  • スタイルシートのレイヤーに乗せた画像を動的に表示する方法

    <div id="test" style="position=absolute; top=400px; left=200px; z-index=10;"><img src="gazou.gif"></div> 上記を動的に表示するために以下の方法を考えました var element = document.createElement('div'); element.id = "test"; element.style = "position=absolute; top=400px; left=200px; z-index=10;"; element.innerHTML = '<img src="gazou.gif">'; var objBody = document.getElementsByTagName("body").item(0); objBody.appendChild(element); しかしこれだと、element.style = "position=absolute; top=400px; left=200px; z-index=10;"; の部分がまずいらしく動作しません。 どのようにすればよいでしょうか。 よろしくお願いします。

  • スタイルシートでスクロールは可能ですか?

    以下のように、フッターを下部に固定し上部をスクロールするようにしました。スクロールバーは出て(IE6.0)フッターとの重なりは阻止されますが、スクロールバーの操作はできません。 <scroll=内容を切り抜く>ということから当然のことなのでしょうか? <!DOCUTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> <HTML> <HEAD>   <TITLE>Test</TITLE>   <STYLE type="text/css">   #left {    position:absolute;    top: 130px;    left: 100px;    width: 300px; overflow: scroll;   }   #main {    position:absolute;    top: 130px;    left: 400px;   }   #right {    position:absolute;    top: 130px;    left: 700px;   }   #footer {    position:absolute;    bottom: 0px;    left: 100px;   }   </STYLE> </HEAD> <BODY> <div id="left">  left<br/> <br/>  left<br/> </div> <div id="main">  main </div> <div id="right">  right </div> <div id="footer">  footer </div> </BODY> </HTML>

  • 繰り返し処理をして、要素がいくつあっても、うまくい

    while文で繰り返し処理をして、要素がいくつあっても、うまくいくようにしたいのですが、var inputResultをカプセル化できないのでこのような場合どうすればいいのでしょうか? https://codepen.io/anon/pen/XqOWrQ document.querySelectorAll('.js-myBtn').addEventListener と変更したのですが、このボタンの一つ目を押したら一つ目として実行二つ目以降も同様にとなりません。 イベントを起こすトリガーの要素を配列で指定はできないのでしょうか?

  • スタイルシートの適応のやり方

    現在ドリームウェーバーでHPを作っていますが CSSを使いメニューボタンをへこむボタンにしたいのですが うまく反映されません。 ソフトが最近から使い始めたのでうまく理解できていないところです。 a.sample{ text-decoration:none; } a:hover.sample{ color:#CC0000; border-width:0px 1px 1px 0px; border-style:solid; border-color:#990000; position:relative; top:-2px; left:-2px; } a:active.sample {/*クリック中の色*/ color:#CC0000; border-width:1px 0px 0px 1px; border-style:solid; border-color:#990000; position:relative; top:2px; left:2px; padding-left:3px; } こちらです。 手順を教えて頂けないでしょうか?

    • ベストアンサー
    • HTML
  • スタイルシート

    スタイルシートを使ってホームページを作り始めたんですが、左にメニューを作りたかったので body { margin: 0px; padding: 0px; } .main { width: 580px; position: absolute; left: 210px; } .side { width: 180px; margin-left:10px; } とcssファイルを作り何個かのページに記述したらトップページを除いて他のページは配置がおかしくなったりレンタルサーバの広告がど真ん中に重なったりしてしまいます。なぜでしょうか? 配置がおかしいとはsideとmainが ■■という配置にして欲しいのですが ■  ■という風になってしまいます。 わかりにくくてすみません。

  • IE6などでposition:fixedのように固定する方法

    二つの画像を<div style="position:fixed; bottom:0px; left:0px;">と<div style="position:fixed; bottom:0px; right:0px;">で下のすみにそれぞれ表示していたのですが、IE6で正常に表示されないことに気づきました。 IE6などサポートされていないブラウザでも表示するにはどうすれば良いでしょうか。 また右下の画像は外部scriptを読み込んでランダムに表示していて、できればそのままその機能を使いたいのですが・・・ 使用しているscriptは↓です。 var imglist = new Array( "01.gif", "02.gif" ); var selectnum = Math.floor((Math.random() * 100)) % imglist.length; var output = "<img src=" + imglist[selectnum] + ">"; document.write(output);