WordPress导航菜单的滚动和淡入淡出效果的实现要点


Posted in PHP onDecember 14, 2015

滚动导航菜单
滚动菜单, 顾名思义是以滚动的方式显示和隐藏菜单的. 其实跟淡入淡出菜单和滚动菜单的原理是一样的, 前者是在触发事件的时候改变菜单的透明度, 而后者则是改变菜单的高度. 那为什么后者的处理难度会比前者高呢? 这正因为菜单高度的处理比透明度有更高的技巧要求. 下面我们就讨论一下该如何处理, 并难在什么地方.

初期化处理
为了处理更加灵活, 我们需要为它定义一个作为参数的滑动速度, 也就是每一个单位时间间隔, 菜单高度的改变幅度. 另外, 我们需要将菜单的初始高度定为 0.

// 速度来自参数, 默认没个时间单位移动 10px
this.speed = speed || 10;
// 设定初始化高度
this.util.setStyle(this.body, 'height', '0');

展开和折叠
展开和折叠的方法对应淡入淡出菜单的加强和减小不透明度, 只是处理对象不一样, 原理是一样的. 要注意将获取的高度转为整型再进行计算.

expand: function() {
 // 获取当前高度, 并整型化
 var height = parseInt(this.util.getStyle(this.body, 'height'));
 // 在时间单位内加上速度, 直到高度等于或超过最大高度
 height += this.speed;
 if(height >= this.height) {
 height = this.height;
 // 取消循环调用
 clearTimeout(this.tid);
 }
 // 重新设定菜单高度
 this.util.setStyle(this.body, 'height', height + 'px');
}
 
/**
 * 折叠菜单, 直到高度为 1 时隐藏菜单
 */
collapse:function() {
 // 获取当前高度, 并整型化
 var height = parseInt(this.util.getStyle(this.body, 'height'));
 // 在时间单位内减去速度, 直到高度等于或小于 1
 height -= this.speed;
 if(height <= 1) {
 height = 1;
 // 隐藏菜单
 this.util.setStyle(this.body, 'visibility', 'hidden');
 // 取消循环调用
 clearTimeout(this.tid);
 }
 // 重新设定菜单高度
 this.util.setStyle(this.body, 'height', height + 'px');
}

激活菜单的瞬间
十分十分十分重要, 滚动菜单中最具技巧, 也最有意思的一部分.
本程序中, 我对获取高度的方法进行了封装, 获取高度其实是返回元素的 offsetHeight. 按我的理解 (不知道是否正确), offsetHeight 会优先去获取 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;
 // 取消循环调用
 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');
 // 取消循环调用
 clearTimeout(this.tid);
 }
 // 重新设定透明度
 this.util.setStyle(this.body, 'opacity', this.opacity);
 this.util.setStyle(this.body, 'filter', 'alpha(opacity=' + this.opacity * 100 + ')');
}
PHP 相关文章推荐
PHP MSSQL 存储过程的方法
Dec 24 PHP
基于empty函数的判断详解
Jun 17 PHP
解析php5配置使用pdo
Jul 03 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
Jul 04 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
Oct 30 PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
Nov 08 PHP
php实现的一个简单json rpc框架实例
Mar 30 PHP
Yii遍历行下每列数据的方法
Oct 17 PHP
PHP符合PSR编程规范的实例分享
Dec 21 PHP
php封装一个异常的处理类
Jun 08 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
May 29 PHP
php中数组最简单的使用方法
Dec 27 PHP
php类中的$this,static,final,const,self这几个关键字使用方法
Dec 14 #PHP
Yii2隐藏frontend/web和backend/web的方法
Dec 12 #PHP
使用PHP+AJAX让WordPress动态加载文章的教程
Dec 11 #PHP
WordPress中制作导航菜单的PHP核心方法讲解
Dec 11 #PHP
搭建Vim为自定义的PHP开发工具的一些技巧
Dec 11 #PHP
PHP开发中AJAX技术的简单应用
Dec 11 #PHP
基于PHP如何把汉字转化为拼音
Dec 11 #PHP
You might like
php新建文件自动编号的思路与实现
2011/06/27 PHP
php中利用explode函数分割字符串到数组
2014/02/08 PHP
Smarty中的注释和截断功能介绍
2015/04/09 PHP
PHP中COOKIES使用示例
2015/07/26 PHP
PHP htmlentities()函数用法讲解
2019/02/25 PHP
js实现运行代码需要刷新的解决方法
2007/08/18 Javascript
js动态为代码着色显示行号
2013/05/29 Javascript
JavaScript显示表单内元素数量的方法
2015/04/02 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
2016/05/10 Javascript
js本地图片预览实现代码
2016/10/09 Javascript
jQuery继承extend用法详解
2016/10/10 Javascript
Nodejs下用submit提交表单提示cannot post错误的解决方法
2016/11/21 NodeJs
JS产生随机数的用法小结
2016/12/10 Javascript
Vue.js使用v-show和v-if的注意事项
2016/12/13 Javascript
javascript基础练习之翻转字符串与回文
2017/02/20 Javascript
详解用webpack2.0构建vue2.0超详细精简版
2017/04/05 Javascript
使用js实现单链解决前端队列问题的方法
2020/02/03 Javascript
详谈在flask中使用jsonify和json.dumps的区别
2018/03/26 Python
python range()函数取反序遍历sequence的方法
2018/06/25 Python
python如何保证输入键入数字的方法
2019/08/23 Python
python读取word 中指定位置的表格及表格数据
2019/10/23 Python
Python求平面内点到直线距离的实现
2020/01/19 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
阿玛瑞酒店中文官方网站:Amari.com
2018/02/13 全球购物
马来西亚和新加坡巴士票在线预订:CatchThatBus
2018/11/17 全球购物
党员自我批评与反省材料
2014/02/10 职场文书
竞选班干部的演讲稿
2014/04/24 职场文书
小学亲子活动总结
2014/07/01 职场文书
红领巾广播站广播稿(3篇)
2014/09/20 职场文书
六查六看六改心得体会
2014/10/14 职场文书
2015教师节师德演讲稿
2015/03/19 职场文书
在职人员跳槽求职信
2015/03/20 职场文书
2016党员学习《反对自由主义》心得体会
2016/01/22 职场文书
python利用while求100内的整数和方式
2021/11/07 Python
高性能跳频抗干扰宽带自组网电台
2022/02/18 无线电
介绍一下28个JS常用数组方法
2022/05/06 Javascript