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

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

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

SVGは、XMLを基盤とした2Dベクター画像記述言語。画像を線・面といった図形の集合体として扱うベクター画像のため、環境に適した表示が可能です。アニメーション機能もサポートされており、簡単なインタラクティブコンテンツ作成もできます。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

jQuery

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

CSS

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

Q&A

1回答

5587閲覧

display:none;の要素のCSSを動的に変更した時、Chromeだけ適用されない

TakuHosoya

総合スコア33

SVG

SVGは、XMLを基盤とした2Dベクター画像記述言語。画像を線・面といった図形の集合体として扱うベクター画像のため、環境に適した表示が可能です。アニメーション機能もサポートされており、簡単なインタラクティブコンテンツ作成もできます。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

jQuery

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

CSS

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

0グッド

1クリップ

投稿2019/11/22 08:37

編集2019/11/24 05:41

親要素をdisplay:none;にしたsvgの色をjQueryで動的に切り替えています。
この要素をjQueryで表示したり、非表示にしたり切り替えを行っています。

html

1<!--SVG--> 2<div class="parent" style="display:none;"> 3<object id="canvas" class="productpic" style="display:none;" data="hoge.svg" type="image/svg+xml"></object> 4</div> 5<!--色選択ボタン--> 6<div class="colorbtn" data-color="0">RED</div> 7<div class="colorbtn" data-color="1">BLUE</div> 8<div class="colorbtn" data-color="2">YELLOW</div> 9<!--表示切替ボタン--> 10<div id="on">表示</div> 11<div id="off">非表示</div>

javascript

1var colordata = new Object(); 2colordata[0] = 'rgba(255,0,0,255)'; 3colordata[1] = 'rgba(0,0,255,255)'; 4colordata[2] = 'rgba(255,255,0,255)'; 5$(function(){ 6 $(document).on('click', '#on', function(){ 7 $('.parent').fadeIn(400); 8 }); 9 $(document).on('click', '#off', function(){ 10 $('.parent').fadeOut(400); 11 }); 12 $(document).on('click', '.colorbtn', function(){ 13 var colorid = $(this).data('color'); 14 var svgobj = document.getElementById('canvas').contentDocument; 15 var $svg = $(svgobj).find('svg'); 16 $target = $svg.find('path'); 17 $target.css('fill', colordata[colorid]); 18});

非表示の状態で色を切り替え、その後この要素を表示した時、ブラウザによって挙動が異なり困っています。

Firefox、Edgeでは上記操作を行った時、色が切り替わった状態で表示されます。(意図通りの挙動)
一方、Chromeでは上記操作を行った時、色が切り替わっていない状態で表示されます。

ただし、Chromeの場合でも一度表示を行った後、再度非表示にしてから色の切り替えを行った場合には、改めて表示した際、色が切り替わった状態で表示されます。(意図通りの挙動)

原因が全くわからず、どなたかお分かりになる方がいらっしゃいましたら、教えて頂けると大変助かります。

<追記>
どうやら、最初、非表示の際はdocument.getElementById('canvas').contentDocumentがnullとなってしまい、一度表示下後に非表示にした際は、しっかりと#documentが取得出来ている様です。
ちなみに、最初の非表示の際でもdocument.getElementById('canvas')は正しく取得出来ているので、.contentDocumentの挙動でブラウザによって違いがあるということでしょうか。。。

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

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

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

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

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

azuapricot

2019/11/22 08:50

そのjqueryはどこに?
TakuHosoya

2019/11/22 09:13

すみません、追記しました。
guest

回答1

0

html

1<object id="canvas" class="productpic" style="display:none;" data="hoge.svg" type="image/svg+xml"></object>

上記objectのdocumentを読み込むタイミングがブラウザによって異なる様です。

Firefoxなどはページ読み込み時点で全てのdocumentを読み込み、対してChromeでは実際に表示されるタイミング(通常であればページ読み込み時、display:none;を設定している場合はdisplay:none;で無くなった時)にdocumentが読み込まれる様でした。

そこで、対処療法的かもしれませんが、直接HTMLタグにdisplay:none;を書かず、以下の様に制御することで、ページ読み込み時に確実にdocumentを読み込ませ、その後display:none;を意図通りに設定して行くことしました。

これでChromeでも意図通りの挙動となりました。

html

1<!--SVG--> 2<div class="parent"> 3<object id="canvas" class="productpic" data="hoge.svg" type="image/svg+xml"></object> 4</div> 5<!--色選択ボタン--> 6<div class="colorbtn" data-color="0">RED</div> 7<div class="colorbtn" data-color="1">BLUE</div> 8<div class="colorbtn" data-color="2">YELLOW</div> 9<!--表示切替ボタン--> 10<div id="on">表示</div> 11<div id="off">非表示</div>

javascript

1$(window).on('load', function(){ 2 var svg = document.getElementById('canvas').contentDocument; 3 if(svg){ 4 $('.parent').hide(); 5 $('.productpic').hide(); 6 } 7});

投稿2019/11/24 06:58

TakuHosoya

総合スコア33

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

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

s8_chu

2019/11/24 08:43

CSSで行いたいならば、固定位置指定にしたうえで画面外へ飛ばしても良いと思います。 <object id="canvas" class="productpic" style="position: fixed; top: -10000px;" data="hoge.svg" type="image/svg+xml"></object>
TakuHosoya

2019/11/25 01:48

なるほど、非表示にする仕組み自体を変えると言うのも手ですね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問