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]代码优化 前面的话 拖拽可以让元素移动,也可以改变元素大小.本文将详细介绍拖拽改变元素大小的效果实现 原理简介 拖拽让元素移动,是改变定位 ...
随机推荐
- 【BFS】POJ 3414
直达 -> POJ 3414 Pots 相似题联动–>HDU 1495 非常可乐 题意:两个壶倒水,三种操作,两个桶其中一个满足等于C的最少操作,输出路径.注意a,b互倒的时候能不能倒满, ...
- Android -- PopupWindow(其中嵌套ListView 可以被点击)
1. 效果图
- js基础3
内置对象 内置对象就是JS提供的一套工具箱,我们通过内置可以很方便的进行一些操作. Math对象: Math.ceil() //向上取整,天花板 Math.floor() //向下取整,地板 Math ...
- duplicate symbols for architecture arm64 after xCode 8.0 update
Xcode IDE 从7.3.1 update 到 8.0 之后出现的问题 一个错误把我困扰了两天之久,最终找到解决办法我欣喜若狂. 错误发生原因:Xcode IDE 从7.3.1 update ...
- 格式化input输入内容(金额)
项目中要用到格式化金额输入框,要求每三个数字用逗号分割开. 添加一个directive angular.module('myApp.directives', []) .directive('filte ...
- DIV+CSS自适应布局
自适应布局分两类:高度和宽度,方法有很多,我用三列布局举例,我就列几个通俗易懂的例子呗,懂了三列的,两列的原理一样,呵呵哒. 效果图如下:高度自适应——宽度自适应 1,高度自适应 ...
- ubuntu14.04 安装 hadoop2.4.0
转载:ubuntu搭建hadoop-Ver2.6.0完全分布式环境笔记 自己在搭建hadoop平台时,碰到一些困难,按照该博文解决了问题,转载一下,作为记录. 2 先决条件 确保在你集群中的每个节点上 ...
- 初学者-PHP笔记
PHP介绍 PHP 是 "PHP Hypertext Preprocessor" 的首字母缩略词 PHP 是一种被广泛使用的开源脚本语言 PHP 脚本在服务器上执行 PHP 没有成 ...
- Mac git提交步骤小记
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 19.0px; font: 13.0px "PingFang SC"; c ...
- eclipse版本发展历史
Eclipse百科 https://zh.wikipedia.org/wiki/Eclipse # 中文维基百科 http://baike.baidu.com/subview/23576 ...