LTE Admin 模板实现sidebar菜单联动tabs页签

另一篇:ACE Admin 模板实现sidebar菜单联动tabs页签(你值得拥有)

说在前面的话:
        该组件主要使用Admin LTE 实现Tab页联动sidebar。实现的目标是:
            1、不改动Admin LTE的模板框架(Bootstrap v3.4.1);
            2、tab页的加载默认使用ajax的get方式,详见(bootstrap.addtabs.js);不用iframe;
            3、sidebar标题与tab页的联动;
            4、tab标签页的动态滚动(左滚、右滚,左右滚动一屏);
            5、右键菜单(关闭左侧、右侧、其他,全部关闭,刷新);
            6、全屏

效果展示

#### 修改操作:

index.html中删除<div class="content-wrapper">包含的代码块,并添加了如下代码

<!-- Content Wrapper. Contains page content -->
<div class="content-wrapper" id="content-wrapper">
    <!-- nav tabs -->
    <div class="content-tabs">
        <button class="roll-nav roll-left tabLeft" role="rollleft">
            <a href="javascript:void(0);" >
                <i class="glyphicon glyphicon-fast-backward"></i>
            </a>
        </button>
        <nav class="page-tabs menuTabs tab-ui-menu" id="tab-menu">
            <ul class="page-tabs-content nav nav-tabs" style="margin-left: 0px;">
                <li role="presentation" id="tab_tab_home1" aria-url="example/ajax/mailbox.txt" aria-ajax="false" class="menu_tab active">
                    <a href="#tab_home1" aria-controls="tab_home1" role="tab" data-toggle="tab">欢迎页</a>
                    <i class="close-tab glyphicon glyphicon-remove" style="display: none;"></i>
                </li>
            </ul>
        </nav>
        <button class="roll-nav roll-right tabRight" role="roleright">
            <a href="javascript:void(0);">
                <i class="glyphicon glyphicon-fast-forward"></i>
            </a>
        </button>
        <button class="roll-nav roll-right fullscreen" role = "fullscreen">
            <i class="glyphicon glyphicon-fullscreen"></i>
        </button>
    </div>
    <!-- Tab panes -->
    <div class="tab-content">
        <div class="tab-pane content active" id="tab_home1" role="tabpanel">
            I'm a homepage.
        </div>
    </div>
</div>

#### 将sidebar部分代码<ul class="sidebar-menu" data-widget="tree">
下`li`中的<a href="index.html">的`*.html`替换成
<a data-addtab="dashboardv1" data-url="index.txt">
其中a标签还可以添加如下属性,分别对应下面几种情况

<a class="list-group-item" data-addtab="simdyn" data-url="mailbox.txt">
// 指定tab页内容
data-content="Customize the content"
// 使用ajax
data-ajax="true"
// 设置tab页签标题
data-title="Customize the title"
// 指定在哪个tab页内容中显示
data-target="#tabs2"

其中的data-url届时换成后台请求地址即可</font>#### 删除页面无需引用的js

<!-- Morris.js charts -->
<script src="bower_components/raphael/raphael.min.js"></script>
<script src="bower_components/morris.js/morris.min.js"></script>

<!-- AdminLTE dashboard demo (This is only for demo purposes) -->
<script src="dist/js/pages/dashboard.js"></script>

#### 引入bootstrap.addtabs.css

<!-- Bootstrap 3.3.7 -->
<link rel="stylesheet" href="bower_components/bootstrap/dist/css/bootstrap.min.css">
<!-- Bootstrap addtabs-->
<link rel="stylesheet" href="bower_components/bootstrap/dist/css/bootstrap.addtabs.css" />

#### 引入bootstrap.addtabs.js同时修改bootstrap.min.js为bootstrap.js

<!-- Bootstrap 3.3.7 -->
<script src="bower_components/bootstrap/dist/js/bootstrap.js"></script>
<!-- Bootstrap addtabs -->
<script type="text/javascript" src="bower_components/bootstrap/dist/js/bootstrap.addtabs.js" ></script>

#### bootstrap.js中添加tab选项卡滚动代码

var clickHandler = function(e) {
    e.preventDefault()
    Plugin.call($(this), 'show')

    // 新增滚动功能
    scrollToTab($(this).closest("li.active"))
}

