目录

写在前面

在完成了侧边栏后,后台的基础架子已经基本出来了;下面是来加入Tab页面,正在纠结于Tab页面是否用现成的轮子,

比如

LayUI

想一想还是撸起袖子直接干一个

Tabs

实现原理

Title 列表

头部标题部分,用于显示Tab页的标题和打开状态

Content 内容

用于放置Tab的内容,显示当前选中的内容

上代码

1. 布局

<!--tabs-->
<div class="ls-tab-container">
<!--头部-->
<div class="ls-tab-titles flex">
<div class="tab-title" data-id="1">
<span class="title">Tab1</span>
</div>
<div class="tab-title" data-id="2">
<span class="title">Tab2</span>
</div>
<div class="tab-title" data-id="3">
<span class="title">Tab3</span>
</div>
</div>
<!--内容-->
<div class="ls-tab-contents">
<div class="tab-content" data-for="1">
Tab1 Content
</div>
<div class="tab-content" data-for="2">
Tab2 Content
</div>
<div class="tab-content" data-for="3">
Tab3 Content
</div>
</div>
</div>
.ls-tab-container {
position: absolute;
top: 0px;
left: 5px;
right: 0px;
bottom: 5px;
} .ls-tab-container .ls-tab-titles {
height: 36px;
background: rgba(255, 255, 255, .8);
box-shadow: 0 0 6px rgba(196, 199, 202, .35);
} .ls-tab-container .ls-tab-contents {
position: absolute;
top: 40px;
left: 5px;
right: 5px;
bottom: 5px;
} .ls-tab-container .ls-tab-titles .tab-title {
height: 36px;
line-height: 36px;
text-align: center;
padding: 0 15px;
min-width: 30px;
max-width: 200px;
overflow: hidden;
} .ls-tab-container .ls-tab-titles .tab-title:hover {
background: rgba(238, 238, 238, .4);
cursor: pointer;
}

看效果

2. 选中状态

选中的头部和内的状态

···
<div class="tab-title active" data-id="1">
<span class="title">Tab1</span>
<i class="ls-icon ls-icon-close op-close"></i>
</div>
···
···
<div class="tab-content active" data-for="1">
Tab1 Content
</div>
···
.ls-tab-container .ls-tab-titles .tab-title.active {
background: rgba(238, 238, 238, .6);
background: rgba(238, 238, 238, .7);
border-bottom: none;
color: #1d7ce3;
} .ls-tab-container .ls-tab-contents .tab-content {
display: none;
} .ls-tab-container .ls-tab-contents .tab-content.active {
display: block!important;
}

看效果

3. 增加关闭按钮

···
<div class="tab-title active" data-id="1">
<span class="title">Tab1</span>
<i class="ls-icon ls-icon-close op-close"></i>
</div>
···
.ls-tab-container .ls-tab-titles .tab-title .ls-icon-close {
color: #999;
font-size: 12px;
padding: 1px;
border-radius: 2px;
margin-left: 5px;
} .ls-tab-container .ls-tab-titles .tab-title .ls-icon-close:hover {
background: #f39422;
color: #fff;
}

看效果

js 操作

