如何用原生 javascript 写一个选项卡?
来源:互联网 发布:淘宝补单 编辑:程序博客网 时间:2024/05/16 09:00
买的基本原生 javascript的书还在路上。所以对js还是懵懂无知。
当时学习jquery的时候,是以写一个 选项卡 为开始的。当然,用jq写是非常简单的。
选项卡原理我是非常清楚。那么按照这个原理来写吧。首先,构建html框架
html框架1
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>JavaScript Tab Test</title><style> * {padding: 0;margin: 0;list-style: none;font-style: normal;} body {font-family: tahoma;} #tab {border-left: 1px solid #ddd;border-bottom: 1px solid #ddd;float: left;margin:100px;} #tab_ul {width: 500px;} #tab_ul li {width: 99px;border: 1px solid #ddd;background: #fff;border-left:none;float: left;height: 40px;line-height: 40px;text-align: center;cursor: pointer;background: #f9f9f9;} #tab_ul li.on {border-bottom: 1px solid #fff;background: #fff;} #tab_div {border-right: 1px solid #ddd;clear: both;} #tab_div div {height: 200px;line-height: 200px;text-align: center;font-size: 80px;} .block {display: block;} .none {display: none;}</style></head><body><div id="tab"> <ul id="tab_ul"> <li class="on">Title 1</li> <li>Title 2</li> <li>Title 3</li> <li>Title 4</li> <li>Title 5</li> </ul> <div id="tab_div"> <div class="block">content 1</div> <div class="none">content 2</div> <div class="none">content 3</div> <div class="none">content 4</div> <div class="none">content 5</div> </div></div></body></html>
为了方便检查,html css 之类的全部在一起了。
然后写下了第一个版本。
javascript Beta 1
// 获取 tab li 和 con div 两个数组 并 赋予变量var _tabLi = document.getElementById("tab_ul").getElementsByTagName("li");var _conDiv = document.getElementById("tab_div").getElementsByTagName("div");// 循环,对 _tabLi 进行处理for (var i = 0; i < _tabLi.length; i++) { // 点击某个 li 进行处理 _tabLi[i].onclick = function(){ // 给自己加上class this.className = "on"; // 给兄弟元素删除class var _sib = siblings(this); for (var j = 0; j < _sib.length; j++) { // 删除样式 _sib[j].removeAttribute("class"); }; // 获取当前的索引 var _index = index(this,_tabLi); // 对内容元素进行处理 for (var j = 0; j < _conDiv.length; j++) { if (j==_index) { // 这里和下面分别用了两种设置样式名的方式 _conDiv[j].className = "block" } else{ _conDiv[j].setAttribute("class", "none") }; }; }};// 获取元素索引函数function index(current, obj){ for (var i = 0; i < obj.length; i++) { if (obj[i] == current) { return i; } } } // 查询兄弟元素函数function siblings(elm) { var a = []; var p = elm.parentNode.children; for(var i =0,pl= p.length;i<pl;i++) { if(p[i] !== elm) a.push(p[i]); } return a;}
注释得比较清楚了。但是感觉还是太繁琐了。我不是一次性写出来的,而是查了半天资料,百度了千百回才写出来的。下面是我优化过的。
优化思路就是删调 查询兄弟元素的函数
javascript beta 2
// 获取 tab li 和 con div 两个数组 并 赋予变量var _tabLi = document.getElementById("tab_ul").getElementsByTagName("li");var _conDiv = document.getElementById("tab_div").getElementsByTagName("div");// 循环,对 _tabLi 进行处理for (var i = 0; i < _tabLi.length; i++) { _tabLi[i].onclick = function(){ // 获取当前的索引 var _index = index(this,_tabLi); // 对控制菜单进行处理 for (var j = 0; j < _tabLi.length; j++) { if (j==_index) { _tabLi[j].className = "on" } else{ _tabLi[j].removeAttribute("class"); }; }; // 对内容元素进行处理 for (var j = 0; j < _conDiv.length; j++) { if (j==_index) { _conDiv[j].className = "block"; } else{ _conDiv[j].className = "block"; }; }; }};// 获取元素索引函数function index(current, obj){ for (var i = 0; i < obj.length; i++) { if (obj[i] == current) { return i; } } }
优化过第二个版本之后,发现自己真的是不细心啊,居然重复循环,可以整合到一起的啊~!
javascript beta 3
// 获取 tab li 和 con div 两个数组 并 赋予变量var _tabLi = document.getElementById("tab_ul").getElementsByTagName("li");var _conDiv = document.getElementById("tab_div").getElementsByTagName("div");for (var i = 0; i < _tabLi.length; i++) { _tabLi[i].onclick = function(){ // 获取当前的索引 var _index = index(this,_tabLi); // 分别进行处理 for (var j = 0; j < _tabLi.length; j++) { if (j==_index) { _tabLi[j].className = "on"; _conDiv[j].className = "block"; } else{ _tabLi[j].removeAttribute("class"); _conDiv[j].className = "block"; }; }; }};// 获取元素索引函数function index(current, obj){ for (var i = 0; i < obj.length; i++) { if (obj[i] == current) { return i; } } }
html 框架2
上面虽然实现了效果,但是html还是复杂了一些。因为没必要有一些初始的样式。我希望html能够更加简洁。
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>JavaScript Tab Test</title><style>* {padding: 0;margin: 0;list-style: none;font-style: normal;}body {font-family: tahoma;}#tab {border-left: 1px solid #ddd;border-bottom: 1px solid #ddd;float: left;margin:100px;}#tab_ul {width: 500px;} #tab_ul li {width: 99px;border: 1px solid #ddd;background: #fff;border-left:none;float: left; height: 40px;line-height: 40px;text-align: center;cursor: pointer;background: #f9f9f9;} #tab_ul li.on {border-bottom: 1px solid #fff;background: #fff;}#tab_div {border-right: 1px solid #ddd;clear: both;} #tab_div div {height: 200px;line-height: 200px;text-align: center;font-size: 80px;display: none;}</style></head><body><div id="tab"> <ul id="tab_ul"> <li>Title 1</li> <li>Title 2</li> <li>Title 3</li> <li>Title 4</li> <li>Title 5</li> </ul> <div id="tab_div"> <div>content 1</div> <div>content 2</div> <div>content 3</div> <div>content 4</div> <div>content 5</div> </div></div></body></html>
注意,这里我默认给#tab_div 下的div 设置为隐藏属性了。
javascript beta 4
// 获取 tab li 和 con div 两个数组 并 赋予变量var _tabLi = document.getElementById("tab_ul").getElementsByTagName("li");var _conDiv = document.getElementById("tab_div").getElementsByTagName("div");for (var i = 0; i < _tabLi.length; i++) { // 对元素进行初始化 _tabLi[0].className = "on"; _conDiv[0].style.display = "block"; // 点击切换处理 _tabLi[i].onclick = function(){ // 获取当前的索引 var _index = index(this,_tabLi); // 分别进行处理 for (var j = 0; j < _tabLi.length; j++) { if (j==_index) { _tabLi[j].className = "on"; _conDiv[j].style.display = "block"; } else{ _tabLi[j].removeAttribute("class"); _conDiv[j].style.display = "none"; }; }; }};// 获取元素索引函数function index(current, obj){ for (var i = 0; i < obj.length; i++) { if (obj[i] == current) { return i; } } }
0 0
- 如何用原生 javascript 写一个选项卡?
- 如何用js写一个简易选项卡
- 如何用js写选项卡
- 如何用javascript写一个贪吃蛇
- 如何用Java写一个原生wav播放器
- 原生js写一个选项卡
- javascript如何用递归写一个简单的树形结构
- javascript如何用递归写一个简单的树形结构
- 原生JS写选项卡
- 如何用 Vim 写 JavaScript 和 HTML
- 如何用Python写一个贪吃蛇
- 如何用Swing写一个时钟?
- 如何用C++写一个类
- 如何用CSS写一个三角形
- 如何用 Latex 写一个漂亮简历
- 如何用Scapy写一个端口扫描器?
- 如何用Java写一个交换函数
- 如何用Cocos2d-android写一个小游戏
- 注册windows服务
- hdu2897邂逅明下
- Scrapy Settings级别 & 如何获取settings & 一些可能用到的setting
- RSA加密与解密的算法
- RoundImageView用ImageLoader加载时出现ANR问题解决。
- 如何用原生 javascript 写一个选项卡?
- 百度面试题 字符串的全排列输出
- sqlserver单个用户 解决方法
- linux下清空某文件命令,vi删除多行命令
- 命令行SVN全部操作
- Redis学习1之redis单节点的安装和使用
- boot.img提取
- python实现在 Mac 10.9 远程桌面截屏抓取
- iOS开发注销操作后更改rootViewController的问题