js+css在交互上的应用


Posted in Javascript onJuly 18, 2010

但灵活应用CSS会有给人眼前一亮的感觉!

以下用一个简单的例子来阐述我想说的。

CSS代码:

#nav li ul { 
display:none; 
}

HTML代码:
<div id="nav"> 
<ul class=""> 
<li> 
<h3>菜单1</h3> 
<ul> 
<li>子菜单1</li> 
<li>子菜单2</li> 
<li>子菜单3</li> 
<li>子菜单4</li> 
</ul> 
</li> 
<li> 
<h3>菜单2</h3> 
<ul> 
<li>子菜单1</li> 
<li>子菜单2</li> 
<li>子菜单3</li> 
<li>子菜单4</li> 
<li>子菜单4</li> 
</ul> 
</li> 
</ul> 
</div>

效果如下:
js+css在交互上的应用
需要的效果是:

1、初始时,所有的子菜单都是隐藏的。

2、点击菜单项,相应的子菜单列表显示。

3、再点击, 子菜单隐藏。

半年前的我的做法会是这样:取得#nav中的h3元素,循环在其上添加事件。事件判断其下一个兄弟节点是否隐藏,根据状态修改子菜单ul元素的display属性。

代码大致如下:(以下所有代码仅用于表达逻辑,请不要纠结于是否可执行。)

var els = [...]; //代码取得h3元素数组。 
for(var i=0; i < els.length; i++) { 
els[i].addEventListener("click",function() { 


var target = this.nextSibling; 


if(target.style.display == "none") 



target.style.display = "block"; 


else 



target.style.display = "none" 

}, false); 
}

一个月前的话,做法大概是这样:在#nav > ul上直接添加事件,在事件中判断目标对象是否h3对象。如果是则取得下一个兄弟节点,并根据其显示状态来修改display属性。
代码大致如下:
var container = document.getElementById("nav"); 
container.addEventListener("click", function(e) { 
var target = e.target, list; 

if(target.tagName == "H3") { 


list = target.nextSibling; 


if(list.style.display === "none") 



list.style.display = "block"; 


else 



list.style.display = "none"; 

} 
}, false);

两种做法,孰优孰劣请自行判断。
前段时间做了一个需求,在代码中看到另外的一种思路——这才是我在这里要说的——利用CSS来完成交互。
依然是代码:
CSS代码:
#nav li.menu ul { 
display:block; 
}

JS代码大致如下:
var el = document.getElementById("nav"); 
el.addEventListener("click", function(e) { 
var target = e.target.parentNode; 

if(target.tagName == "LI") { 


if(target.className == "") 



target.className = "menu"; 


}else { 



target.className = ""; 


} 

} 
}, false);

看看代码,貌似第三种方法跟第二种差不多嘛。
恩~~,如果点击h3元素不止是修改下一个ul元素的显示状态,比如还要修改h3的背景图案呢?
这时候第二个方法需要在根据h3的background属性来修改值,而第三种只需要添加一条样式:#nav li.menu h3{background:url(...)}即可了。

其他的就没什么好说了。大家都有自己的判断,孰优孰劣心里自有评断。

PS:
如果一个页面存在别的样式表影响了你的样式,就会有个优先权的问题。我们都知道id,class和tag的优先级别,但是对一个表达式,它的优先权是怎么计算的呢?
请google一下,或者先看看《老调重弹的CSS优先级》。

Javascript 相关文章推荐
简单JS代码压缩器
Oct 12 Javascript
JS 对象介绍
Jan 20 Javascript
用JQuery模仿淘宝的图片放大镜显示效果
Sep 15 Javascript
node.js chat程序如何实现Ajax long-polling长链接刷新模式
Mar 13 Javascript
jQuery学习笔记 获取jQuery对象
Sep 19 Javascript
PHP abstract与interface之间的区别
Nov 11 Javascript
Javascript中数组sort和reverse用法分析
Dec 30 Javascript
JavaScript中神奇的call()方法
Mar 12 Javascript
JS实现队列与堆栈的方法
Apr 21 Javascript
浅析创建javascript对象的方法
May 13 Javascript
vue双向绑定及观察者模式详解
Mar 19 Javascript
JavaScript中的this/call/apply/bind的使用及区别
Mar 06 Javascript
基于jQuery试卷自动排版系统
Jul 18 #Javascript
Date对象格式化函数代码
Jul 17 #Javascript
js下利用控制器载入对应脚本
Jul 17 #Javascript
js 纯数字不重复排列的另类方法
Jul 17 #Javascript
jQuery Autocomplete自动完成插件
Jul 17 #Javascript
一个js拖拽的效果类和dom-drag.js浅析
Jul 17 #Javascript
JavaScript 浏览器验证代码(来自discuz)
Jul 17 #Javascript
You might like
关于BIG5-HKSCS的解决方法
2007/03/20 PHP
PHP 万年历实现代码
2012/10/18 PHP
php登陆页的密码处理方式分享
2013/10/14 PHP
php获得文件大小和文件创建时间的方法
2015/03/13 PHP
php注册和登录界面的实现案例(推荐)
2016/10/24 PHP
PHP递归遍历指定文件夹内的文件实现方法
2016/11/15 PHP
浅谈PHP中类和对象的相关函数
2017/04/26 PHP
PHP7扩展开发教程之Hello World实现方法示例
2017/08/03 PHP
学习ExtJS table布局
2009/10/08 Javascript
利用js获取服务器时间的两个简单方法
2010/01/08 Javascript
浅谈javascript的数据类型检测
2010/07/10 Javascript
mailto的使用技巧分享
2012/12/21 Javascript
JS+CSS实现一个气泡提示框
2013/08/18 Javascript
Jquery 实现grid绑定模板
2015/01/28 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
2015/06/05 Javascript
关于session和cookie的简单理解
2016/06/08 Javascript
JQuery控制图片由中心点逐渐放大效果
2016/06/26 Javascript
深入理解jQuery()方法的构建原理
2016/12/05 Javascript
ES6学习教程之模板字符串详解
2017/10/09 Javascript
解决webpack dev-server不能匹配post请求的问题
2018/08/24 Javascript
Vue press 支持图片放大功能的实例代码
2018/11/09 Javascript
微信小程序制作表格的方法
2019/02/14 Javascript
Antd中单个DatePicker限定时间输入范围操作
2020/10/29 Javascript
Python实现自动登录百度空间的方法
2017/06/10 Python
对python函数签名的方法详解
2019/01/22 Python
Python数据类型之List列表实例详解
2019/05/08 Python
Python从函数参数类型引出元组实例分析
2019/05/28 Python
Django forms表单 select下拉框的传值实例
2019/07/19 Python
PyQt5+Pycharm安装和配置图文教程详解
2020/03/24 Python
Appium+Python实现简单的自动化登录测试的实现
2021/01/26 Python
计算机应用毕业生自荐信
2013/10/23 职场文书
出纳岗位职责模板
2013/11/27 职场文书
会计毕业自我鉴定
2014/02/05 职场文书
马云北大演讲完整版:真心话,什么才是阿里的核心竞争力?
2014/04/04 职场文书
合作协议书怎么写
2014/04/18 职场文书
vue组件冲突之引用另一个组件出现组件不显示的问题
2022/04/13 Vue.js