こんにちは、さち です。
先日、ウェブブラウザーの拡張機能「Tampermonkey」を使って、とあるサイト用の「ユーザースクリプト」を書いていました。
このスクリプトで追加した要素に「CSS」を適用したかったのですが、JavaScript を使って要素に直接 CSS を書き込むのは気が進みません……。
ということで、JavaScript の中で「CSS」をそのまま記述する方法を考えてみます。
JavaScript で CSS を書くのは微妙
サンプルコード
例として、同じ構造でテキストだけが違う <div>
を複数追加する「ユーザースクリプト」を書きました。
let list = [1, 2, 3, 4, 5]; let target = document.querySelector('#root'); let div; list.forEach( (val)=> { div = document.createElement('div'); div.innerText = val; //CSS の指定 div.style.display = 'inline-block'; div.style.width = '2em'; div.style.margin = '0 1em'; div.style.border = '2px solid red'; target.append(div); });
このユーザースクリプトを実行すると、HTML の構造はこんな感じになります。
モヤモヤする点
注目して欲しいのは、「CSS」も JavaScript を使って書いた点です。<div>
を作る度に直接「CSS」を指定しています。
「ユーザースクリプト」は他人様のサイトに JavaScript を適用するものなので、CSSファイル を直接いじるのは無理。JavaScript で書くしかありません。
その結果できるのが、この HTML です。
同じ内容の記述(緑色の部分)がいくつもあってゴチャゴチャしています。
そもそも、一番の問題は「CSS」の指定が多いと JavaScript で書くのが面倒ということ。テンション下がりまくりです。
「CSS」をそのまま書きたいからと別途「ユーザーCSS(Stylus 等)」を使うと、ファイルが分かれてしまうので、これもまた管理が面倒なんですよね。
解決方法
改善したコード
「CSS」をそのまま記述したものがこちらです。
let list = [1, 2, 3, 4, 5]; let target = document.querySelector('#root'); let div; list.forEach( (val)=> { div = document.createElement('div'); div.innerText = val; //クラスの指定だけする div.classList.add('class'); target.append(div); }); /* CSS をそのまま記述して追加する */ let css = ` .class { display: inline-block; width: 2em; margin: 0 1em; border: 2px solid red; }`; let style = document.createElement('style'); style.innerHTML = css; document.head.append(style);
このユーザースクリプトを実行した結果がこちらです。
やっていること
<div>
に「CSS」を指定していた JavaScript はすべて削除して、代わりにクラスを追加する div.classList.add('class');
に置き換えました。「CSS」の指定は、このクラス .class
に対して行います。
「CSS」の記述は、'(クォート)
で囲む「文字列リテラル」内だと「改行」ができないので、 `(バッククォート)
で囲む「テンプレートリテラル」を使います。
記述した「CSS」を <style>
タグに入れて、<head>
タグ内に追加すれば完成です。
その結果できるのが、この HTML です。
「CSS」は <head>
タグ内に追加されるようになったので、<div>
タグの記述がとてもスッキリしました。
今回は違いを分かりやすくするため「CSS」の記述を後にしましたが、実際に使うときは CSS の適用に時差がないように先に書いた方が良いかもしれません。
ちなみに、テンプレートリテラル内で ${}
と記述すれば、カッコ内で「変数」や「数式」を扱えるので、CSS の値などを可変にできるという副次的効果もあります。
コメント