···
/**
* Tab页初始化
* @param {选择器} selector
*/
tab: function(selector) {
var $tab = $(selector);
var $title_container = $tab.find(".ls-tab-titles");
var $tab_contents = $tab.find(".ls-tab-contents");
var $title = $tab.find(".ls-tab-titles .tab-title");
// 激活Tab
var activeTab = function($tabTitle) {
var tabId = $tabTitle.data("id");
if ($tabTitle.hasClass("active")) {
return;
}
$tab.find(".ls-tab-titles .tab-title.active").removeClass("active");
$tab.find(".ls-tab-contents .tab-content.active").removeClass("active");
$tabTitle.addClass("active");
$tab_contents.find(".tab-content[data-for='" + tabId + "']").addClass('active');
};
// 移除Tab
var removeTab = function($tabTitle) {
var tabId = $tabTitle.data("id");
if ($tabTitle.hasClass("active")) {
debugger
// 切换到临近的Tab
if ($tabTitle.next().length) {
activeTab($tabTitle.next());
} else if ($tabTitle.prev().length) {
activeTab($tabTitle.prev());
}
}
$tabTitle.remove();
$tab_contents.find(".tab-content[data-for='" + tabId + "']").remove();
};
//事件绑定 + //点击切换
$title.click(function() {
activeTab($(this));
});
//点击关闭
$title.find(".op-close").click(function() {
removeTab($(this).parent());
});
//tab 对象
var tab = {
/**
* 激活
* @param {tabId} selector
*/
active: function(id) {
activeTab($title_container.find(".tab-title[data-id='" + id + "']"));
},
/**
* 添加
* @param {tabObj} selector
*/
add: function(tabObj) {
// tabObj
var defaults = {
id: 0,
title: "tab",
content: "",
closable: true
};
tabObj = tabObj || {};
tabObj = $.extend(defaults, tabObj);
// 无内容,创建内容区域
if (!$tab_contents.length) {
$tab_contents = $("<div class='ls-tab-contents'></div>");
$tab.append($tab_contents);
}
$tab_contents.append("<div class='tab-content' data-for='" + tabObj.id + "'>" + tabObj.content + "</div>");
var $newTabTitle =
$("<div class='tab-title' data-id='" + tabObj.id + "'><span class='title'>" + tabObj.title + "</span></span></div>")
.click(function() {
activeTab($(this));
});
if (tabObj.closable) {
$newTabTitle.append(
$("<i class='ls-icon ls-icon-close op-close'></i>")
.click(function() {
removeTab($(this).parent());
}));
};
$title_container.append($newTabTitle);
activeTab($newTabTitle); },
/**
* 移除
* @param {tabId} selector
*/
remove: function(id) {
removeTab($title_container.find(".tab-title[data-id='" + id + "']"));
} };
return tab;
}
···

菜单增加点击事件

···
<li>
<a pid="2" class="node node-leaf" data-href="icon.html">
<i class="fa fa-list fa-fw" aria-hidden="true"></i>
<span>菜单管理</span>
</a>
</li>
···
(function($) {
$.extend(page, {
/**
* 初始化
*/
init: function() {
// 初始化 tab 栏
this.mainTab = this.tab('.ls-tab-container');
$(".node.node-leaf").click(function() {
var $this = $(this);
page.mainTab.add({
id: $this.attr("pid"),
title: $this.find("span").text(),
content: "<iframe scrolling='no' frameborder='0' style='height:100%;width:100%;position:absolute;' src='" + $this.data("href") + "'></iframe>"
})
});
}
});
page.init();
})(jQuery);

效果预览

欢迎批评指正

源码地址

https://github.com/LaosanShang/ls-admin-frontend

