追記文章の折りたたみ Web2.0
Movable Type のオーソドックスなカスタマイズのひとつ、「追記文章の折りたたみ」の Web2.0 版カスタマイズをご紹介します。
1.特徴
- JavaScript エフェクトライブラリ script.aculo.us(スクリプタキュラス)を利用し、「続きを読む」リンクをクリックすると追記文章をスライドダウンで表示します。
- JavaScript が無効の場合はエントリー・アーカイブにジャンプします。
- 「続きを隠す」リンクは追記文章の前後に表示されますので、長い追記文章でも折りたたみやすくなっています。
- ライブラリファイルを編集せずに折りたたみ速度の変更が可能です。
2.サンプル
3.script.aculo.us のインストール
script.aculo.us のページの「get it already!」の下にある「Downloads page」のリンクをクリック。

次のページで「current version」の下にある「scriptaculous-js-1.7.0.zip(または拡張子が tar.gz / tar.bz2)」のリンクをクリック。バージョン 1.7.0 は2007年3月現在です。

ダウンロードアーカイブを解凍して内容をサーバのメインページと同じディレクトリにアップロード。ここでは下記のような配置になっていることを前提に話を進めます。
/scriptaculous
/lib
prototype.js
/src
controls.js
effects.js
scriptaculous.js
scriptaculous というディレクトリは解凍後のディレクトリ名を変更しています。lib と src はアーカイブのままの構成です。src 配下にはここで利用しないファイルも含まれていますので、まとめてアップロードしておくといいでしょう。
4.テンプレートの修正1(HTMLヘッダ修正)
折りたたみをしたいテンプレートの編集画面を開き、</head> の直前に下記を追加します。
<script type="text/javascript" src="<$MTBlogURL$>scriptaculous/lib/prototype.js"></script>
<script type="text/javascript" src="<$MTBlogURL$>scriptaculous/src/scriptaculous.js?load=effects"></script>
<script type="text/javascript" src="<$MTBlogURL$>scriptaculous/src/effects.js"></script>
<script type="text/javascript" src="<$MTBlogURL$>scriptaculous/src/controls.js"></script>
<script type="text/javascript">
Effect.DefaultOptions = {
transition: Effect.Transitions.sinoidal,
duration: 0.5, // seconds
fps: 60.0, // max. 60fps due to Effect.Queue implementation
sync: false, // true for combining
from: 0.0,
to: 1.0,
delay: 0.0,
queue: 'parallel'
}
function ajaxShowHide(entryID) {
element = $('Text' + entryID);
if(element.style.display == 'none') {
options = {
afterFinish: function(effect) {
$('Link' + entryID).firstChild.innerHTML = '≪ 続きを隠す';
Element.show(effect.element);
}
};
Effect.BlindDown(element, options);
} else {
options = {
afterFinish: function(effect) {
$('Link' + entryID).firstChild.innerHTML = '続きを読む ≫';
Element.hide(effect.element);
}
};
Effect.BlindUp(element, options);
}
}
</script>
6行目以降は script 開始・終了タグを外して外部ファイルにしても構いません(その場合インクルードするための script タグは effct.js をインクルードしている script 要素の下に記述してください)。
折りたたみ速度を変更する場合は、
duration: 0.5, // seconds
の数値を変更します。0.5 はスライドアップ・スライドダウンに 0.5 秒かかることを意味します。
この Effect.DefaultOptions = { … } の部分は scriptaculous ライブラリの設定の上書きですので、速度を変更しない場合はここから削除しても構いません。ちなみにデフォルトは1秒に設定されています。
5.テンプレートの修正2(追記文章表示用 MT タグ修正)
追記部分を修正します。デフォルトテンプレートと公開テンプレートの変更例を示します。
変更前(デフォルトテンプレート)
<MTIfNonEmpty tag="EntryMore" convert_breaks="0">
<p class="entry-more-link">
<a href="<$MTEntryPermalink$>#more">続きを読む "<$MTEntryTitle$>" »</a>
</p>
</MTIfNonEmpty>
変更前(公開テンプレート)
<MTEntryIfExtended>
<div class="entry-more">
<a href="<$MTEntryPermalink$>#more">続きを読む "<$MTEntryTitle$>"</a>
</div>
</MTEntryIfExtended>
変更後(デフォルトテンプレート/公開テンプレート共通)
<MTIfNonEmpty tag="EntryMore" convert_breaks="0">
<div id="Link<$MTEntryID$>" class="ajax-entry-more-link"><a href="<$MTEntryPermalink$>" name="<$MTEntryID pad="1"$>" onclick="ajaxShowHide('<$MTEntryID$>');return false;">続きを読む ≫</a></div>
<div id="Text<$MTEntryID$>" style="display: none">
<$MTEntryMore$>
<div class="ajax-entry-more-link"><a href="<$MTEntryPermalink$>" name="<$MTEntryID pad="1"$>" onclick="ajaxShowHide('<$MTEntryID$>');return false;">≪ 続きを隠す</a></div>
</div>
</MTIfNonEmpty>
エントリー・アーカイブは下記の内容を利用してください。JavaScript が OFF でも追記部分が読めるよう、noscript タグで追記を表示するようにしています。
変更後・エントリーアーカイブ(デフォルトテンプレート/公開テンプレート共通)
<MTIfNonEmpty tag="EntryMore" convert_breaks="0">
<div id="Link<$MTEntryID$>" class="ajax-entry-more-link"><a href="<$MTEntryPermalink$>" name="<$MTEntryID pad="1"$>" onclick="ajaxShowHide('<$MTEntryID$>');return false;">続きを読む ≫</a></div>
<div id="Text<$MTEntryID$>" style="display: none">
<$MTEntryMore$>
<div class="ajax-entry-more-link"><a href="<$MTEntryPermalink$>" name="<$MTEntryID pad="1"$>" onclick="ajaxShowHide('<$MTEntryID$>');return false;">≪ 続きを隠す</a></div>
</div>
<noscript>
<div id="more" class="entry-more"><$MTEntryMore$></div>
</noscript>
</MTIfNonEmpty>
上記のスクリプトは貼り付けた後、編集しても構いませんが、div 開始タグと a 開始タグの間に改行を含まないようにしてください(Firefox で正常に動作しなくなります)。
6.CSS
「続きを読む」「続きを隠す」のリンクに class 属性 ajax-entry-more-link を与えています。必要に応じて設定してください。
.ajax-entry-more-link {
/* 任意のプロパティを設定 */
}
7.その他
HTML ページの1行目に XML 宣言がある場合、IE6 では動作がややスムーズではありません(開く瞬間と閉じた瞬間にビクッとなります)。サンプルの公開テンプレートは XML 宣言を外しています。
2007.03.08 追記
JavaScript ライブラリのインクルード順を変更しました(エラーになるため)
追記文章の折りたたみ(閉じた時にページトップに戻る方法)
オーソドックスなカスタマイズとして、昔紹介した「追記文章の折りたたみ用スクリプト(改)」ですが、「折りたたみを閉じた時にページトップに戻る方法はないでしょうか」というご質問を頂きましたので、本エントリーでその方法を紹介致します。
1.方法
実は、下記リンクに示すオリジナルのスクリプト、
は、閉じた時にページトップに戻る動作になっており、「追記文章の折りたたみ用スクリプト(改)」は、それをトップに戻らないように変更したものです(そのことを忘れてました、すいません)。
したがってオリジナルの内容に戻せば期待する動作になりますので、追記部分のMTタグの赤色部分の "false"
<MTEntryIfExtended>
<div id="Link<$MTEntryID$>">
<a href="<$MTEntryPermalink$>" name="<$MTEntryID pad="1"$>" onclick="showHide(<$MTEntryID$>,'<$MTEntryPermalink$>',this);return false;">続きを読む ≫</a>
</div>
<div id="Text<$MTEntryID$>" style="display: none">
<$MTEntryMore$>
<a href="<$MTEntryPermalink$>" name="<$MTEntryID pad="1"$>" onclick="showHide(<$MTEntryID$>,0,this);return false;">≪ 続きを隠す</a>
</div>
</MTEntryIfExtended>
を、青色の "true" に修正してください。
<MTEntryIfExtended>
<div id="Link<$MTEntryID$>">
<a href="<$MTEntryPermalink$>" name="<$MTEntryID pad="1"$>" onclick="showHide(<$MTEntryID$>,'<$MTEntryPermalink$>',this);return false;">続きを読む ≫</a>
</div>
<div id="Text<$MTEntryID$>" style="display: none">
<$MTEntryMore$>
<a href="<$MTEntryPermalink$>" name="<$MTEntryID pad="1"$>" onclick="showHide(<$MTEntryID$>,0,this);return true;">≪ 続きを隠す</a>
</div>
</MTEntryIfExtended>
2.備考
このように、onclick 属性で実行されたスクリプトの戻り値が true(ここでは "return true;" と記述されている部分が該当)であれば、href 属性に記述された URL に遷移します。
折りたたみを開いた時にページトップに遷移しないのは、開く時の onclick 属性の最後に "return false;" と記述されているからです。
ちなみにこのカスタマイズをエントリーしたのが約2年半前。乏しい知識の中で折りたたみ動作がうまくカスタマイズできた時の喜びは今でも覚えています。
で、「今なら Ajax もありだな」と思い立ったので、明日は Ajax 版を公開したいと思います。

