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

目录

写在前面

Tabs页面完成的基本操作完成,但是功能还不够完备:

  • Tab页打开过多超出的如何处理?
  • Tab页关闭所有、关闭其它操作
  • Tab页刷新操作

设计

这里参考LayUIAdmin的设计方式:

  1. Tab栏左右未知可以动态调整
  2. 打开的标签页面超出时,调整位置到指定标签页显示
  3. 左右滑动不同范围的标签页

布局

  • Tab栏左右位置可以调整,那么Tab栏的定位是绝对定位
  • 左右调整动画 transaction

代码

HTML

···
 <div class="ls-tab-container">
    <div class="header flex">
        <!--left-->
        <div class="tab-operate tab-operate-left">
            <a class="fa fa-2x fa-angle-double-left opt-left"></a>
        </div>
        <!--titles-->
        <div class="ls-tab-titles flex">
            <div class="tab-title active" data-id="0">
                <span class="title">
                    <i class="ls-icon ls-icon-home"></i>
                </span>
            </div>
        </div>
        <!--right-->
        <div class="tab-operate tab-operate-right">
            <a class="fa fa-2x fa-angle-double-right opt-right"></a>
            <a class="fa fa-2x fa-angle-double-down">
                <div class="dropdown-panel">
                    <ul>
                        <li class="opt" data-opt="refresh">刷新</li>
                        <li class="opt" data-opt="closeOthers">关闭其它</li>
                        <li class="opt" data-opt="closeAll">全部关闭</li>
                    </ul>
                </div>
            </a>
        </div>
    </div>
···
</div>
···

CSS

<!--Tabs栏-->
.ls-tab-container .ls-tab-titles {
    position: absolute;
    left: 39px;
    right: 78px;
    overflow: hidden;
    transition: all 300ms ease-in;
    -webkit-transition: all 300ms ease-in;
}
<!--操作-->

.tab-operate {
    position: absolute;
    display: flex;
    text-align: center;
    border-bottom: 1px solid #e6e6e6;
    background: rgba(255, 255, 255, 1);
    box-shadow: 0 0 6px rgba(196, 199, 202, 0.35);
    z-index: 8;
}

.tab-operate .fa:hover {
    background: rgba(238, 238, 238, .6);
    cursor: pointer;
}

.tab-operate.tab-operate-left {
    left: 0;
}

.tab-operate.tab-operate-right {
    right: 0;
}

.tab-operate .fa {
    color: #666;
    font-size: 22px;
    line-height: 36px;
    width: 38px;
    display: inline-block;
}

.tab-operate-left .fa {
    border-right: 1px solid rgb(230, 230, 230, .8);
}

.tab-operate-right .fa {
    border-left: 1px solid rgb(230, 230, 230, .8);
    position: relative;
}

效果

下拉菜单

鼠标经过最右侧操作按钮时展示下拉菜单,思路很简单就算用伪类 hover 实现,但是在利用transaction做动画的过程中发现,display 属性与 transaction 属性冲突,解决方式是通过 height:0;overflow:hidden; 来实现动画:

.dropdown-panel {
    background: #fff;
    position: absolute;
    width: 120px;
    right: 0;
    font-size: 13px;
    transition: top 200ms ease-in, opacity 200ms ease-in;
    -webkit-transition: top 200ms ease-in, opacity 200ms ease-in;
    border-radius: 4px;
    top: 46px;
    height: 0;
    opacity: 0;
    overflow: hidden;
    box-shadow: 0 0 6px rgba(196, 199, 202, .35);
}

.tab-operate-right .fa:hover .dropdown-panel {
    top: 37px;
    opacity: 1;
    height: auto;
    border: 1px solid rgb(230, 230, 230, .8);
}

效果预览

操作

思路


如图所示 打开多个标签页时只要把超出的部分利用 Tab栏margin-left 属性补回来就可以实现:
margin-left: (Tab栏.Offset().Left+Tabs栏.Width() - TabItem.Offset().Left-TabItem.Width()) + ‘px‘

关键代码实现

