html5 スライド

html5 スライドだけど、 一切 Google API など使わずに、純粋に html5 + JavaScript でかけることがわかった。 Webに置く必要もない。ローカルファイルとして動く。 外部の API やよけいな JS や CSS を読み込む必要なし。

ただ全部コードを読んで、 JavaScript のコードが body 要素の最後に書かれていたので、見落としていたのでした。


        var currentSlideNo = 1;
        var slides = document.getElementsByClassName('slide');

        (function() {
          document.addEventListener('keydown', handleBodyKeyDown, false);
   
          var els = slides;
          for (var i = 0, el; el = els[i]; i++) {
            addClass(el, 'slide');
          }
          updateSlideClasses(); 
        })();

この辺が初期化しているところで、まず、handleBodyKeyDown という関数でキーボード入力を処理しますよ、 ということと、 addClass でスライド一枚一枚の class を生成しているよね。 ここでややこしいのは Slide というクラスを作っているわけではなくて、 ここでいうクラスというのは css の class のことだってことだわな。


        var handleBodyKeyDown = function(event) {
          switch (event.keyCode) {
            case 37: // left arrow
              prevSlide();
              break;
            case 39: // right arrow
              nextSlide();
              break;
          }
        };

これが、キー入力処理の本体で、prevSlide、nextSlide でスライド遷移。


        var nextSlide = function() {
          if (currentSlideNo < slides.length) {
            currentSlideNo++;
          }
          updateSlideClasses();
        };
        
        var prevSlide = function() {
          if (currentSlideNo > 1) {
            currentSlideNo--;
          }
          updateSlideClasses();
        };

これが、prevSlide と nextSlide の本体で、単に currentSlideNo をインクリメントしたりしてるだけだわな。 で、 updateSlideClasses で実際に表示させていると。


        var changeSlideElClass = function(slideNo, className) {
          var el = getSlideEl(slideNo);

          if (el) {
            removeClass(el, 'past current future');
            addClass(el, className);
          }
        };

        var updateSlideClasses = function() {
          window.location.hash = "slide" + currentSlideNo;
          changeSlideElClass(currentSlideNo - 1, 'past');
          changeSlideElClass(currentSlideNo, 'current');
          changeSlideElClass(currentSlideNo + 1, 'future');            
        };

class を動的に変更することによって、current を中央に配置し、 past を左端に、future を右端に表示。 なるほど。言われてみればそうかと。

あとは css の方で


        -webkit-transition: -webkit-transform 1s ease-in-out; 

とかってやるとなめらかにスライド移動したりとか、


        -webkit-transition: margin 0.25s ease-in-out; 

スライドをぴっちりウィンドウに合わせたりしてるんだと思う。 簡略版 おいときますので後はソースを見てみて。 mozilla 固有の css は全部削って、webkit のだけ残したんだが、 firefox3.6 でも -webkit-transition の部分以外はなんとかできてるのがけなげだな。 chrome だとばっちり動く。

いやまあ、これからは、html5の練習も兼ねて、プレゼン資料は html5でがりがり書くかなあと。 学生にも書かせるかなと。