东拼西凑完成一个“前端框架”(4) - Tabs页的更多相关文章

  1. 东拼西凑完成一个“前端框架”(5) - Tabs操作

    目录 东拼西凑完成一个后台 "前端框架" (1) - 布局 东拼西凑完成一个后台 "前端框架" (2) - 字体图标 东拼西凑完成一个"前端框架&qu ...

  2. 最接近原生APP体验的高性能前端框架——MUI

      前  言 MUI有三大特点: 轻量 追求性能体验,是我们开始启动MUI项目的首要目标,轻量必然是重要特征: MUI不依赖任何第三方JS库,压缩后的JS和CSS文件仅有100+K和60+K 原生UI ...

  3. vue 前端框架

    什么是vue.js 1.vue是目前最火的一个前端框架,react 是最流行的前端框架(react除了开发网站,还可以开发手机APP,vue语法也是可以进行手机app开发的,需要借助于weex) 2. ...

  4. 推荐web前端框架bootstrap

    bootstrap是基于Jquery而开发的一个前端框架. 全中文的学习网站:http://www.runoob.com/bootstrap/bootstrap-tutorial.html 实际上就是 ...

  5. Vue.js教程 1.前端框架学习介绍

    Vue.js教程 1.前端框架学习介绍 什么是Vue.js 为什么要学习流行框架 什么是Vue.js Vue.js 是目前最火的一个前端框架,React是最流行的一个前端框架(React除了开发网站, ...

  6. 前端框架easyui layout, Tabs,tree

    一.三大前端框架的 1.easyui=jquery+html4(用来做后台的管理界面) 不要钱,开发速度快,不好看,不支持响应式 2.bootstrap=jquery+html5 好看,开发速度快,部 ...

  7. DHTMLX 前端框架 建立你的一个应用程序 教程(十一)--添加/删除表格中的记录

    添加/删除表格中的记录 我们的最终功能是在表格中添加删除 我们通过单机工具栏上的按钮来实现添加删除 当我们单击添加按钮的时候, 表单中 第一行默认填写New contact 光标自动聚焦 当用户点击删 ...

  8. Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架

    Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的. 历史 Bootstrap 是由 Twitter 的 ...

  9. Amaze UI 是一个移动优先的跨屏前端框架。 http://amazeui.org/

    http://amazeui.org/ Amaze UI 是一个移动优先的跨屏前端框架.... Amaze UI 以移动优先(Mobile first)为理念,从小屏逐步扩展到大屏,最终实现所有屏幕适 ...

随机推荐

  1. 推荐算法之用矩阵分解做协调过滤——LFM模型

    隐语义模型(Latent factor model,以下简称LFM),是推荐系统领域上广泛使用的算法.它将矩阵分解应用于推荐算法推到了新的高度,在推荐算法历史上留下了光辉灿烂的一笔.本文将对 LFM ...

  2. Vue_声明周期

    Vue生命周期 在vue2.0的时候,声明钩子发生了改变,具体有八个 <!-- HTML部分 --> <div id="app"> <div>{ ...

  3. Python拼接字符串的七种方式

    忘了在哪看到一位编程大牛调侃,他说程序员每天就做两件事,其中之一就是处理字符串.相信不少同学会有同感. 几乎任何一种编程语言,都把字符串列为最基础和不可或缺的数据类型.而拼接字符串是必备的一种技能.今 ...

  4. LVM扩容之xfs文件系统

    LVM的基础请见:https://www.cnblogs.com/wxxjianchi/p/9698089.html 一.放大LV的容量.放大容量是由内而外来操作的. 1.设置新的lvm分区:用fdi ...

  5. 2019牛客暑期多校训练营(第二场)J.Subarray

    题意:给你一个n 表示有n段连续的1序列 现在问你 在总长度为0~1e9-1的范围内有多少个大于0的子段 思路:假设我们统计了当前的前缀和 我们显然可以用树状数组维护一下前缀和 这样我们可以nlogn ...

  6. Identityserver4中ResourceOwnerPassword 模式获取refreshtoken

    一.IS4服务端配置 1.配置Client new Client { ClientId = "xamarin", ClientSecrets = { ".Sha256() ...

  7. 部署 kube-controller-manager 高可用集群

    目录 前言 创建kube-controller-manager证书和私钥 生成证书和私钥 将生成的证书和私钥分发到所有master节点 创建和分发kubeconfig文件 分发kubeconfig到所 ...

  8. No provider available for the service com.xxx.xxx 错误解决

    HTTP Status 500 - Servlet.init() for servlet springmvc threw exception type Exception report message ...

  9. 修改json源码支持datetime序列化

    修改json源码支持datetime序列化 import json import datetime now = datetime.datetime.today() json.dumps(now) 抛出 ...

  10. 机器学习实战书-第二章K-近邻算法笔记

    本章介绍第一个机器学习算法:A-近邻算法,它非常有效而且易于掌握.首先,我们将探讨女-近邻算法的基本理论,以及如何使用距离测量的方法分类物品:其次我们将使用?7««^从文本文件中导人并解析数据: 再次 ...