アコーディオン式に開いたり閉じたり

きっと探すと、jQueryとかを利用するやつしかみつけられないだろうから
徹夜して書いた。十数行だけどね。自分のレベルは、この辺だな ^^;

<!DOCTYPE html>
<title></title>

<style type="text/css">
  #fuga { width:500px; font-size:40px; background:#ccc;}
</style>

<body>
  <p>
    <input type="button" value="open/close" onclick="hoge.toggle()">
  </p>
  <div id="fuga">
    a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>
  </div>

<script type="text/javascript">

var Shutter = function ( n, g ) {
  var tmid = 0, time = 0, span = 20, s = n.style;

  this.open = function ( ) { start (g = Math.abs(g)) };
  this.close = function ( ) { start (g = -Math.abs(g)) };
  this.toggle = function ( ) { start (g *= -1) };
  
  function stop ( ) { tmid && clearInterval( tmid ); tmid = time = 0 };
  function start ( ) { stop(); tmid = setInterval( move, span ) };

  function move ( ) {
    var y = n.offsetHeight + g * (time += span) |0;
    if (((n.scrollHeight < y) && (y = n.scrollHeight)) || ((y < 0) && !(y=0))) stop();
    s.height = y + 'px';
  };
  n.style.overflow = 'hidden';
  0 < g ? this.open(): this.close();
};


Shutter.create = function (eid, g) {
  var n = document.getElementById (eid);
  return n ? new Shutter (n, g || 9.8): null;
};

var hoge = Shutter.create ('fuga', -0.12); //第2引数がマイナスだと、clocs()が呼ばれ閉じる

</script>