美文网首页
Navigation Tab 导航组件

Navigation Tab 导航组件

作者: 潜心之力 | 来源:发表于2019-07-18 09:29 被阅读0次
    一、HTML结构
    <div class="tab">
      <div class="arrow-left">
        <i class="iconfont icon-shuangjiantouzuo"></i>
      </div>
      <div class="tab-container">
        <ul id="tab-ul"></ul>
      </div>
      <div class="arrow-right">
        <i class="iconfont icon-shuangjiantouyou"></i>
      </div>
    </div>
    
    <div id="frame-div">
    </div>
    
    二、CSS样式
    .tab {
        position: absolute;
        height: 41px;
        top: 0;
        left: 135px;
        right: 230px;
    }
    
    .tab > div {
        position: absolute;
        top: 25%;
    }
    
    .tab > div:first-child { /*左箭头*/
        width: 20px;
    }
    
    .iconfont.icon-shuangjiantouzuo:hover { /*左箭头悬浮状态*/
        color: #0ACEF7;
        cursor: pointer;
    }
    
    .tab > div:last-child { /*右箭头*/
        width: 20px;
        right: 0;
    }
    
    .iconfont.icon-shuangjiantouyou:hover { /*右箭头悬浮状态*/
        color: #0ACEF7;
        cursor: pointer;
    }
    
    .tab > div:not(:first-child):not(:last-child) { /*选项卡容器*/
        left: 20px;
        right: 20px;
        overflow: hidden;
    }
    
    .tab ul { /*选项卡列表*/
        position: relative;
    }
    
    .tab ul li { /*选项卡*/
        list-style: none;
        float: left;
        padding-left: 5px;
        padding-right: 5px;
    }
    
    .tab ul li:hover { /*选项卡悬浮状态*/
        color: #0ACEF7;
        cursor: pointer;
    }
    
    .tab ul li span { /* 选项卡名称 */
        font-size: 15px;
    }
    
    .tab ul li i { /* 选项卡关闭按钮 */
        padding-left: 3px;
    }
    
    .active { /*激活状态*/
        color: #0ACEF7;
    }
    
    三、JavaScript脚本
    /* 子窗口容器 */
    var $container = $("#frame-div");
    /* 导航栏列表 */
    var $ul = $("#tab-ul");
    /* 链接数组 */
    var array = new Array();
    /* 偏移量 */
    var offset = 100;
    /* 已偏移位置 */
    var move = 0;
    /* 动画执行时间 */
    var time = 150;
    
    /* 添加页面 */
    function addNavTab(name, url) {
        var exist = array.indexOf(name);
    
        if (exist != -1) {
            $container.children().eq(exist).show().siblings().hide();
            $ul.children().eq(exist).addClass('active').siblings().removeClass('active');
            
            tip:相同链接考虑到传递不同参数时重新加载页面
            tip:相同参数重新加载页面可以传递随机参数(date,random)
            var boolean = $container.children().eq(exist).attr('src') === url
                && url.indexOf('?') === -1;
            if (!boolean) $container.children().eq(exist).attr('src', url);
        } else {
            array.push(name);
            var iframe = "<iframe style='display: none;top: 0;bottom: 0;position: absolute' src='" + url + "'></iframe>";
            $container.append(iframe);
            $container.children(":last-child").show().siblings().hide();
    
            var li = "<li><span>" + name + "</span><i class=\"iconfont icon-close\"></i></li>";
            $ul.append(li).children(":last-child").addClass('active').siblings().removeClass('active');
            $ul.width(getTabWidth());
        }
    }
    
    /* 切换页面 */
    function changeNavTab(index) {
        $ul.children().eq(index).addClass('active').siblings().removeClass('active');
        $container.children().eq(index).show().siblings().hide();
    }
    
    /* 移除页面 */
    function removeNavTab(index) {
        $container.children().eq(index).remove();
        $ul.children().eq(index).remove();
        array.splice(index, 1);
    
        var active = $ul.children(".active").length;
        if (active === 0) {
            var count = $ul.children().length;
            if (count === 0) {
                return;
            }
            if (index < count) {
                changeNavTab(index);
            } else {
                changeNavTab(index - 1);
            }
        }
    }
    
    /* 获取Tab的总宽度 */
    function getTabWidth() {
        var array = $ul.children();
        var width = 0;
        for (var i = 0; i < array.length; i++) {
            width += array.eq(i).outerWidth();
        }
        var pw = $ul.parent().width();
        return pw > width ? pw : width;
    }
    
    /* 选项卡是否可以滑动 */
    function scroll() {
        return $ul.width() > $ul.parent().width() && range() - move > 0;
    }
    
    /* 选项卡可滑动范围 */
    function range() {
        var range = $ul.width() - $ul.parent().width();
        return range > 0 ? range : 0;
    }
    
    /* 执行一次动画的滑动距离 */
    function distance() {
        var distance = range() - move;
        distance = distance > 0 ? distance : 0;
        return distance - offset > 0 ? offset : distance;
    }
    
    /* 选项卡设置监听事件,切换页面 */
    $ul.on('click', "li", function () {
        var $this = $(this);
        $.ajax({
            type: "GET",
            dataType: "JSON",
            url: "/xms/systemUser/session",
            success: function (data) {
                if (data) {
                    changeNavTab($this.index());
                } else {
                    location.href = "/";
                }
            }
        });
    });
    
    /* 选项卡设置监听事件,移除页面 */
    $ul.on('click', "i", function (event) {
        event = event || window.event;
        event.cancelBuddle = true;
        event.stopPropagation();
    
        var index = $(this).parent().index();
        removeNavTab(index);
    });
    
    /* 左箭头监听事件 */
    $("div[class=arrow-left]").click(function () {
        if (move > 0) {
            var step = move > offset ? offset : move;
            $ul.animate({left: '+=' + step}, time);
            move -= step;
        }
    });
    
    /* 右箭头监听事件 */
    $("div[class=arrow-right]").click(function () {
        if (scroll()) {
            var step = distance();
            $ul.animate({left: '-=' + step}, time);
            move += step;
        }
    });
    

    相关文章

      网友评论

          本文标题:Navigation Tab 导航组件

          本文链接:https://www.haomeiwen.com/subject/orhklctx.html