东拼西凑完成一个“前端框架”(4) - Tabs页

目录

写在前面

在完成了侧边栏后,后台的基础架子已经基本出来了;下面是来加入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://www.cnblogs.com/xinwang/p/12064443.html

时间: 2024-10-05 12:47:47

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

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

目录 东拼西凑完成一个后台 "前端框架" (1) -?布局 东拼西凑完成一个后台 "前端框架" (2) - 字体图标 东拼西凑完成一个"前端框架"(3) - 侧边栏 东拼西凑完成一个"前端框架"(4) - Tabs页 写在前面 Tabs页面完成的基本操作完成,但是功能还不够完备: Tab页打开过多超出的如何处理? Tab页关闭所有.关闭其它操作 Tab页刷新操作 设计 这里参考LayUIAdmin的设计方式: Tab栏左右未知

东拼西凑完成一个“前端框架”(6) - 按钮

目录 东拼西凑完成一个后台 "前端框架" (1) -?布局 东拼西凑完成一个后台 "前端框架" (2) - 字体图标 东拼西凑完成一个"前端框架"(3) - 侧边栏 东拼西凑完成一个"前端框架"(4) - Tabs页 东拼西凑完成一个"前端框架"(5) - Tabs操作 东拼西凑完成一个"前端框架"(6) - 按钮 写在前面 完成了整体框架的工作,下面开始写一些组件:从按钮开始,设计的思

东拼西凑完成一个“前端框架”(3) - 侧边栏

写在前面 东拼西凑完成一个后台 "前端框架" (1) -?布局 ?东拼西凑完成一个后台 "前端框架" (2) - 字体图标 项目引入? font-awesome <link href="lib/font-awesome/css/font-awesome.min.css" rel="stylesheet" /> iconfont自定义图标 <link href="css/icon.css"

东拼西凑完成一个“前端框架”(2) - 字体图标

前言 还记得以前开发的项目目录下都会存放一大堆图标文件,难以维护,同时图标和字体的对齐也是一个麻烦事儿: 下面简单列出字体图标的优劣势,内容摘自图标字体的优缺点和使用 优势 轻量级:一个图标字体要比一系列的图像要小.一旦字体加载了,图标就会马上渲染出来,不需要下载一个个图像.这样可以减少HTTP的请求数量,而且和HTML5的离线存储配合,可以对性能做出优化. 灵活性:不调字体可以像页面中的文字一样,通过font-size属性来对其进行大小的设置,而且还可以添加各种文字效果,如color.hove

东拼西凑完成一个“前端框架”(1) - 布局

前言 在如今"大前端"时代,各种前端框架层出不穷,诸如: ant-Design ant-Design Pro Element iView LayUI 等许多非常优秀的前端框架:本着程序员折腾的精神,于是计划自己去写一套后台的"前端框架",之所以这个前端框架要用"",是因为它只是把许多常用的组件经过改造拼接到一起,类似于 AdminLTE; Start 起个名字 - lsadmin 基于 jQuery 布局 布局参照目前许多流行的后台框架,类似于a

前端框架技术交流群

近来想研究前端框架,所以建立一个前端框架的爱好群,欢迎各位大牛进入,378388745

前端框架easyui layout, Tabs,tree

一.三大前端框架的 1.easyui=jquery+html4(用来做后台的管理界面) 不要钱,开发速度快,不好看,不支持响应式 2.bootstrap=jquery+html5 好看,开发速度快,部分免费,支持响应式 3.alyui 好看,开发速度快,免费,支持响应式c 二.jQuery EasyUI (layout, Tabs,tree) 下载程序库并导入EasyUI和javascript文件 <link rel="stylesheet" type="text/cs

一个很实用的前端框架Zui

杰哥给我推荐了一个很有用的前端框架-Zui,我看着觉得很神奇的,因为有很多我都不懂.在这里分享总结一下.首先,这是一个中国自己开发的框架,比起很多外国的框架来说,有很详细的API,而且是全中文的,不需要再经过其他人的翻译了.然后,它的内容十分丰富,很系统的分为了:基础,控件,组件,JS插件,视图几大块:而且使用起来,只需要导入js,在适当的地方加上正确的class类就可以了.对于,没有什么js基础的人,也是十分容易上手的.下面我就大体的介绍一下它的各个模块的功能.基础:基础里面我觉得很有用的主要

发现 一个业务管理系统 解决了 orm 和 前端框架 剩下的 是 业务逻辑 了 。 哈

解决了 orm 和 前端框架 剩下的 是 业务逻辑 了 . 哈 还有 各种 aop 组件 呢 . 大家 high 来 准备 用 fluent data  和 mysql 写一个 wcf 的 接口呢. wcf 比 webservice 后出来吧 然后 在 用 web api 写一个 接口呢..