前回の記事『Creating Collapsible Detail Regions in a Repeater』では、いくつかのクライアント側JavaScriptとHTML、それにRepeaterコントロールを使って、大量の情報を管理する方法を紹介しました(Repeaterを使った折りたたみ可能な領域のライブデモをご覧ください)。先週の記事を書いた後、このコンセプトを発展させて「もっと美しい」ユーザインターフェイスを提供するにはどうすればよいかを考えました。私が絵画や芸術的なものに心を傾ける人間でないことは率先して認めますが、美しいインターフェイスに仕上げようとする取り組みは、共有する価値があると思います(今回のライブデモをご覧ください)。
このインターフェイスの最終目標は、Visual Studio .NETのツールボックスからWebコントロールをドロップするだけでタブ付きインターフェイスを作り出せる、カスタムのASP.NETサーバコントロールを開発することです。しかし、このプロジェクトの完了までには時間がかかりそうなので、まずは現時点で実現できているRepeaterとクライアント側のスクリプトおよびマークアップを紹介しておきたいと思います。そう考えた理由は2つあります。1つは、このインターフェイスの外観をサイトに組み込んでもらうことで皆さんのお役に立てれば、と思ったことです。もう1つは、このクライアント側のスクリプトとマークアップはかなり活用できそうだからです。Internet Explorerでは、見た目にも素晴らしいものになります。しかし、FireFoxでは、機能はするものの、満足のいく見栄えとはとても言えません(まだ、IEとFireFox以外のブラウザではテストしていません)。私よりもCSSとDHTMLの経験のある方から、この状況の改善に役立つアドバイスをいただけるのではないかと期待しています。
<asp:Repeaterrunat="server" ...><ItemTemplate>
... render parent (or abbreviated) information ...
... render child (or detailed) information ...
</ItemTemplate></asp:Repeater>
こうしたRepeaterを使うと、ページにレンダリングされるHTMLは次のようになります。
... markup for parent (or abbreviated) information for item 1...
... markup for child (or detailed) information for item 1...
... markup for parent (or abbreviated) information for item 2...
... markup for child (or detailed) information for item 2...
...
... markup for parent (or abbreviated) information for item N...
... markup for child (or detailed) information for item N...
各情報を含む<div>において高さが明示的に設定されない場合、setInitialPositions()関数は、詳細情報のアイテムのうち最大の高さを求めて、その<div>の高さに割り当てます(これにより、すべての子または詳細アイテムは、各自がどれだけの情報を持っているかに関係なく、最も大きな子または詳細アイテムの高さに揃えられます)。詳細情報を含む<div>の上座標と左座標を求めるには、2つの再帰関数getAscendingTops(element)とgetAscendingLefts(element)を使います。これらの関数は、渡された要素に含まれるHTML要素の集合を調べ、それぞれ上オフセットと左オフセットを足し合わせていくものです。この手法の詳細については、『Determining the Location of a Nonpositioned Element』を参照してください。私が提供しているフリーのオープンソース部品、ASP.NETメニューコントロールskmMenuでは、この手法を利用しています。