JavaScriptで<head>にCSSを追加する?
質問
javascriptでjavascriptファイル内の文字列からcssを文書のheadに追加する方法はありますか?
例えば、ライトボックススクリプトがあるウェブページがあるとします。このスクリプトは機能するためにcssファイルを必要とします。
この css ファイルを
<link>
で追加すると、jsを有効にしていない人でもcssファイルをダウンロードできるようになります。
スクリプトでcssファイルを動的にロードできることは知っていますが、それは2つのhttpリクエストがあることを意味し、ファイルにcssがほとんどない場合、私はこれが非効率的であると思います。
そこで私は考えました。css ファイルにある css をスクリプトに入れ、スクリプトが css を解析して head に追加する、あるいはさらに良いことに、スクリプトが css を直接
<head>
に直接追加することもできます。
ですが、ネットで調べてもそのようなことは書かれていないので、jsでheadにcssを追加することは可能なのでしょうか?
編集+SOLUTIONです。
roryf氏の回答をクロスブラウザ(IE5を除く)で動作するように編集しました。
ジャバスクリプトです。
function addcss(css){
var head = document.getElementsByTagName('head')[0];
var s = document.createElement('style');
s.setAttribute('type', 'text/css');
if (s.styleSheet) { // IE
s.styleSheet.cssText = css;
} else { // the world
s.appendChild(document.createTextNode(css));
}
head.appendChild(s);
}
どのように解決するのですか?
CSSの文字列を
<head>
に追加しようとしているので、JavaScript?
に CSS の文字列を追加しようとしているのですから、これを行うには
<link>
要素よりも
<style>
要素よりも
以下は
p { color: green; }
ルールを追加します。
<link rel="stylesheet" type="text/css" href="data:text/css;charset=UTF-8,p%20%7B%20color%3A%20green%3B%20%7D" />
これをJavaScriptで作るには、CSSの文字列をURLエンコードし、その文字列を
HREF
属性に追加するだけです。のすべての癖よりもずっとシンプルです。
<style>
要素やスタイルシートに直接アクセスするよりもずっと簡単です。
var linkElement = this.document.createElement('link');
linkElement.setAttribute('rel', 'stylesheet');
linkElement.setAttribute('type', 'text/css');
linkElement.setAttribute('href', 'data:text/css;charset=UTF-8,' + encodeURIComponent(myStringOfstyles));
IE5.5以降で動作します。
マークした解決策も動作しますが、この解決策では dom 操作が少なく、単一の要素しか必要としません。
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] CSSでcellpaddingとcellspacingを設定する?
-
[解決済み] JavaScriptで文字列をbooleanに変換するにはどうしたらいいですか?
-
[解決済み] CSSは常にJavascriptより優先されるべきか?
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
-
[解決済み】HTML5入力のプレースホルダの色をCSSで変更する。
-
[解決済み] CORS OriginヘッダーとCSRFトークンによるCSRF保護
-
[解決済み] Node.jsのES6クラスをrequireで作る
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Javascriptで<style>タグを作成するには?
-
[解決済み] jqueryでdivの要素がオーバーフローしていないかチェックする
-
[解決済み] TypeScriptのdeclare classとinterfaceの違いとは?
-
[解決済み] 兄弟ノードを選択する方法はありますか?
-
[解決済み] オブジェクトの配列からReactコンポーネントをレンダリングする
-
[解決済み] Reactコンポーネントでthis.setStateを複数回使用するとどうなりますか?
-
[解決済み] Javascriptで動的に命名されたメソッドを呼び出すにはどうすればよいですか?
-
[解決済み] AJAX Mailchimp サインアップフォームの統合
-
[解決済み] イテレータでmap()を使用する
-
[解決済み] JSHintの'+'前の改行不良の説明