WordPress導航菜單的滾動和淡入淡出效果的實現(xiàn)要點
滾動導航菜單
滾動菜單, 顧名思義是以滾動的方式顯示和隱藏菜單的. 其實跟淡入淡出菜單和滾動菜單的原理是一樣的, 前者是在觸發(fā)事件的時候改變菜單的透明度, 而后者則是改變菜單的高度. 那為什么后者的處理難度會比前者高呢? 這正因為菜單高度的處理比透明度有更高的技巧要求. 下面我們就討論一下該如何處理, 并難在什么地方.
初期化處理
為了處理更加靈活, 我們需要為它定義一個作為參數(shù)的滑動速度, 也就是每一個單位時間間隔, 菜單高度的改變幅度. 另外, 我們需要將菜單的初始高度定為 0.
// 速度來自參數(shù), 默認沒個時間單位移動 10px this.speed = speed || 10; // 設定初始化高度 this.util.setStyle(this.body, 'height', '0');
展開和折疊
展開和折疊的方法對應淡入淡出菜單的加強和減小不透明度, 只是處理對象不一樣, 原理是一樣的. 要注意將獲取的高度轉(zhuǎn)為整型再進行計算.
expand: function() {
// 獲取當前高度, 并整型化
var height = parseInt(this.util.getStyle(this.body, 'height'));
// 在時間單位內(nèi)加上速度, 直到高度等于或超過最大高度
height += this.speed;
if(height >= this.height) {
height = this.height;
// 取消循環(huán)調(diào)用
clearTimeout(this.tid);
}
// 重新設定菜單高度
this.util.setStyle(this.body, 'height', height + 'px');
}
/**
* 折疊菜單, 直到高度為 1 時隱藏菜單
*/
collapse:function() {
// 獲取當前高度, 并整型化
var height = parseInt(this.util.getStyle(this.body, 'height'));
// 在時間單位內(nèi)減去速度, 直到高度等于或小于 1
height -= this.speed;
if(height <= 1) {
height = 1;
// 隱藏菜單
this.util.setStyle(this.body, 'visibility', 'hidden');
// 取消循環(huán)調(diào)用
clearTimeout(this.tid);
}
// 重新設定菜單高度
this.util.setStyle(this.body, 'height', height + 'px');
}
激活菜單的瞬間
十分十分十分重要, 滾動菜單中最具技巧, 也最有意思的一部分.
本程序中, 我對獲取高度的方法進行了封裝, 獲取高度其實是返回元素的 offsetHeight. 按我的理解 (不知道是否正確), offsetHeight 會優(yōu)先去獲取 CSS 樣式中的高度并返回, 當樣式為空時才會去獲取元素的實際高度. 所以有以下代碼:
// 獲得初始高度, 當鼠標在菜單標題上時獲得展開時的初始高度, 當鼠標在菜單體上時取得菜單的實際高度 var initHeight = this.util.getStyle(this.body, 'height'); // 獲得實際高度, 必須先清空樣式的高度, 否則只會得到樣式中的高度 this.util.setStyle(this.body, 'height', ''); this.height = this.util.getHeight(this.body); // 重新設定初始高度 this.util.setStyle(this.body, 'height', initHeight);
淡出淡入導航菜單
實施操作
前面的分析說得有點啰嗦了, 還是看看代碼吧. :) 為了突出改動的部分, 我在代碼中加入了一些 Log.
初始化
初始不透明度為 0, 而最大不透明度為被設定值或者 1.
// 定義透明度, 默認透明 this.opacity = 0; this.maxopacity = opacity || 1;
激活
先進行前期處理, 再對菜單的透明度進行處理.
/**
* 激活方法
* 當鼠標移動到菜單標題是激活
*/
activate: function() {
// 獲取當前菜單體的位置
var pos = this.util.cumulativeOffset(this.title);
var left = pos[0];
var top = pos[1] + this.util.getHeight(this.title);
// 定義激活時樣式
this.util.setStyle(this.body, 'left', left + 'px');
this.util.setStyle(this.body, 'top', top + 'px');
this.util.setStyle(this.body, 'visibility', 'visible');
this.util.setStyle(this.body, 'opacity', this.opacity);
this.util.setStyle(this.body, 'filter', 'alpha(opacity=' + this.opacity * 100 + ')');
if(this.tid) {
clearTimeout(this.tid);
}
// 不斷加強菜單的不透明度
this.tid = setInterval(this.util.bind(this, this.appear), 30);
}
加強菜單的不透明度, 直到透明度到達最大不透明度.
/**
* 加強不透明度, 直到最大不透明度
*/
appear: function() {
this.opacity += 0.1;
if(this.opacity >= this.maxopacity) {
this.opacity = this.maxopacity;
// 取消循環(huán)調(diào)用
clearTimeout(this.tid);
}
// 重新設定透明度
this.util.setStyle(this.body, 'opacity', this.opacity);
this.util.setStyle(this.body, 'filter', 'alpha(opacity=' + this.opacity * 100 + ')');
}
解除
對菜單的透明度進行處理.
/**
* 解除方法
* 當鼠標移動出菜單標題是激活
*/
deactivate: function(){
if(this.tid) {
clearTimeout(this.tid);
}
// 不斷減弱菜單的不透明度
this.tid = setInterval(this.util.bind(this, this.fade), 30);
}
減弱菜單的不透明度, 直到透明度為 0 并隱藏菜單.
/**
* 減小不透明度, 直到完全透明隱藏菜單
*/
fade:function() {
this.opacity -= 0.1;
if(this.opacity <= 0) {
this.opacity = 0;
// 隱藏菜單
this.util.setStyle(this.body, 'visibility', 'hidden');
// 取消循環(huán)調(diào)用
clearTimeout(this.tid);
}
// 重新設定透明度
this.util.setStyle(this.body, 'opacity', this.opacity);
this.util.setStyle(this.body, 'filter', 'alpha(opacity=' + this.opacity * 100 + ')');
}
相關文章
ThinkPHP連接ORACLE數(shù)據(jù)庫的詳細教程
ThinkPHP要連接Oracle數(shù)據(jù)庫,必須有兩個東西,一個PHP官方寫的擴展,一個Oracle官方寫的客戶端,本文小編給大家詳細介紹了ThinkPHP連接ORACLE數(shù)據(jù)庫的教程,文中通過圖文結(jié)合的方式講解的非常詳細,需要的朋友可以參考下2023-12-12
在smarty中調(diào)用php內(nèi)置函數(shù)的方法
在smarty中調(diào)用php的內(nèi)置函數(shù),相信很多人都不是很很了解smarty的一個重要功能,就是能在smarty模板里面調(diào)用php的內(nèi)置函數(shù)2013-02-02
PHP中include()與require()的區(qū)別說明
本文主要介紹了PHP中include()與require()的區(qū)別。具有很好的參考價值,下面跟著小編一起來看下吧2017-02-02
php5.4以上版本GBK編碼下htmlspecialchars輸出為空問題解決方法匯總
這篇文章主要介紹了php5.4以上版本GBK編碼下htmlspecialchars輸出為空問題解決方法匯總,本文給出多種解決這個問題的方法,需要的朋友可以參考下2015-04-04

