1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

backgroundをif文で使うときに気をつけたいこと

Last updated at Posted at 2021-05-02

想定する読者

javascriptのコードを書いていて、ある要素のbackgroundの値を分岐判定に使おうと思った人。(例えばすごろくゲームを作っていて、赤色マス、青色マスの判定を画面の色に頼っていたとか)
追記-- コメントよりご指摘頂いてますが、だいぶ穴のある記事になっています。ごめんなさい。

きっかけ

私は背景の色を#を使って指定してしまう癖があるのですが、backgroundの色に応じて処理を変えたいときにif(node.style.background="#~~~")という感じでかいても絶対にtrueの処理に入ってくれなっかのです。これの解決にはだいぶ頭を悩ませてしまったので、備忘録として記録しておきます。
 結論からいうとこれにはブラウザがbackgroundの値をどのような形で保持しているか、が原因でした。ブラウザが保存する形式に合わせないと==でも===でもfalseになってしまします。以下の実験では、プロパティの設定時ではいずれも有効と判断される記入例を並べ、if文にかけた時の判定を比べてみました。

実験コード

 <body>
   <div id="box" style="width:300px;height: 300px;background: #f55;"></div>
<script type=text/javascript >
window.onload=function(){
    const box=document.getElementById("box");
    console.log(box.style.background);
    console.log(box.style.background=="#f55");
    console.log(box.style.background=="rgb(255,85,85)");
    console.log(box.style.background=="rgb(255, 85, 85)");
    console.log(box.style.background=="rgb(255, 85, 85) none repeat scroll 0% 0%");
//以下省略

#実験結果

chromeの場合

rgb(255, 85, 85) ⇐ブラウザが保存している色情報の形式
false ⇐16進数表記 
false ⇐rgb表記(スペース無し)
true  ⇐rgb表記 
false ⇐色以外のrepeat設定などを含めた文

firefoxの場合

rgb(255, 85, 85) none repeat scroll 0% 0%  ⇐ブラウザが保存している色情報の形式
false ⇐16進数表記 
false ⇐rgb表記(スペース無し)
false ⇐rgb表記  
true  ⇐色以外のrepeat設定などを含めた文

#ではじめる16進数表記での色指定(2行目)はif文では意図した処理になりません。rgbで指定するにも","の後にしっかりスペースを開けて合わせないといけないようですね(3,4行目参考)。また私の環境では2つしか比べられませんでしたが、ブラウザによってbackgroundの保存形式が違うではないですか。
訂正 (この場合、backgroundColorでプロパティを保存してけば、両ブラウザでは保存形式は同じになり、3個目の照合でtrueになります。)
 

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?