各位應該會多會少有收到從朋友的 MSN 傳來不知名的網址,通常這類的網址點了都不是什麼好康的。不過梅干昨天傳了一個網頁過來,其中有個 Flash 的效果是用來展出使用前後的比對:
使用者可以透過滑鼠的移動來控制上層圖片的寬度,這樣的效果是不是像是某功能使用前跟使用後的比對呢?看到這樣有趣的效果,怎能有不用 jQuery 來實做看看的道理呢?所以..
首先到梅干的網站再 A 幾張圖,接著把 HTML 架構排好:
檢視原始碼 HTML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <body> <div id="abgne-block-20110112"> <div class="bd"> <div class="info first"> <div class="desc">著色前</div> <a href="#"><img src="images/2_after.jpg" /></a> </div> <div class="info"> <div class="desc">著色後</div> <a href="#"><img src="images/2_before.jpg" /></a> </div> </div> </div> </body> |
下一步就是利用 CSS 來排版,並使圖片所在的區塊能重疊:
檢視原始碼 CSS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | a img { border: none; vertical-align:middle; } #abgne-block-20110112 { position: relative; width: 600px; height: 420px; overflow: hidden; } #abgne-block-20110112 .bd .info { width: 100%; height: 100%; position: absolute; overflow: hidden; } #abgne-block-20110112 .bd .info .desc { height: 45px; font-size: 24px; line-height: 45px; padding-left: 10px; text-align: right; overflow: hidden; } #abgne-block-20110112 .bd .first .desc { background: #09c; color: #fff; text-align: left; } #abgne-block-20110112 .bd .first { width: 300px; z-index: 10; } |
完成 HTML 及 CSS 的設定之後,就能看出類似的畫面了:
通常筆者都是先把想要的效果畫面排好之後,再補上 jQuery 來使其能"動"起來:
檢視原始碼 JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | $(function(){ // 先取得 #abgne-block-20110112區塊及其寬 var $block = $('#abgne-block-20110112'), _width = $block.width(); // 當滑鼠在 $block 上移動時 $block.mousemove(function(evt){ // 取得目前滑鼠的 x 座標 var $this = $(this), _x = evt.pageX || evt.layerX; // 計算位置使其不超出 $block _x = _x <= 1 ? 0 : _x >= _width - 1 ? _width : _x; // 控制 .first 區塊的寬度 $('.first', $block).css({ width: _x }); }); }); |
這樣就能利用滑鼠的 x 座標來控制 .first 區塊的寬度囉:
不過這樣在移動時只能仔細的看滑鼠指針的位置,若要做到像原網頁一樣有個控制鈕的話,咱們得在 CSS 中新增:
檢視原始碼 CSS
1 2 3 4 5 6 7 8 9 | /* 控制鈕 */ #abgne-block-20110111-2 span.control { display: block; width: 100%; height: 100%; background: url(images/btn.png) no-repeat center center; position: absolute; z-index: 11; } |
接著程式中就把原本用來觸發 mousemove() 事件的 $block 改成 $control:
檢視原始碼 JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | $(function(){ // 先取得 #abgne-block-20110112區塊及其寬高 // 並加入 .control 控制鈕用的區塊 var $block = $('#abgne-block-20110111-2'), _width = $block.width(), _height = $block.height(), $control = $block.append('<span class="control"></span>').find('.control'); // 當滑鼠在 $control 上移動時 $control.mousemove(function(e){ // 取得目前滑鼠的 x 及 y 座標 var $this = $(this), _x = e.pageX || e.layerX || 0, _y = e.pageY || e.layerY || 0; // 計算位置使其不超出 $block _x = _x <= 1 ? 0 : _x >= _width - 1 ? _width : _x; _y = _y <= 1 ? 0 : _y >= _height - 1 ? _height : _y; // 控制 .first 區塊的寬度 $('.first', $block).css({ width: _x }); // 同時利用背景圖片位置的改變來移動控制鈕 $this.css({ backgroundPosition: (_x - 20)+"px " + (_y-20) + "px" }); }); }); |
將將~多了個顯示用的控制鈕,是不是移動起來就更有 fu 了呢(圖片是梅干熱情提供的唷)!
啊~不過這圖片效果怎麼會讓我想到了"天蠶變"咧!
酷斃了!
謝謝你的教學,只能說真的“酷斃了”!
試做了一下 很好玩喔
不過下面這個網站的做法
http://www.abc.net.au/news/events/japan-quake-2011/beforeafter.htm
他把畫面兩邊限制住了 好像可以有效的抑制住脫太快卡住的感覺?
能教教這怎麼做的嗎?
把相同註解的部份的程式碼改成這樣
請問我測試只有chrome 不會有錯誤
其他像IE,firefox 開啟都會怪怪的
請問要怎麼解決?
http://qj.site11.com/photograph/report.html
感謝男丁大大的教學文
很簡單易懂~
已更新了, 再試試吧!
JQuery太厲害了!!但目前似乎還沒辦法取代FLASH...
感覺瀏覽器還是個大問題.
範例檔案不能下載耶((淚
好想要阿阿啊~~