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 相关文章推荐
基础的prototype.js常用函数及其用法
Mar 10 Javascript
细品javascript 寻址,闭包,对象模型和相关问题
Apr 27 Javascript
JQuery 引发两次$(document.ready)事件
Jan 15 Javascript
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
Jan 15 Javascript
fancybox modal的完美解决(右上的X)
Oct 30 Javascript
javascript中有趣的反柯里化深入分析
Dec 05 Javascript
javascript中常用编程知识
Apr 08 Javascript
Bootstrap CSS组件之导航(nav)
Dec 17 Javascript
AngularJS页面传参的5种方式
Apr 01 Javascript
JavaScript变量声明var,let.const及区别浅析
Apr 23 Javascript
原生JS实现的简单小钟表功能示例
Aug 30 Javascript
vue3实现v-model原理详解
Oct 09 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
实用函数9
2007/11/08 PHP
php 取得瑞年与平年的天数的代码
2009/08/10 PHP
php在程序中将网页生成word文档并提供下载的代码
2012/10/09 PHP
thinkphp数据查询和遍历数组实例
2014/11/28 PHP
javascript第一课
2007/02/27 Javascript
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
EXT窗口Window及对话框MessageBox
2011/01/27 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
2014/01/17 Javascript
JS图片无缝、平滑滚动代码
2014/03/11 Javascript
jQuery使用toggleClass方法动态添加删除Class样式的方法
2015/03/26 Javascript
JavaScript获取表单内所有元素值的方法
2015/04/02 Javascript
JS根据生日算年龄的方法
2015/05/05 Javascript
JavaScript 数组some()和filter()的用法及区别
2016/05/20 Javascript
JS触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器
2016/10/30 Javascript
3种不同的ContextMenu右键菜单实现代码
2016/11/03 Javascript
AngularJS select设置默认值的实现方法
2017/08/25 Javascript
使用SVG基本操作API的实例讲解
2017/09/14 Javascript
Node 自动化部署的方法
2017/10/17 Javascript
微信小程序调用微信支付接口的实现方法
2019/04/29 Javascript
JavaScript交换变量常用4种方法解析
2020/09/02 Javascript
[03:23]我的刀塔你不可能这么可爱 第一期金萌萌的故事
2014/06/20 DOTA
python对指定目录下文件进行批量重命名的方法
2015/04/18 Python
windows及linux环境下永久修改pip镜像源的方法
2016/11/28 Python
python内置函数:lambda、map、filter简单介绍
2017/11/16 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
2017/11/16 Python
Python实现的端口扫描功能示例
2018/04/08 Python
python调用自定义函数的实例操作
2019/06/26 Python
来自世界各地的优质葡萄酒:VineShop24
2018/07/09 全球购物
经典c++面试题二
2015/08/14 面试题
中学运动会广播稿
2014/01/19 职场文书
纪检监察建议书
2014/05/19 职场文书
先进个人自荐书
2015/03/06 职场文书
2015年公路路政个人工作总结
2015/07/24 职场文书
Django给表单添加honeypot验证增加安全性
2021/05/06 Python
vue如何批量引入组件、注册和使用详解
2021/05/12 Vue.js
html form表单基础入门案例讲解
2021/07/15 HTML / CSS