// 激活Tab时触发
···
// 位置调整
var pleft = $tab.offset().left + 39;
var pright = $tab.offset().left + $tab.width() - 80;
var cleft = $tabTitle.offset().left;
var cright = cleft + $tabTitle.width() + 30;
var cmgLeft = parseFloat($tabTitle.parent().css("margin-left").replace("px", ""));

if (cleft < pleft) {
    cmgLeft = (cmgLeft + pleft - cleft);
    $tabTitle.parent().css("margin-left", cmgLeft + "px");
} else if (cright > pright) {
    cmgLeft = (cmgLeft + pright - cright);
    $tabTitle.parent().css("margin-left", cmgLeft + "px");
}
···

左右滑动

思路

分页的思想:把Tabs栏的宽度类比为 PageSize[分页大小] , 打开标签页占用的总长度类比为 TotalCount[总数]

关键代码实现


/**
 * 翻页
 * @param {页码}} pageIndex
 */
var changePage = function(diff) {
    // 容器宽度
    var cWidth = $('.ls-tab-container').width() - 119;
    var $firstTitle = $('.ls-tab-titles .tab-title:first'),
        $lastTitle = $('.ls-tab-titles .tab-title:last');
    // 内容宽度
    var tsWidth = $lastTitle.offset().left -
        $firstTitle.offset().left +
        $lastTitle.width() + 30;
    var curPage = $title_container.attr("cur-p");

    // 容器 margin-left 用于计算当前页码
    var cmgLeft = parseFloat($title_container.css("margin-left").replace("px", ""));
    curPage = Math.floor(Math.abs(cmgLeft) / cWidth) + 1;

    var totalPage = Math.floor(tsWidth / cWidth) + (tsWidth % cWidth > 0 ? 1 : 0);
    curPage = curPage + diff;
    if (curPage >= totalPage) {
        curPage = totalPage;
        $title_container
            .css("margin-left", (1 - totalPage) * cWidth + "px")
            .attr("cur-p", totalPage);
    } else if (curPage <= 1) {
        curPage = 1;
        $title_container
            .css("margin-left", "0px")
            .attr("cur-p", "1");
    } else {
        $title_container
            .css("margin-left", (1 - curPage) * cWidth + "px")
            .attr("cur-p", curPage);
    }
}

效果预览

欢迎批评指正

源码地址

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

原文地址:https://www.cnblogs.com/xinwang/p/12159153.html

时间: 2024-10-08 13:35:13

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

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

目录 东拼西凑完成一个后台 "前端框架" (1) -?布局 ?东拼西凑完成一个后台 "前端框架" (2) - 字体图标 东拼西凑完成一个"前端框架"(3) - 侧边栏 写在前面 在完成了侧边栏后,后台的基础架子已经基本出来了:下面是来加入Tab页面,正在纠结于Tab页面是否用现成的轮子, 比如 LayUI 想一想还是撸起袖子直接干一个 Tabs 实现原理 Title 列表 头部标题部分,用于显示Tab页的标题和打开状态 Content 内容 用于

东拼西凑完成一个“前端框架”(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

前端框架学习 --结点操作

结点操作 一.结点的创建 1 document.createElement( ) 标准:传入一个标签名,支持非标准的标签名 document.createElement("c") IE6-7:可以传入连同用户一起生成 document.createElement("<input name='name'>") eg: //http://thunderguy.com/semicolon/2005/05/23/setting-the-name-attribut

前端框架技术交流群

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

前端框架对页面的损害+如何判断一个dom是否存在某个属性

目录 进入主题 我的经历 特此记下造福后人 如何判断一个dom是否存在某个属性 进入主题 今天遇到一个问题就是引发了我对各种前端框架的思考. 首先我个人认为前端js+css框架,多数其实原理是这样的: 写页面的时候使用框架提供的css类. 然后框架通过这些预定义样式提供美观的界面. 涉及到功能的则是通过jquery的选择器根据class选择到dom元素,然后对dom元素进行操作. 完毕 如上所述,框架会对页面dom元素进行简单的修改. 我的经历 今天我使用框架,使用了框架的dialog,我的di

前端框架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