原生JavaScript写出Tabs标签页的实例代码


Posted in Javascript onJuly 20, 2020

最近在重新学习JavaScript,手写了一个tabs标签页。

话不多说,直接开始。

首先,是前端页面。

原生JavaScript写出Tabs标签页的实例代码

图1 tabs

先来把tabs分解一下:

原生JavaScript写出Tabs标签页的实例代码

图2 tabs分解

首先,一个大的框div,上面红色的框是导航栏nav,导航栏里是一个无序列表ul,里面三个li标签(黄色的框),li标签里两个绿色标签是两个span,一个用来放导航的名字,一个用来放导航关闭的icon,右边是一个button,用来添加新的导航栏及内容;下方是导航栏的内容section。

导航tabs.html代码如下:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <main>
    <div class="tabsbox" id="tab">
      <!-- tab标签 -->
      <nav class="firstnav">
        <ul>
          <li class="liactive"><span>测试1</span><span class="icon-guanbi">X</span></li>
          <li><span>测试2</span><span class="icon-guanbi">X</span></li>
          <li><span>测试3</span><span class=" icon-guanbi">X</span></li>
        </ul>
        <div class="tabadd">
          <span>+</span>
        </div>
      </nav>

      <!-- tab内容 -->
      <div class="tabscon">
        <section class="conactive">测试内容1</section>
        <section>测试内容2</section>
        <section>测试内容3</section>
      </div>
    </div>
  </main>

  <script src="js/tabs.js"></script>
</body>

</html>
<style>
 * {
  margin: 0;
  padding: 0;
}

ul li {
  list-style: none;
}

main {
  width: 960px;
  height: 500px;
  border-radius: 10px;
  margin: 50px auto;
}

main h4 {
  height: 100px;
  line-height: 100px;
  text-align: center;
}

.tabsbox {
  width: 900px;
  margin: 0 auto;
  height: 400px;
  border: 1px solid lightsalmon;
  position: relative;
}

nav ul {
  overflow: hidden;
}

nav ul li {
  float: left;
  width: 100px;
  height: 50px;
  line-height: 50px;
  text-align: center;
  border-right: 1px solid #ccc;
  position: relative;
}

nav ul li.liactive {
  border-bottom: 2px solid #fff;
  z-index: 9;
}

#tab input {
  width: 80%;
  height: 60%;
}

nav ul li span:last-child {
  position: absolute;
  user-select: none;
  font-size: 12px;
  top: -18px;
  right: 0;
  display: inline-block;
  height: 20px;
}

.tabadd {
  position: absolute;
  /* width: 100px; */
  top: 0;
  right: 0;
}

.tabadd span {
  display: block;
  width: 20px;
  height: 20px;
  line-height: 20px;
  text-align: center;
  border: 1px solid #ccc;
  float: right;
  margin: 10px;
  user-select: none;
}

.tabscon {
  width: 100%;
  height: 300px;
  position: absolute;
  padding: 30px;
  top: 50px;
  left: 0px;
  box-sizing: border-box;
  border-top: 1px solid #ccc;
}

.tabscon section,
.tabscon section.conactive {
  display: none;
  width: 100%;
  height: 100%;
}

.tabscon section.conactive {
  display: block;
}
</style>

由于给导航栏增删查改的js代码很多,我单独用一个js文件写tabs.js,在tabs.html里引用就行。

实现的导航栏功能有:

1)导航栏的切换功能

2)增加导航栏的功能

3)删除导航栏的功能

tabs.js代码如下:

var that;
class Tab {
  constructor(id){
    that = this;
    //获取元素
    this.main = document.querySelector(id);

    this.add = this.main.querySelector('.tabadd');
    //li的父元素
    this.ul = this.main.querySelector('.firstnav ul:first-child');
    //section的父元素
    this.fsection = this.main.querySelector('.tabscon');
    this.init();
  }
  //初始化操作
  init(){
    this.updateNode();
    this.add.onclick = this.addTab;
    for(let i = 0;i<this.lis.length;i++){
      this.lis[i].index = i;
      this.lis[i].onclick = this.toggleTab;
      this.remove[i].onclick = this.removeTab;
      this.spans[i].ondblclick = this.editTab;
      this.sections[i].ondblclick = this.editTab;
    }
  }
  //获取li跟section
  updateNode(){
    this.lis = this.main.querySelectorAll('li');
    this.sections = this.main.querySelectorAll('section');
    this.remove = this.main.querySelectorAll('.icon-guanbi');
    this.spans = this.main.querySelectorAll('.firstnav li span:first-child')
  }
  //1.切换功能
  toggleTab(){

    that.clearClass();
    this.className = 'liactive';
    that.sections[this.index].className = 'conactive';
  }
  clearClass(){
    for(let i = 0;i<this.lis.length;i++){
      this.lis[i].className = '';
      this.sections[i].className = '';
    }
  }
  //2.添加功能
  addTab(){
    that.clearClass();
    //1)添加li元素和section
    var random = Math.random()
    var li = '<li class="liactive"><span>新选项卡</span><span class="iconfont icon-guanbi">X</span></li>';
    var section = '<section class="conactive">'+random+'</section>';

    //2)把两个元素添加到对应的父级元素中
    that.ul.insertAdjacentHTML('beforeend',li);
    that.fsection.insertAdjacentHTML('beforeend',section);
    that.init();
  }
  //3.删除功能
  removeTab(e){
    e.stopPropagation();
    var index = this.parentNode.index;
    console.log(index);
    //删除对应节点
    that.lis[index].remove();
    that.sections[index].remove();
    //删除后及时更新页面中的节点
    that.init();
    //如果当前页面有选中状态,就不用执行下面的步骤
    if(document.querySelector('.liactive')) return;
    //让index前一个处于选中状态
    index--;
    that.lis[index] && that.lis[index].click();
  }
  //4.修改功能
  editTab(){
    let str = this.innerHTML;
    // console.log(str);
    //禁止双击选中文字
    window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
    this.innerHTML='<input type="text">'
    let input = this.children[0];
    input.value = str;
    input.select();
    //input失去焦点后变回span
    input.onblur = function(){
      this.parentNode.innerHTML= this.value;
    }
    //按回车也能
    input.onkeyup = function(e){
      if(e.keyCode == 13){
         this.blur();//获得焦点
      }

    }

  }
}
 new Tab('#tab');
