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

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

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

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

Q&A

解決済

1回答

2442閲覧

Gutenberg(グーテンベルク)のカスタムHTMLのプレビューにCSSを反映したい

okm_1162

総合スコア7

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

0グッド

0クリップ

投稿2019/06/19 07:14

##実現したいこと
WPのデフォルトのカラム分け以外の特殊なカラム分けや特別なデザインをつけた部分にCSSを反映したいため、
ブロック編集の画面時にカスタムHTMLのプレビューにもCSSを当てたい。

##問題点
カスタムHTMLがiframe読み込みのため、エディタ全体のcssが反映されない。

##現状
下記のコードにてcssとjsは読み込み済みです。

php

1add_action( 'enqueue_block_editor_assets', 'gutenberg_stylesheets_custom_demo' ); 2function gutenberg_stylesheets_custom_demo() { 3 $editor_style_url = get_theme_file_uri('/editor-style.css'); 4 wp_enqueue_style( 'theme-editor-style', $editor_style_url ); 5 wp_enqueue_script( 'theme-gutenberg-js', get_theme_file_uri('/js/gutenberg.js'), array( 'jquery' ), false, true ); 6}

エディタ全体にCSSは反映されていることは確認し、JSもconsole.logにて読み込まれていることは確認しているため、
CSSとJSに問題はないようです。

iframeにCSSを読み込ませるJSは何件か見かけたため下記のコードにて試してみました。

javascript

1$(function(){ 2 $('.components-sandbox').on('load', function(){ 3 $('.components-sandbox').contents().find('head').append('<link rel="stylesheet" href="editor-style.css" type="text/css" />'); 4 }); 5});

が、iframeのheadに反映されませんでした。
その他HTML表示とプレビュー表示のクリックを感知してheadにCSSを追加するJSなども試そうかとおもいましたがクリックの感知すらできませんでした。

カスタムHTMLのプレビューモードにCSSを反映させる方法はJSで無理やり入れ込む以外にありますでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

Sandboxコンポーネントのiframeはdocument.write()でコンテンツを読み込んでるので
多分loadイベントは発生しないのですよね

MutationObserverでDOMの変更を追跡する形ならあるいは・・・
試してないのでなんとも言えないですが

投稿2019/06/19 08:07

KazuhiroHatano

総合スコア7804

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

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

okm_1162

2019/06/24 02:02

MutationObserverを試してみましたが、 iframeを囲っているdivがclassであり、監視対象のノードをidで指定することが難しいためかうまく動きませんでした。 1ページに複数カスタムHTMLを設置することもあるためidを振ることもできず…。 ご回答ありがとうございました。
KazuhiroHatano

2019/06/24 02:29

MutationObserverのobserveでは特定の一つのDOM要素を引数にすればいいだけで 特にidを指定しなければならないわけじゃないです 一つずつやればいいだけなので $('.someClass').each(function(){myMutationObserverObj.observe(this);}); みたいな感じにやればいいだけです ただ、まだreactのことがよくわかってないので正確なことは言えないですが GutenbergのエディタではsetStateとかのタイミングで要素が置き換わっていて reactのコンポーネントのハンドラ以外のイベントリスナやオブザーバーなどは 何かブロックに変更があるたびに消失してしまうのかもしれません Sandboxコンポーネントを含めてhtmlブロックの関連のコンポーネントには 見た所拡張の余地がないので正直自分の知識の範囲では手詰まりです
okm_1162

2019/06/24 08:21

MutationObserverのコードまでご解説いただきありがとうございます。 eachで複数回働かせてみても反応がなく、 gutenbergはまだアップデートもあるかと思いますのでそちらを待とうと思います。 ご返信ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問