2004年02月22日
microsoft.comのポップアップメニュー
microsoft.com のポップアップメニューはどのようにして実現されているかを調べてみた。
どうやら、スタイルシートで behavior を指定してるらしい(http://www.microsoft.com/library/flyoutmenu/default.cssより)。
.flyoutMenu { (snip) behavior: url(/library/flyoutmenu/default.htc); }
behavior ってIE限定の機能じゃん。開発効率が上がるけど、クロスブラウザを考えると嫌ですな。この時点で、さすがMSのサイト!という雰囲気がぷんぷん。
気になったのが、ポップアップメニューに影がついているのはどうやっているか(上図参照)。若干後ろの画像が透けてます。デフォルトのfilterを使っただけじゃ、ああはならないはずなのに。調べてみて驚愕。影を表示する関数を抜粋するとこんな感じ(http://www.microsoft.com/library/flyoutmenu/default.htcより抜粋)。
function makeRectangularDropShadow(el, color, size) { var i; for (i=size; i>0; i--) { var rect = document.createElement('div'); var rs = rect.style rs.position = 'absolute'; rs.left = (el.style.posLeft + i) + 'px'; rs.top = (el.style.posTop + i) + 'px'; rs.width = el.offsetWidth + 'px'; rs.height = el.offsetHeight + 'px'; rs.zIndex = el.style.zIndex - i; rs.backgroundColor = color; var opacity = 1 - i / (i + 1); rs.filter = 'alpha(opacity=' + (100 * opacity) + ')'; el.insertAdjacentElement('afterEnd', rect); global.fo_shadows[global.fo_shadows.length] = rect; } }
el は親エレメント、colorが影の色、sizeが影のサイズ(4で固定みたい)として呼び出されます。なんと、div エレメントを影のサイズ分だけ作成し、それぞれの場所を1pxずつ右下に配置し、どんどん透明にしていっている模様。ひえー、無茶苦茶するなぁ!