Re: 「はてブのフッターを小さく固定にする」をグリモンにしてみた

「はてブのフッターを小さく固定にする」をグリモンにしてみた - SO NOTE そうのて (;^ω^)
こちらで先日作ったはてブのフッターを小さく固定にするユーザースタイルシートGreasemonkeyに応用されています

フッター上をカーソルが通過する度に一瞬伸び縮みするのが少し気になってた(;^ω^)ので、グリモンにさせてもらいました。

http://d.hatena.ne.jp/so_blue/20090218/1234969578

とのこと、確かに私自身もその挙動はちょっと気になってたので、こうした改善のフィードバックはとても有り難いですね。ありがとうございます。
で、そのGreasemonkeyについて少し気がついたことがあったので、こちらからもフィードバックを

// ==UserScript==
// @name           fixedBottomHatebuFooter
// @namespace      http://d.hatena.ne.jp/so_blue/
// @include        http://b.hatena.ne.jp/*
// ==/UserScript==
(function(){
	var btn_open = '\u25b2', btn_close = '\u25bc';
	var footer = document.getElementById('footer');
	if (footer) {
		//footerのstyle設定
		footer.style.position = 'fixed';
		footer.style.left = 'auto';
		footer.style.bottom = '0px';
		footer.style.zIndex = '100';
		footer.style.borderTopWidth = '3px';
		footer.style.height = '2.5em';
		footer.style.opacity = '0.8'; //透過したくない時はここをコメントアウト
		//伸縮ボタン作成とstyle設定
		var elmP = document.createElement('P');
		elmP.style.position = 'fixed';
		elmP.style.bottom = '0px';
		elmP.style.width = '99%';
		elmP.style.height = '1.5em';
		elmP.style.zIndex = '101';
		elmP.style.textAlign = 'right';
		var elmSPAN = document.createElement('SPAN');
		elmSPAN.style.cursor = 'pointer';
		elmSPAN.style.color = '#00f';
		elmSPAN.innerHTML = btn_open;
		elmSPAN.addEventListener('click', function(e) {
			var h = (footer.style.height == '2.5em') ? 'auto': '2.5em';
			var t = (e.target.innerHTML == btn_close) ? btn_open: btn_close;
			footer.style.height = h;
			e.target.innerHTML = t;
		}, false);
		elmP.appendChild(elmSPAN);
		document.body.appendChild(elmP);
	}
})();

こちらが元のGreasemonkey


特に気になったのはこの部分

		//footerのstyle設定
		footer.style.position = 'fixed';
		footer.style.left = 'auto';
		footer.style.bottom = '0px';
		footer.style.zIndex = '100';
		footer.style.borderTopWidth = '3px';
		footer.style.height = '2.5em';
		footer.style.opacity = '0.8';
(略)

となっているのですが、style属性を一つ一つ設定していくのは効率が悪いです。というのも指定していく度に再描画が行われてしまうので、1度に設定した方が良いでしょう

参考リンク

複数回のスタイル変更は一回にまとめよう - 効率的な JavaScript
この場合

	footer.setAttribute('style','position:fixed;left:auto;bottom:0px;z-index:100;border-top-width:3px;height:2.5em;opacity:0.8;');

とやってもいいのですが、今回はGreasemonkeyなのでGreasemonkeyAPIGM_addStyle関数を使ってスタイルシートの設定を行ってみます

		GM_addStyle(<><![CDATA[
			#footer{
				position: fixed;
				left: auto;
				bottom: 0px;
				z-index: 100;
				border-top-width: 3px;
				height: 2.5em;
				opacity: 0.8;
			}
		]]></>);

これだと、CSSの書き方で記述できるので、便利です。
ボタンについても、スタイルシートが書きやすいよう、idを割り振っておきます

		var elmP = document.createElement('P');
		elmP.id = 'HB_footerbtn';

名前は適当で。
で、あと気になったのは、フッターの表示がどうなっているかの判定

		elmSPAN.addEventListener('click', function(e) {
			var h = (footer.style.height == '2.5em') ? 'auto': '2.5em';
			var t = (e.target.innerHTML == btn_close) ? btn_open: btn_close;
			footer.style.height = h;
			e.target.innerHTML = t;
		}, false);

今回はオンかオフしかないので、その判定を1回だけにまとめた方が効率が良いのでは?と考えました。
それも合わせると

(function(){
	var btn_open = '\u25b2', btn_close = '\u25bc';
	var footer = document.getElementById('footer');
	if (footer) {
		var elmP = document.createElement('P');
		elmP.id = 'HB_footerbtn';			//idを設定
		var elmSPAN = document.createElement('SPAN');
		elmSPAN.textContent = btn_open;
		elmSPAN.addEventListener('click', function(e) {
			var h,t;
			if(this.textContent == btn_open){	//style属性ではなく、ボタンでフッターの状態を判定
				h = 'auto';
				t = btn_close;
			}else{
				h = '2.5em';
				t = btn_open;
			}
			footer.style.height = h;
			this.textContent = t;
		}, false);

		//スタイルの設定
		GM_addStyle(<><![CDATA[
			#footer{
				position: fixed;
				left: auto;
				bottom: 0px;
				z-index: 100;
				border-top-width: 3px;
				height: 2.5em;
				opacity: 0.8;			/* 透過したくない時はここをコメントアウト */
			}
			#HB_footerbtn{
				position: fixed;
				bottom: 0px;
				width: 99%;
				height: 1.5em;
				z-index: 101;
				text-align: right;
				margin: 0;			/* 継承があるので追加 */
			}
			#HB_footerbtn span{
				cursor: pointer;
				color: #00f;
			}
		]]></>);

		elmP.appendChild(elmSPAN);
		document.body.appendChild(elmP);
	}
})();

こんな感じになりました。
これで機能はそのまま高速化されています(とは言え、体感できるレベルでないですが)。なんか勝手に添削するみたいになりましたが、せっかくフィードバックをいただいたのでこちらも、というところで。
参考になれば幸いです。

あと

三項演算子を使った代入は正直あまり理解してなかったので、そちらも参考になりました。

追記

ページによっては、元のスタイルシートの指定を継承されてるので、margin: 0;を追加。あと、個人的にはSBMカウンターを利用しているので、表示が重ならないよう右隅ではなくもうちょっとずらして使ってます。