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]代码优化 前面的话 拖拽可以让元素移动,也可以改变元素大小.本文将详细介绍拖拽改变元素大小的效果实现 原理简介 拖拽让元素移动,是改变定位 ...
随机推荐
- web优化 js性能高级篇
今天我们继续上一个阶段关于web的性能优化,如何对js高级进行优化 (1)闭包 何为闭包; 一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 我认 ...
- css实现一行文字居中,多行文字居左
第一种方法: <style> *{margin:0;padding:0;} .box{width:500px;height:300px;border:1px solid #000;text ...
- 【PostgreSQL】PostgreSQL添加新服务器连接时,报错“Server doesn't listen ”,已解决。
PostgreSQL添加新的服务器连接时,报错:
- 基于thinkphp的省略图便捷函数
/** * 生成缩略图 * @param string $image 原图路径 例:thumb_5242d9082fcdc.jpg * @param string $type 图像格式 * @para ...
- windows下装多个node版本的方法(gnvm)
安装一个支持windows切换node版本的工具 工作中我们可能需要用到一些工具,但这些工具依赖不同版本的node环境,那我们需要来为的切换node的环境吗, window msi安装的用户需要卸 ...
- tomcat:域名指向项目名
把项目部署到tomcat目录webapps后,使用域名访问的时候域名后面需要加上项目名称,如果想直接输入域名就可以访问项目呢?看了下tomcat官方文档,我修改了tomcat安装目录下conf/ser ...
- StartSSL免费SSL证书申请和账户注册完整过程
StartSSL算是比较早提供免费SSL证书的第三方提供商,我们可以免费申请且免费续期使用到有需要HTTPS网址的用户.关于网站使用SSL证书主要还是因为谷歌在向导说明中提到如果一个网站使用到SSL证 ...
- Android 圆形图片加白边加阴影
/** * 将图片准转为圆形 * * @param bitmap * @return */ public static Bitmap getRoundedCornerBitmap(String pat ...
- Repeater的分页
Repeater控件是个好东西.轻量级.又好用.完全的自定义.但是,正是因为这些优点它没有自动分页的功能.这个需要研究一下.我看了一下起点等小说网站,那些什么推荐排名榜用Repeater控件那是很 ...
- Windows安装和使用zookeeper
之前整理过一篇文章<zookeeper 分布式锁服务>,本文介绍的 Zookeeper 是以 3.4.5 这个稳定版本为基础,最新的版本可以通过官网 http://hadoop.apach ...