HOME>WEBプログラム覚書>[jQuery]なるほど、わからん。.slideDown()

[jQuery]なるほど、わからん。.slideDown()

jQueryの.slideDown()のこの動き。

サンプル

実行結果

slideDown()

ここは表示

Javascript

  1. $(function(){
  2.     $('#demo1 span').on('click', function(e){
  3.         $('#demo1 .slide-content').animate({height: 'show'});
  4.     });
  5. });

HTML

  1. <div id="demo1">
  2.     <span class="cq-btn">slideDown()</span>
  3.  
  4.     <p class="slide-content" style="display: none;">
  5.     ここは最初非表示<br />
  6.     ここは最初非表示<br />
  7.     ここは最初非表示<br />
  8.     ここは最初非表示<br />
  9.     ここは最初非表示<br />
  10.     ここは最初非表示<br />
  11.     ここは最初非表示<br />
  12.     ここは最初非表示<br />
  13.     ここは最初非表示<br />
  14.     ここは最初非表示<br />
  15.     ここは最初非表示<br />
  16.     </p>
  17.  
  18.     <p class="slide-content-bottom" style="color: FFFFFF; background: #859900;">
  19.     ここは表示
  20.     </p>
  21. </div>

なめらかですよね。最新のzepto.jsのデフォルトにfxが入ってなかったので、ビルドするのも面倒だし この動きを自分で作ろうと思ったんですが、簡単にはできそうもありませんでしたw

このなめらかな動きを実現するためには表示開始前(非表示状態の時)に高さを取得する必要があるわけですが、 いかんせんdisplayがnoneの場合、取得できません。CSS3とかで何とかならないかと考えましたが、どうにも無理っぽい。 高さが決まってれば何とかなるんでしょうけど。

なのでjQueryはどうやってこれをやってるのか調べたところ、 どうやら非表示要素のコピーを見えないようにDOMに追加して高さを取得して削除しているようです。 最近のバージョンはソースが理解できなそうだったので1.0での話ですが。 そんな面倒なことやってるのかという感じです。

サンプルコード

上記コードをjQuery1.0のDOM追加後の削除部分をコメントアウトして実行。

jQuery1.0 371~385行目
  1. jQuery.swap( e, old, function() {
  2.     if (jQuery.css(e,"display") != "none") {
  3.         oHeight = e.offsetHeight;
  4.         oWidth = e.offsetWidth;
  5.     } else {
  6.         e = $(e.cloneNode(true)).css({
  7.             visibility: "hidden", position: "absolute", display: "block"
  8.         }).prependTo("body")[0];
  9.  
  10.         oHeight = e.clientHeight;
  11.         oWidth = e.clientWidth;
  12.  
  13.         console.log(document);
  14.         //e.parentNode.removeChild(e);
  15.     }
  16. });

確かに body 直下に

HTML

  1. <p class="slide-content" style="display: block; overflow: hidden; padding: 0px; border-width: 0px; visibility: hidden; position: absolute;">...</p>

が追加されてますね。visibility:hidden と position: absolute を指定することで DOMに存在しながら表示はされないという状態を作ってます。

これはあくまで1.0の対応なので現在どうなってるか気になる方は調査してみてください。

投稿日 2014年2月11日 04:18
カテゴリ JavaScript
タグ jQuery
トラックバック URL http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1353

コメント

コメントする
Name
Email Address
URL