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 相关文章推荐
封装好的省市地区联动控件附下载
Aug 13 Javascript
javascript自定义的addClass()方法
May 28 Javascript
常用的jQuery前端技巧收集
Dec 24 Javascript
jQuery插件slick实现响应式移动端幻灯片图片切换特效
Apr 12 Javascript
简单分析javascript面向对象与原型
May 21 Javascript
浅谈javascript中return语句
Jul 15 Javascript
原生javascript 学习之js变量全面了解
Jul 14 Javascript
不得不看之JavaScript构造函数及new运算符
Aug 21 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
Oct 20 Javascript
vue脚手架搭建项目的兼容性配置详解
Jul 17 Javascript
浅谈layer的Icon样式以及一些常用的layer窗口使用方法
Sep 11 Javascript
el-form 多层级表单的实现示例
Sep 10 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实现C#山寨ArrayList的方法
2015/07/16 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
浅谈Laravel核心解读之Console内核
2018/12/02 PHP
JS中==与===操作符的比较
2009/03/21 Javascript
JavaScript 浏览器验证代码(来自discuz)
2010/07/17 Javascript
分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码
2011/09/21 Javascript
THREE.JS入门教程(3)着色器-下
2013/01/24 Javascript
jQuery 中$(this).index与$.each的使用指南
2014/11/20 Javascript
HTML5实现留言和回复页面样式
2015/07/22 Javascript
js 将图片连接转换成base64格式的简单实例
2016/08/10 Javascript
禁用backspace网页回退功能的实现代码
2016/11/15 Javascript
jquery PrintArea 实现票据的套打功能(代码)
2017/03/17 Javascript
vue.js中mint-ui框架的使用方法
2017/05/12 Javascript
JS实现留言板功能
2017/06/17 Javascript
javascript中的replace函数(带注释demo)
2018/01/07 Javascript
vue-cli配置环境变量的方法
2018/07/09 Javascript
Vue中computed和watch有哪些区别
2020/12/19 Vue.js
Python中用于计算对数的log()方法
2015/05/15 Python
python 默认参数问题的陷阱
2016/02/29 Python
python getopt详解及简单实例
2016/12/30 Python
Python简单生成8位随机密码的方法
2017/05/24 Python
Python连接Mssql基础教程之Python库pymssql
2018/09/16 Python
解决python写入带有中文的字符到文件错误的问题
2019/01/31 Python
python3使用GUI统计代码量
2019/09/18 Python
Pycharm 安装 idea VIM插件的图文教程详解
2020/02/21 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
2020/02/28 Python
StubHub墨西哥:购买和出售您的门票
2016/09/17 全球购物
毕业生找工作的自我评价
2013/10/18 职场文书
直接有效的自我评价
2014/01/11 职场文书
分公司总经理岗位职责
2014/08/03 职场文书
2014党委书记四风问题对照检查材料思想汇报
2014/09/22 职场文书
大学生学年个人总结
2015/02/15 职场文书
初中英语教师个人工作总结2015
2015/07/21 职场文书
2015年工会工作总结范文
2015/07/23 职场文书
解决thinkphp6(tp6)在状态码500下不报错,或者显示错误“Malformed UTF-8 characters”的问题
2021/04/01 PHP
sql查询语句之平均分、最高最低分及排序语句
2022/05/30 MySQL