その中の一つ、Image Cross Fade。これはオンマウスの時にクロスフェードで画像を入れ替える機能。このなかで廃止されたbrowserというプロパティを使っている。同等機能を提供するプラグインがないか探したりした。jQueryUIでも tabsウィジェットから rotate機能が廃止されたが、これはjQuery-UI-Tabs-Rotateというプラグインを追加してなんとかした。しかし、browserプロパティは今後もメンテナンスが必要になるかもしれないと思い、Image Cross Fadeに代わる別のプラグインを探そうと思ったのだが、幸いソースが割と短くて、自分で何とかできそうだったので、javascriptを思い出すためにもやってみた。
このスクリプトが何をやっているかを確認。切り替え後の画像を <img src="foreimage" class="fade" style="background-image: url(backimage);">中の style (css) から background-imageを抜き出す。
1 | var target = $$.css( 'backgroundImage' ).replace(/^url|[\(\) '"]/g, ' '); |
1 2 3 4 5 | $$.wrap( '<span style="position: relative;"></span>' ) .parent() .prepend( '<img>' ) .find( ':first-child' ) .attr( 'src' , target); |
1 2 3 4 | < span style = "position: relative;" > < img src = "backimage" > < img class = "fade" src = "foreimage" > </ span > |
1 2 3 4 5 6 7 | if ($.browser.msie || $.browser.mozilla) { $$.css({ 'position' : 'absolute' , 'left' : 0, 'background' : '' , 'top' : this .offsetTop }); } else if ($.browser.opera && $.browser.version < 9.5) { $$.css({ 'position' : 'absolute' , 'left' : 0, 'background' : '' , 'top' : "0" }); } else { // Safari $$.css({ 'position' : 'absolute' , 'left' : 0, 'background' : '' }); } |
で、最初は browerメソッドの代わりにユーザーエージェントを云々と考えるが、どのブラウザのどのバージョンがどんな挙動をするのかなんて、これまでの物もこれからの物もわからない。ならばどうしようと、要は position: absolute なんかを使わなければ良いわけである。
2枚の画像を重ね合わせる方法として、以前に使った方法を思い出し、wrapした spanの背景にする。こうすればブラウザが勝手に重ね合わせてくれる。早速 spanの背景に画像を指定するが、spanはインライン用素なためちゃんと幅と高さを計算してくれないみたいでずれてしまった。ならば最初からブロック要素の divに。おぉ。
ソースの変更は、先の $$.wrap('<span style="position: relative;"></span>')から browser判定分までごっそり削除し、
1 | $$.wrap( '<div style="background-image: url(' +target+ '); height: ' +$$.height()+ 'px; width: ' +$$.width()+ 'px;"></div>' ); |
1 2 3 | < div style = "background-image: backimage; height: XXpx; width: XXpx;" > < img class = "fade" src = "foreimage" > </ div > |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | ( function ($) { $.fn.cross = function (options) { return this .each( function (i) { var $$ = $( this ); var target = $$.css( 'backgroundImage' ).replace(/^url|[\(\) '"]/g, ' '); $$.wrap(' <div style="background-image: url( '+target+' ); height: '+$$.height()+' px; width: '+$$.width()+' px;"></div> '); $$.hover(function () { $$.stop().animate({ opacity: 0 }, 250); }, function () { $$.stop().animate({ opacity: 1 }, 250); }); }); }; })(jQuery); $(window).bind(' load ', function () { $(' img.fade').cross(); }); |
0 件のコメント:
コメントを投稿