//计算多个jq对象的宽度和
var calSumWidth = function(element) {
    var width = 0;
    $(element).each(function() {
        width += $(this).outerWidth(true);
    });
    return width;
};
//滚动到指定选项卡
var scrollToTab = function(element) {
    var marginLeftVal = calSumWidth($(element).prevAll()), //前面所有tab的总宽度
        marginRightVal = calSumWidth($(element).nextAll()); //后面所有tab的总宽度
    var tabOuterWidth = calSumWidth($(".content-tabs").children().not(".menuTabs"));
    var visibleWidth = $(".content-tabs").outerWidth(true) - tabOuterWidth;
    var scrollVal = 0;
    if($(".page-tabs-content").outerWidth() < visibleWidth) {
        scrollVal = 0;
    } else if(marginRightVal <= (visibleWidth - $(element).outerWidth(true) - $(element).next().outerWidth(true))) {
        if((visibleWidth - $(element).next().outerWidth(true)) > marginRightVal) {
            scrollVal = marginLeftVal;
            var tabElement = element;
            while((scrollVal - $(tabElement).outerWidth()) > ($(".page-tabs-content").outerWidth() - visibleWidth)) {
                scrollVal -= $(tabElement).prev().outerWidth();
                tabElement = $(tabElement).prev();
            }
        }
    } else if(marginLeftVal > (visibleWidth - $(element).outerWidth(true) - $(element).prev().outerWidth(true))) {
        scrollVal = marginLeftVal - $(element).prev().outerWidth(true);
    }
    //执行动画
    $('.page-tabs-content').animate({
        marginLeft: 0 - scrollVal + 'px'
    }, "fast");
};


#### 相关源码:希望各位看官达人多多支持
(9.99元—微信打赏,一年365天)

打赏后评论留言或者备注留言——已支持,你的邮箱地址,模板名称,

例如:已支持,xxxx@qq.com,lte,将及时发送源码)

扫码赞赏

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 118
    评论
Vue3 中实现类似于 Vue-Element-Admin 中的标面效果,可以按照以下步骤进行: 1. 创建一个 `Layout` 组件,用于包含面内容和标组件。 2. 在 `Layout` 组件中,使用 `router-view` 标来渲染当前路由对应的组件。 3. 创建一个 `TagsView` 组件,用于显示标列表,并提供添加、删除等操作。 4. 在 `TagsView` 组件中,监听路由的变化,根据当前路由动态添加标。 5. 在 `TagsView` 组件中,提供标的删除操作,点击标时切换路由。 具体实现可以参考以下代码: ```vue // Layout.vue <template> <div class="layout"> <div class="header">Header</div> <div class="sidebar">Sidebar</div> <div class="content"> <router-view></router-view> </div> <TagsView></TagsView> </div> </template> <script> import TagsView from './TagsView.vue' export default { name: 'Layout', components: { TagsView, }, } </script> <style> /* 样式省略 */ </style> ``` ```vue // TagsView.vue <template> <div class="tags-view"> <div class="tags"> <div v-for="(tag, index) in visitedViews" :key="tag.path" class="tag" :class="{ active: activeIndex === index }" @click="handleTagClick(index)" > {{ tag.meta.title }} <span class="close" @click.stop="handleTagClose(index)">x</span> </div> </div> </div> </template> <script> import { computed, defineComponent } from 'vue' import { useRoute, useRouter } from 'vue-router' export default defineComponent({ name: 'TagsView', setup() { const router = useRouter() const route = useRoute() // 访问过的面 const visitedViews = computed(() => router.getMatchedComponents().map(({ meta, ...rest }) => ({ meta, ...rest, })), ) // 当前激活的面索引 const activeIndex = computed(() => visitedViews.value.findIndex((view) => view.path === route.path), ) // 标点击事件 const handleTagClick = (index) => { const path = visitedViews.value[index].path router.push(path) } // 标关闭事件 const handleTagClose = (index) => { const path = visitedViews.value[index].path router.push('/') router.replace(path) } return { visitedViews, activeIndex, handleTagClick, handleTagClose, } }, }) </script> <style> /* 样式省略 */ </style> ``` 在以上代码中,我们使用了 Vue3 的 Composition API,通过 `computed` 创建计算属性,通过 `defineComponent` 创建组件。使用了`useRouter`和`useRoute`两个方法可以获取到当前路由信息。在 `TagsView` 组件中,我们监听了路由的变化,动态添加标,并提供了标的删除和切换操作。同时,我们在 `Layout` 组件中使用 `router-view` 标来渲染当前路由对应的组件,实现了类似于 Vue-Element-Admin 中的标面效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 118
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dkjhl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值