細かい改修は結構ちょくちょく行っていたりするんですが、更新履歴には面倒くさいのであんまり載せていません。目に見える形で更新した場合は載せたりとかしますけど、基本的に主観に左右されまくり。今回は最新コメント・トラックバックの表示数を4つ、更新履歴を3つに減らしております。あと、なんとか「続きを読む」のを実装できました。
一応、こんな感じで。Javascriptで実装しているので、Javascriptが切られていると動きません。加えて表示の変更はCSSのスタイルに依存しているので、CSSを切られても意味が無くなってしまいます。JS+CSSなリッチクライアント環境のみ。シンクライアントな携帯電話のブラウザとか、JSかCSSの一方が使えない時はだらだら〜と表示されるだけ。Ajaxな感じで必要に応じて適宜読み込む、とかじゃないんで。
この実装に苦心したのは、「今までの文章構造をいかに変更せずに実装するか」という点です。なので、今までの書き方でも今まで通り表現されること、追加としてはdivタグのみで実装すること、が条件でした。しかもdivはできるだけ簡潔にという制限付き。
実際に文章に書き加えるのは、「続きを読む」としてまとめたい文章を<div class="more"></div>で囲むだけ、という簡潔さ。無論、外部スクリプトを呼び出すためのscriptタグは必要ですけど。onclick属性もstyle属性も排除。やっぱプログラミングで実装すれば楽だわ。
で、その「続きを読む」本体はreadmore.jsとして、以下の通り。
// 特定のオブジェクトにイベントを追加
function addEvent(node,evt,func){
// イベント追加のプロパティ判別
if(node.addEventListener){
node.addEventListener(evt,func,false);
}
else if(node.attachEvent){
node.attachEvent("on"+evt,func);
}
}
// 対象オブジェクトの抽出
function getTarget(e){
// 対象オブジェクトのプロパティ判別
if(e.target){
return e.target;
}
else if(e.srcElement){
return e.srcElement;
}
}
// div.moreを検索しclickイベントを付加
function setHandler(){
var divElements = document.getElementsByClassName('more');
for(var i=0; i<divElements.length; i++){
addEvent(divElements[i],"click",changeClass);
// JSを切っている人のための対処
divElements[i].className = 'less';
}
}
// more/lessでclass名を入れ替える
function changeClass(e){
var t = getTarget(e);
switch(t.className){
case 'more': t.className = 'less'; break;
case 'less': t.className = 'more'; break;
default:
// 対象オブジェクトになければその親ノードも対象とする
var pr = t.parentNode;
switch(pr.className){
case 'more': pr.className = 'less'; break;
case 'less': pr.className = 'more'; break;
}
}
}
// ページ表示時にsetHandlerを動かす
addEvent(window,"load",setHandler);
ブラウザ毎の違いを吸収しながら、簡潔にclassの変更を行います。対応するCSSは以下の通り。
@charset "utf-8";
@import url(./text.css);
.less * {
display: none;
}
.less:before {
content: "続きを読む >>";
}
.more {
border-top: 1px solid #000;
}
.more * {
display: inherit;
}
.more:after {
content: "<< 続きを隠す(文章クリックでもOK)";
}
text.cssが母体となるcssで、これはindexにおけるの「続きを読む」機能に特化させたindex.cssとなります。カスケードできるから対処がめっちゃ楽だ。
とまぁ、こんな感じで長い文章を折りたたんでおけるのがグッド。特にこういった情報処理系のコラムとかは、読む人を選ぶしね。カテゴリから選択する分には問題ないし、個別エントリ表示では「続きを読む」は要らないはず。あくまでindexでごちゃまぜに表示する際、余分な情報を表示させないため。データとしては既に余分な情報もダウンロードしているんだけど、それはシンクライアントなブラウザへの配慮。あとAjaxはまだ無理だし。
これで専門特化した話題も気にせず書いていけるね!
※追記: IE6だとやっぱダメだわ。チクショウ。消えてなくなれIE。(´A`)
Comment