原生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 相关文章推荐
使用typeof方法判断undefined类型
Sep 09 Javascript
JavaScript定义类和对象的方法
Nov 26 Javascript
jquery结合html实现中英文页面切换
Nov 29 Javascript
微信小程序 setData使用方法及常用错误解决办法
May 11 Javascript
JS实现登录页密码的显示和隐藏功能
Dec 06 Javascript
浅谈React高阶组件
Mar 28 Javascript
微信小程序保存多张图片的实现方法
Mar 05 Javascript
vue单页面在微信下只能分享落地页的解决方案
Apr 15 Javascript
微信小程序 搜索框组件代码实例
Sep 06 Javascript
使用webpack将ES6转化ES5的实现方法
Oct 13 Javascript
解决vue打包报错Unexpected token: punc的问题
Oct 24 Javascript
JavaScript模拟实现网易云轮播效果
Apr 04 Javascript
解决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 404错误页面实现代码
2009/06/22 PHP
PHP中防止直接访问或查看或下载config.php文件的方法
2012/07/07 PHP
PHP函数addslashes和mysql_real_escape_string的区别
2014/04/22 PHP
php微信开发之关注事件
2018/06/14 PHP
JQuery打造PHP的AJAX表单提交实例
2009/11/03 Javascript
javascript在myeclipse中报错的解决方法
2013/10/29 Javascript
jquery数组过滤筛选方法grep()简介
2014/06/06 Javascript
Node.js实现批量去除BOM文件头
2014/12/20 Javascript
jQuery中parentsUntil()方法用法实例
2015/01/07 Javascript
js中利用tagname和id获取元素的方法
2016/01/03 Javascript
浅析jQuery Ajax请求参数和返回数据的处理
2016/02/24 Javascript
javascript如何创建对象
2016/08/29 Javascript
Angular表单验证实例详解
2016/10/20 Javascript
Bootstrap实现导航栏的2种方式
2016/11/28 Javascript
详解js中Number()、parseInt()和parseFloat()的区别
2016/12/20 Javascript
js选项卡的制作方法
2017/01/23 Javascript
JS简单判断函数是否存在的方法
2017/02/13 Javascript
Vue2.0如何发布项目实战
2017/07/27 Javascript
解决 window.onload 被覆盖的问题方法
2020/01/14 Javascript
[16:43]Heroes19_剃刀(完美)
2014/10/31 DOTA
[01:33]完美世界DOTA2联赛PWL S3 集锦第二期
2020/12/21 DOTA
在python中以相同顺序shuffle两个list的方法
2018/12/13 Python
Python批量生成特定尺寸图片及图画任意文字的实例
2019/01/30 Python
PyQt QCombobox设置行高的方法
2019/06/20 Python
在django中form的label和verbose name的区别说明
2020/05/20 Python
超级实用的8个Python列表技巧
2020/08/24 Python
虚拟环境及venv和virtualenv的区别说明
2021/02/05 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
最新的互联网创业计划书
2014/01/10 职场文书
节能减排倡议书
2014/04/15 职场文书
临时租车协议范本
2014/09/23 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
遗失说明具结保证书
2015/02/26 职场文书
南京南京观后感
2015/06/02 职场文书
关于企业的执行力标语大全
2020/01/06 职场文书
Java设计模式中的命令模式
2022/04/28 Java/Android