javascript面向对象系列第四篇——选项卡的实现
前面的话
面向对象的应用并非只是读几本书那么容易,需要有大量的工程实践做基础才能真正理解并学会使用它。本文将用面向对象的技术来制作一个简单的选项卡
图示说明
由图示结果看到,这是一个非常简单的选项卡。三个控制按钮利用点击事件分别控制三张不同的选项卡。选项卡用文字和背景颜色区分,控制按钮用轮廓outline区分
HTML代码
【1】使用行间样式来引入CSS的扩展性不高,需要根据实际情况谨慎使用
【2】在a标签中使用javascript:;来阻止默认的页面跳转行为
【3】给最外层div元素设置id属性便于外层元素获取,为选项卡和控制按钮使用不同的标签ul和nav,便于内层元素获取
- <div class="box" id="box">
- <ul class="list">
- <li class="in_active" style="background-color: lightgreen">第一张选项卡</li>
- <li class="in" style="background-color: lightblue">第二张选项卡</li>
- <li class="in" style="background-color: pink">第三张选项卡</li>
- </ul>
- <nav class="conList">
- <a class="con_active" href="javascript:;">第一个控制按钮</a>
- <a class="con" href="javascript:;">第二个控制按钮</a>
- <a class="con" href="javascript:;">第三个控制按钮</a>
- </nav>
- </div>
CSS代码
【2】为当前选项卡设置in_active类名,设置display:block
【3】为当前控制按钮设置con_active类名,设置outline: 1px solid black
- body{margin: 0;}
- ul{
- margin:0;
- padding: 0;
- list-style: none;
- }
- a{
- color: inherit;
- text-decoration: none;
- }
- .box{
- width: 500px;
- text-align: center;
- }
- /*in为选项卡普通状态,默认不显示*/
- .in,.in_active{
- display: none;
- height: 100px;
- font-size: 50px;
- line-height: 100px;
- }
- /*in_active为选项卡选中状态,选中后显示*/
- .in_active{
- display: block;
- }
- .conList{
- text-align: center;
- line-height: 30px;
- }
- /*con为按钮普通状态,默认无轮廓*/
- .con,.con_active{
- outline:0;
- }
- /*con_active为按钮选中状态,选中后有1px的黑色轮廓*/
- .con_active{
- outline: 1px solid black;
- }
javascript代码
使用最常用的组合模式来创建对象,构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性,并且向构造函数传递选项卡对象参数
【1】关于元素获取、变量设置和事件绑定都在构造函数中实现,作为实例属性
【2】定义一个切换方法switch,进行选项卡和控制按钮的同时切换,作为原型方法
【3】把获取到的选项卡对象oBox作为参数传递到构造函数中
- //构造函数
- function Tab(obj){
- /*元素获取*/
- //获取选项卡展示部分
- this.oList = obj.getElementsByTagName('ul')[0];
- this.aIn = this.oList.getElementsByTagName('li');
- //获取选项卡控制部分
- this.oConList = obj.getElementsByTagName('nav')[0];
- this.aCon = this.oConList.getElementsByTagName('a');
- /*变量设置*/
- //选项卡张数
- this.count = this.aIn.length;
- //当前第几张
- this.cur = 0;
- var _this = this;
- for(var i = 0; i < this.count; i++){
- //设置索引
- this.aCon[i].index = i;
- //给按钮添加事件
- this.aCon[i].onclick = function(){
- _this.cur = this.index;
- _this.switch();
- }
- }
- }
- //原型方法
- Tab.prototype.switch = function(){
- //去掉所有
- for(var i = 0; i < this.count; i++){
- this.aIn[i].className = 'in';
- this.aCon[i].className = 'con';
- }
- //显示当前
- this.aIn[this.cur].className = 'in_active';
- this.aCon[this.cur].className = 'con_active';
- }
- //获取选项卡元素
- var oBox = document.getElementById('box');
- //构造选项卡对象
- var tab1 = new Tab(oBox);
最后
这是面向对象系列的最后一篇了,本系列的博文主要参照《javascript高级程序设计》和《javascript面向对象精要》。个人感觉《javascript权威指南》中的面向对象部分写得过于生涩和追求完整,很多例子都过于庞大,实在是难以消化,故借鉴较少。也由于我才疏学浅,看不懂其中奥妙,可能再经过一段时间学习才能品出其中味道
最难的部分终于啃完
javascript面向对象系列第四篇——选项卡的实现的更多相关文章
- javascript面向对象系列第四篇——OOP中的常见概念
前面的话 面向对象描述了一种代码的组织结构形式——一种在软件中对真实世界中问题领域的建模方法.本文将从理论层面,介绍javascript面向对象程序程序(OOP)中一些常见的概念 对象 所谓对象,本质 ...
- javascript面向对象系列第三篇——实现继承的3种形式
× 目录 [1]原型继承 [2]伪类继承 [3]组合继承 前面的话 学习如何创建对象是理解面向对象编程的第一步,第二步是理解继承.本文是javascript面向对象系列第三篇——实现继承的3种形式 [ ...
- 深入理解javascript作用域系列第四篇——块作用域
× 目录 [1]let [2]const [3]try 前面的话 尽管函数作用域是最常见的作用域单元,也是现行大多数javascript最普遍的设计方法,但其他类型的作用域单元也是存在的,并且通过使用 ...
- 深入理解javascript作用域系列第四篇
前面的话 尽管函数作用域是最常见的作用域单元,也是现行大多数javascript最普遍的设计方法,但其他类型的作用域单元也是存在的,并且通过使用其他类型的作用域单元甚至可以实现维护起来更加优秀.简洁的 ...
- 前端学PHP之面向对象系列第四篇——关键字
× 目录 [1]public [2]protected [3]private[4]final[5]static[6]const[7]this[8]self[9]parent 前面的话 php实现面向对 ...
- javascript运动系列第四篇——抖动
× 目录 [1]原理介绍 [2]代码实现 [3]实例应用 前面的话 在运动系列中,前面分别介绍了匀速运动.变速运动和曲线运动.下面介绍一种特殊的运动形式——抖动 原理介绍 抖动其实是往复运动的一种特殊 ...
- 深入理解javascript函数系列第四篇——ES6函数扩展
× 目录 [1]参数默认值 [2]rest参数 [3]扩展运算符[4]箭头函数 前面的话 ES6标准关于函数扩展部分,主要涉及以下四个方面:参数默认值.rest参数.扩展运算符和箭头函数 参数默认值 ...
- javascript面向对象系列第五篇——拖拽的实现
前面的话 在之前的博客中,拖拽的实现使用了面向过程的写法.本文将以面向对象的写法来实现拖拽 写法 <style> .test{height: 50px;width: 50px;backgr ...
- javascript动画系列第四篇——拖拽改变元素大小
× 目录 [1]原理简介 [2]范围圈定 [3]大小改变[4]代码优化 前面的话 拖拽可以让元素移动,也可以改变元素大小.本文将详细介绍拖拽改变元素大小的效果实现 原理简介 拖拽让元素移动,是改变定位 ...
随机推荐
- 阅读jquery源码与js依赖加载的模块化!
阅读源码肯定是先下载有注释的源码 我也是醉了,10309 行代码,在陆续续的一个月之内,看完了,虽有收获但收获不大, 直到又一次看jquery的github,怎么会有cmd????没听过使用jquer ...
- 斯考特·杨(Scott Young)快速学习方法
上午在网上看到了斯考特·杨(Scott Young)的快速学习方法,感觉很受鼓舞. 现在已经读研究生了,可是发现自己自从上大学以来到现在,发现自己的学习方法有很大的问题. 我是个特别喜欢读书的人,在大 ...
- 【BFS】POJ 3414
直达 -> POJ 3414 Pots 相似题联动–>HDU 1495 非常可乐 题意:两个壶倒水,三种操作,两个桶其中一个满足等于C的最少操作,输出路径.注意a,b互倒的时候能不能倒满, ...
- 使用复合设计模式扩展持久化的CURD,Select能力
大家可能会经常遇到接口需要经常增加新的方法和实现,可是我们原则上是不建议平凡的增加修改删除接口方法,熟不知这样使用接口是不是正确的接口用法,比如我见到很多的项目分层都是IDAL,DAL,IBLL,BL ...
- php 迭代器使用
/** * 执行入口 * @author tianyunchong * Time: 4:48 pm * @return null */ public function run() { /** 遍历下所 ...
- javascript的变量声明提升
这篇随笔是对网上文章的整理吸收 1. javascript的作用域是函数,不是块 2. 在函数内部,javascript解释器会把var变量提升到当前域的最前面,但是函数体不会提升. 看下面例子: v ...
- Search a 2D Matrix
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- Spring MVC注解的一些案列
1. spring MVC-annotation(注解)的配置文件ApplicationContext.xml <?xml version="1.0" encoding=& ...
- C++基础_总结
(1)多态性都有哪些?(静态和动态,然后分别叙述了一下虚函数和函数重载) 多态分为两种:静态和动态.静态主要包括函数重载和模板:动态主要是依靠虚函数实现的. 静态联编:重载函数不加virtual关键字 ...
- Android 圆形图片加白边加阴影
/** * 将图片准转为圆形 * * @param bitmap * @return */ public static Bitmap getRoundedCornerBitmap(String pat ...