先日の ユーザスタイルシートの常用を尻込みしている幾つかの理由 というエントリで、常用ブラウザが Firefox で JavaScript がオフだから というのを理由に挙げましたが、Firefox愛用者としては納得がいかず、言い訳に過ぎないと思ったので、Firefox で JavaScriptオフ でも(任意・複数の)ユーザスタイルシートを簡便に切り替える方法を考えて見ました。
先ず思いついたのは JavaScript Actions という拡張でした。これを用いればJavaScriptがオフの状態でもブックマークレットのような感覚でJavaScriptを動かす事が可能になります。これにユーザスタイルシート切り替えスクリプトを読み込ませれば出来る筈です。そこで早速拡張を導入して 春木屋さんのブックマークレット を取り込もうと思ったのですが、書き換え方がわからない。すっかりお手上げだったので、ユーザー定義のスタイルシートを追加 を入れてみたところ見事に成功。しかしこれだと任意のCSSを加えるだけなので、製作者側のCSSが無効になりません。そこで JavaScript Actions の標準スクリプトに入っているスタイルシート無効化スクリプトと混ぜてみました。
// スタイルシートを無効化します。
jsa_DisableStyleSheets();
function jsa_DisableStyleSheets(){
for(var i=0; i<document.styleSheets.length; i++){
document.styleSheets[i].disabled = true;
}
}
// ユーザー定義のスタイルシートを追加
jsa_SetCSS();
function jsa_SetCSS() {
// スタイルシートの書式を記述(このサンプルは背景画像を消去)
var newCSS, styles = '* { background-image: none !important; }';
if (document.contentType == 'application/xhtml+xml') {
newCSS = document.createProcessingInstruction(
'xml-stylesheet',
'href="data:text/css,' + escape(styles) + '" type="text/css"'
);
document.insertBefore(newCSS, document.documentElement);
} else {
newCSS = document.createElement('link');
newCSS.rel = 'stylesheet';
newCSS.href = 'data:text/css,' + escape(styles);
newCSS.type = 'text/css';
document.documentElement.childNodes[0].appendChild(newCSS);
}
}
これで製作者側のCSSを無効にして任意のユーザスタイルシートを適用することが可能になった訳ですが、上のサンプルのようにスタイルをいちいち書き込んで行くのはどう考えても面倒です。そこで考えたのが@import規則。これで任意のCSSファイルを読み込んでみます。適当なユーザスタイルシートが無かったので、大変失礼とは思いながらも ウェビンブログさん の 「view elements」WebbingStudioバージョン を拝借させて頂こうと思います。迷惑でしたら仰って頂ければ早急に訂正致しますので宜しくお願いします。それでは書き換えてみます。
// スタイルシートを無効化します。
jsa_DisableStyleSheets();
function jsa_DisableStyleSheets(){
for(var i=0; i<document.styleSheets.length; i++){
document.styleSheets[i].disabled = true;
}
}
// ユーザー定義のスタイルシートを追加
jsa_SetCSS();
function jsa_SetCSS() {
// スタイルシートの書式を記述(@importでCSSを読み込む)
var newCSS, styles = '@import \"http://blog10.fc2.com/w/webbingstudio/file/userstyle.css\";';
if (document.contentType == 'application/xhtml+xml') {
newCSS = document.createProcessingInstruction(
'xml-stylesheet',
'href="data:text/css,' + escape(styles) + '" type="text/css"'
);
document.insertBefore(newCSS, document.documentElement);
} else {
newCSS = document.createElement('link');
newCSS.rel = 'stylesheet';
newCSS.href = 'data:text/css,' + escape(styles);
newCSS.type = 'text/css';
document.documentElement.childNodes[0].appendChild(newCSS);
}
}
変更したのは15行目だけです("の前に\が必要なのかわかりませんが、よく見掛けるので)。ここを他のCSSファイルに置き換えれば幾つものスタイルを設定する事が可能です。もちろんその度にファイル名を変更して保存しなければなりませんので、それぞれにわかり易くはてな用.jsなどと付けるのが宜しいかと思います。ただ、あまりスタイルが増えすぎると煩雑になってコンテキストメニューが使い難くなるので、その際には名前の先頭に数字を割り振ると任意の順番に並べる事が可能です。また JavaScript Actions Menu を導入する事によって更に整理する事も可能です。(根本的に整理したい方は menueditor がオススメです。日本語版は 電網探題 からどうぞ)
右クリックは面倒だし、メインメニューも普段は使わないから消しちゃってるという方は JSActions Button がオススメです。これならば良く使う Action をボタンにしてツールバーの任意の場所に配置できます。項目がツリー化できれば更に便利なのですが。
個人的な技量により、ローカルのCSSファイルを読み込む方法はわかりませんでした(どなたかご教授下さい)。従って必要なCSSファイルはサーバにputしなければなりませんが、上記のように誰かが書いたCSSファイルを読み込む事も可能です。
これでとりあえずこれにて切り替えるのが面倒だからという理由は消えた訳ですが、妥当なHTMLではないサイトが多過ぎるという最大と言っても過言ではない理由が残っています。そこで見つけたのが スタイル無効化 なる CSSファイル です。これを取り込むことで
製作者がページへ施したスタイル指定を無効化します。 CSS のスタイルを無効化するのはもちろん、 <font> だの <b> だのが乱舞してるレガシーな HTML 記法によるスタイル効果をも無効化します。適用後は、あたかも文書構造のみを記した HTML であるかのような表示になります。それと、テーブルセルには点線枠が付加されます。 Camino べんりセット
とする事が可能です。これを読み込んだ上で更に任意のユーザスタイルシートを被せる事が出来れば完璧だと思ったのですが、如何せんその方法がわかりません。きっとJavaScriptを書ける人ならば簡単な事だと思うのですが、どうか教えて下さると本当に助かります。現状でも スタイル無効化CSS の最後尾に任意のCSSを追加すれば可能ですが、やはり美しくないですし、重くなりそうなので。
さて、これに サイト別CSS のような書き方を加えることにより更に強力なユーザスタイルシートを書く事も可能で、その上切り替えることが可能という柔軟性も出て来ました。これにて常用ブラウザが Firefox で JavaScript がオフだから という理由は殆ど消えた訳ですが、幾つか課題も残っていますので列挙しておきます。
三つ目はともかくも、一つ目と二つ目(特に二つ目)は簡単にできそうな気がします。重ね重ねしつこいようですが、書き方を教えて頂けると本当に助かります。
拡張の導入と、JavaScript の書き方を同時に進行したので説明が不十分でわかり難くかったかもしれません。このままでは不親切なのでもう一度流れをおさらいして置きます。
// スタイルシートを無効化します。
jsa_DisableStyleSheets();
function jsa_DisableStyleSheets(){
for(var i=0; i<document.styleSheets.length; i++){
document.styleSheets[i].disabled = true;
}
}
// ユーザー定義のスタイルシートを追加
jsa_SetCSS();
function jsa_SetCSS() {
// スタイルシートの書式を記述(@importでCSSを読み込む)
var newCSS, styles = '@import \"http://blog10.fc2.com/w/webbingstudio/file/userstyle.css\";';
if (document.contentType == 'application/xhtml+xml') {
newCSS = document.createProcessingInstruction(
'xml-stylesheet',
'href="data:text/css,' + escape(styles) + '" type="text/css"'
);
document.insertBefore(newCSS, document.documentElement);
} else {
newCSS = document.createElement('link');
newCSS.rel = 'stylesheet';
newCSS.href = 'data:text/css,' + escape(styles);
newCSS.type = 'text/css';
document.documentElement.childNodes[0].appendChild(newCSS);
}
}
最後に、元に戻す(製作者のCSSで閲覧する)方法ですが、ページを遷移するか、再読み込みするなどすると戻ります。
[ワツニュ]人ん家のスタイルシートで表示 のようなゲートウェイに値を渡すことでも実現可能なようです。
jsa_Send();
function jsa_Send(){
var sendURL = "http://www.officek.jp/skyg/wn/doc/csschange.cgi?url=";
var docURL = window.location;
var send2URL = "&css=http://blog10.fc2.com/w/webbingstudio/file/userstyle.css&font=1&bgcolor=1&body=1&headstyle=1&inlinestyle=1";
if(_jsaCScript.context.onLink) docURL = _jsaCScript.context.link.href;
_jsaCScript.loadURI(sendURL + escape(docURL) + send2URL);
}
五行目のCSSファイルを任意の物に書き換えて、同じように名前を付けて保存すれば良いです。CSSファイルのアドレスの後に続く値は ゲートウェイ の設定の強制削除の項目です。上記は全てチェックを入れた状態です。必要の無い項目は & から =1 までを削除すれば良いです。
紹介しておいて難ですが、ちょっと負荷がかかりそうな方法なのでできれば前者のような基本的な方法を用いた方が良いと思います。この方法はページを書き換えるのではなく、CGIを通してページを呼び出しています。ですのでページを戻れば元に戻ります。
raraさんこんばんは、WebbingStudioの洵と申します。
私のユーザースタイルシートを使っていただき、丁寧なご報告もくださってありがとうございます。
アレは自分が最低限読める範囲でしか装飾指定をしていませんが、応用の方はもちろん構いません。お気軽にどうぞ〜
>JavaScriptオフ
うわぁ WEBデザイナー泣かせですよraraさん(ぉぃ)
ということは、私のブログの追記部分は読めないということですよね…そろそろ他の方も使っているJavaScriptオフ対応スクリプトを導入しなくては。
JavaScript Actionsのことははじめて知りました。ブックマークレットの代用機能まで搭載できるなんて、やっぱりFirefoxは凄いブラウザですね。自家用にカスタマイズできるraraさんも凄いですが。
私も以前Greasemonkeyを入れようとして、安全面が不安になってやめた経緯があります。そういう方々のためにもこの代案を啓蒙していただけたらと思います。
ユーザースタイルシートをためらう理由に「記憶に残り難い」というくだりがありましたが、同感です。
HTML文書として考えれば、構造がきちんとしていればデフォルトでも充分かもしれませんが、ウェブサイトにはやはり自分の個性をアピールする要素もありますからね。
レガシーでかつ読みづらいサイトに遭遇したときは、まあこれも個性よね…と楽しむ方向で閲覧することにしてます。
(読むまでもないものは引き返しますが 笑)
どうもご足労を願いまして真に恐縮です。
それでは有り難くこのまま使用させていただきたいと思います。
本当にありがとうございます。
> ということは、私のブログの追記部分は読めないということですよね
いえ。アレ?普通に読めますよ?展開のスクリプト使用しているのですか?ちゃんとリンクされていますけれども。
> やっぱりFirefoxは凄いブラウザですね。
はい。求めれば全てが可能なような気さえします。もちろん技術が伴えばの話ですけれども。
> 自家用にカスタマイズできるraraさんも凄いですが。
とんでもないです。コピペのつぎはぎですよ。JavaScript は Hello World を表示する方法すらわかりません。
> レガシーでかつ読みづらいサイトに遭遇したときは、
> まあこれも個性よね…と楽しむ方向で閲覧することにしてます。
ソースやらデザインやらアクセシビリティは許せても、目が痛くなるのだけは勘弁して欲しいですね。もともと marquee やら blink やらはデフォルトで無効にしてありますが、色とコントラストだけはどうにもならないので。
あ、今はCFDNさんのチャイナさんテンプレートをお借りしているのでした(笑)
年明けからの新デザインは追記がJavaScriptオフ対応になりました(たぶん)ので、お時間のあるときにでもまた遊びにいらしてくださいね。
スクリプトの形跡はないし、IE でも Opera でもそれっぽい挙動をしなかったので不思議に思ってしまいました。でも [ cycle ] の時もそれほど苦労した記憶はありませんでした(RSSから直接個別記事へ移動しているので)。サイドバーのメニューの切り替えは出来ませんでしたけれども。
ついに MT の本格導入ですね。色々と大変そうですが、どうかごゆるりと。
それでは、よいお年を。
Grace looked pleased at first, to enjoy the advantages of the dog to the Monument, and the fowls?
Drewett is a proof of all the talk was to follow.
Hetty sleeps- answered Hetty, and 't will be her father was, in order to reach a moment of relaxation and general indolence which is about to proceed.
http://harmony.blog5.fc2.com/tb.php/222-79cb1029