// tab.init();

到此这篇关于原生JavaScript写出Tabs标签页的文章就介绍到这了,更多相关js tabs 标签页内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JSON 入门指南 想了解json的朋友可以看下
Aug 26 Javascript
深入理解关于javascript中apply()和call()方法的区别
Apr 12 Javascript
javascript之Array 数组对象详解
Jun 07 Javascript
20分钟打造属于你的Bootstrap站点
Jul 27 Javascript
BootStrap 弹出层代码
Feb 09 Javascript
JS实现最简单的冒泡排序算法
Feb 15 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
Aug 10 Javascript
Vue使用NProgress的操作过程解析
Oct 10 Javascript
详解vue中v-on事件监听指令的基本用法
Jul 22 Javascript
selenium 反爬虫之跳过淘宝滑块验证功能的实现代码
Aug 27 Javascript
浅谈JavaScript 声明提升
Sep 14 Javascript
vue+echarts实现多条折线图
Mar 21 Vue.js
解决echarts 一条柱状图显示两个值,类似进度条的问题
Jul 20 #Javascript
简单了解前端渐进式框架VUE
Jul 20 #Javascript
基于VSCode调试网页JavaScript代码过程详解
Jul 20 #Javascript
一文读懂vue动态属性数据绑定(v-bind指令)
Jul 20 #Javascript
在Vue 中实现循环渲染多个相同echarts图表
Jul 20 #Javascript
解决echarts数据二次渲染不成功的问题
Jul 20 #Javascript
详细分析vue表单数据的绑定
Jul 20 #Javascript
You might like
php中chdir()函数用法实例
2014/11/13 PHP
自制PHP框架之设计模式
2017/05/07 PHP
对象的类型:本地对象(1)
2006/12/29 Javascript
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
基于jquery的让textarea自适应高度的插件
2010/08/03 Javascript
如何确保JavaScript的执行顺序 之实战篇
2011/03/03 Javascript
js实现点小图看大图效果的思路及示例代码
2013/10/28 Javascript
浅谈JavaScript中的作用域和闭包问题
2015/07/07 Javascript
javascript检查浏览器是否已经启用XX功能
2015/07/10 Javascript
js实现无限级树形导航列表效果代码
2015/09/23 Javascript
Javascript基础之数组的使用
2016/05/13 Javascript
浅谈Angular4中常用管道
2017/09/27 Javascript
详解vue-cli项目中用json-sever搭建mock服务器
2017/11/02 Javascript
vue+axios+mock.js环境搭建的方法步骤
2018/08/28 Javascript
通过Nodejs搭建网站简单实现注册登录流程
2019/06/14 NodeJs
Vue使用JSEncrypt实现rsa加密及挂载方法
2020/02/07 Javascript
在Vue 中获取下拉框的文本及选项值操作
2020/08/13 Javascript
用vue写一个日历
2020/11/02 Javascript
Python模块学习 re 正则表达式
2011/05/19 Python
python3读取csv和xlsx文件的实例
2018/06/22 Python
python 找出list中最大或者最小几个数的索引方法
2018/10/30 Python
python的sorted用法详解
2019/06/25 Python
python获取array中指定元素的示例
2019/11/26 Python
python基于property()函数定义属性
2020/01/22 Python
python获取系统内存占用信息的实例方法
2020/07/17 Python
音乐专业自荐信
2014/02/07 职场文书
幼儿园招生广告
2014/03/19 职场文书
工作保证书范文
2014/04/29 职场文书
庆六一文艺汇演活动方案
2014/08/26 职场文书
党的群众路线教育实践活动对照检查材料思想汇报(党员篇)
2014/09/25 职场文书
辩护词格式
2015/05/22 职场文书
初中家长意见
2015/06/03 职场文书
golang 在windows中设置环境变量的操作
2021/04/29 Golang
Oracle 区块链表创建过程详解
2021/05/15 Oracle
mysql定时自动备份数据库的方法步骤
2021/07/07 MySQL