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 相关文章推荐
基于jquery实现的鼠标滑过按钮改变背景图片
Jul 15 Javascript
限制textbox或textarea输入字符长度的JS代码
Oct 16 Javascript
浅谈Javascript如何实现匀速运动
Dec 19 Javascript
JS实现简单的键盘打字的效果
Apr 24 Javascript
轻量级的原生js日历插件calendar.js使用指南
Apr 28 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
Mar 02 Javascript
JS仿百度自动下拉框模糊匹配提示
Jul 25 Javascript
谈谈target=_new和_blank的不同之处
Oct 25 Javascript
js中bool值的转换及“&amp;&amp;”、“||”、 “!!”详解
Dec 21 Javascript
echarts设置图例颜色和地图底色的方法实例
Aug 01 Javascript
详解Vue路由自动注入实践
Apr 17 Javascript
解决layui批量传值到后台操作时出现传值为空的问题
Sep 28 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
PHP面向对象学习笔记之二 生成对象的设计模式
2012/10/06 PHP
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
php-msf源码详解
2017/12/25 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
简单三步,搞掂内存泄漏
2007/03/10 Javascript
javascript 页面划词搜索JS
2009/09/28 Javascript
将string解析为json的几种方式小结
2010/11/11 Javascript
js 表单提交后按钮变灰的实例代码
2013/08/16 Javascript
今天是星期几的4种JS代码写法
2013/09/17 Javascript
使用BootStrap实现用户登录界面UI
2016/08/10 Javascript
AngularJS模块详解及示例代码
2016/08/17 Javascript
vue动态生成dom并且自动绑定事件
2017/04/19 Javascript
浅谈js获取ModelAndView值的问题
2018/03/28 Javascript
vue.js+element-ui动态配置菜单的实例
2018/09/07 Javascript
js中获取URL参数的共用方法getRequest()方法实例详解
2018/10/24 Javascript
基于Fixed定位的框选功能的实现代码
2019/05/13 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
2020/02/09 Javascript
在Python 中实现图片加框和加字的方法
2019/01/26 Python
Python通过for循环理解迭代器和生成器实例详解
2019/02/16 Python
django将数组传递给前台模板的方法
2019/08/06 Python
Python中调用其他程序的方式详解
2019/08/06 Python
浅谈Python 敏感词过滤的实现
2019/08/15 Python
Python os模块常用方法和属性总结
2020/02/20 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
2020/02/25 Python
浅谈pycharm导入pandas包遇到的问题及解决
2020/06/01 Python
Node.js 和 Python之间该选择哪个?
2020/08/05 Python
MoviePy简介及Python视频剪辑自动化
2020/12/18 Python
介绍一下Make? 为什么使用make
2016/07/31 面试题
水果超市创业计划书
2014/01/27 职场文书
元旦晚会主持词开场白
2015/05/28 职场文书
篮球比赛通讯稿
2015/07/18 职场文书
2016年校园重阳节广播稿
2015/12/18 职场文书
员工工作心得体会
2019/05/07 职场文书
聊一聊python常用的编程模块
2021/05/14 Python
redis哨兵常用命令和监控示例详解
2021/05/27 Redis
Java数据开发辅助工具Docker与普通程序使用方法
2021/09/15 Java/Android