vue 带动画效果的NavBar

前沿


小编在开发项目过程中遇到一个交互的需求,带动画的Navbar,就是类似于element-ui的tabs标签页的动画效果,由于种种原因吧,小编就开始自己搞了一个,在这过程中发现了<slot></slot>插槽这个非常有价值的鬼,于是就开始研究了,终于搞了一个可以复用的组件,分享出来大家一块学习。


微信图片_20180709141406.png

声明:

slot 的介绍在代码中会有体现,话不多说,上代码。


1,新建一个公共的承载NavBar的组件,这里起名为NavBar.vue,这个公共的组件中主要是NavBar中的Title以及点击事件和一些动画效果的实现,为了实现真正意义上的组件,这里将所需要的内容以插槽(slot)的形式插入到NavBar这个组件中,以达到灵活控制。

<template>
<div class="MBslidebar">
  <div class="TopNavbarTitle">
    <div class="NavbarTitle" v-for="(item,index) in Navtabs" :class="{'NavbarTitleActive':activeIndex == index }" @click="tabClick(index,$event)">{{item}}</div>
    <div class="navbar__slider"  v-bind:style="{'transform':'translate3d('+sliderOffset+'px,0,0)'}"></div>
  </div>
    <div class="NavBarBody">
        <p>第一个slot</p>
        <!-- 加入name="first"属性与父组件中的<span slot="first">我的slot</span>相呼应达到插槽的作用范围的控制 -->
        <slot name="first"></slot>
        <p>第二个slot</p>
        <!-- 若要给插槽内传值,在slot中写入:activeIndex="activeIndex"(类似于父子组件传值,这里要注意的是接受的时候用到的是【slot-scope="props"】接受,再引用的页面会有体现。) -->
        <slot name="second" :activeIndex="activeIndex"></slot>
    </div>
</div>
</template>
<script>
    export default{
        props:['Navtabs'],
        data(){
            return{
             activeIndex: 0,
             sliderOffset: 0,
            }
        },
        methods:{
            tabClick(index,e){
                this.sliderOffset = e.currentTarget.offsetLeft;
                this.activeIndex = index;
        }
    }
}
</script>
<style>
    .MBslidebar {
width: 500px;
height: 200px;
border: 1px solid;
position: relative;
}
.TopNavbarTitle {
width: 100%;
height: 50px;
position: absolute;
z-index: 500;
top: 0;
}
.TopNavbarTitle:hover{
cursor: pointer;
}
.NavbarTitle{
width: 25%;
height: 50px;
float: left;
line-height: 50px;
text-align: center;
}
.NavbarTitleActive{
color: #f08300;
}
/* 这个是切换的动画,采用css3来控制 */
.navbar__slider {
position: absolute;
content: " ";
left: 0px;
bottom: 0;
width: 25%;
height: 3px;
background-color: #f08300;
-webkit-transition: -webkit-transform 0.3s;
transition: -webkit-transform 0.3s;
transition: transform 0.3s;
transition: transform 0.3s, -webkit-transform 0.3s;
}
.NavBarBody{
margin-top: 60px;
}
.navbar-content-item{
width: 500px;
height: 100px;
border: 1px solid red;
}
</style>

2,新建一个你要引用的页面,这是叫homepage.vue

<template>
    <div class="mytemplate">
        <p>我是引用页面</p>
        <navbar :Navtabs="tabseve">
            <!-- 这就是之前所说的与前边相呼应的地方,为了控制slot的作用范围,加上slot="first",与NavBar.vue中的 <slot name="first"></slot>呼应 -->
            <span slot="first">我的slot</span>

<!-- 第一种是直接将html插入到NavBar.vue 中,然后再引用页面直接操作就ok. -->
       <div class="NavBarBody" slot="second" slot-scope="props">
               <p>{{props.activeIndex}}</p>
               <div class="navbar-content-item" v-show="props.activeIndex == 0">我是微信充值slot</div>
               <div class="navbar-content-item" v-show="props.activeIndex == 1">我是充值卡充值</div>
               <div class="navbar-content-item" v-show="props.activeIndex == 2">我是充值记录</div>
               <div class="navbar-content-item" v-show="props.activeIndex == 3">我是充值明细</div>
            </div>



<!-- 第二种是将另一个组件插入到NavBar.vue 中 -->
<!-- 这里就是跟父子组件通信不一样的地方,slot-scope="props"为接受过来的值,然后再通过:slotTochild="props"传到Content页面 -->
            <NavContent slot="second" slot-scope="props" :slotTochild="props"></NavContent>



        </navbar>

    </div>
</template>
<script>
    import navbar from './BaseNav.vue'
    import NavContent from './itemContent.vue'
    export default{
        components:{
           navbar,
           NavContent
        },
        data(){
            return{
              tabseve:["微信充值", "充值卡充值", "充值记录","充值明细"]
            }
        }
    }
</script>
<style>
    
</style>

3,若采用将组件插入的形式,需要再建一个页面叫itemContent.vue,这里主要是展示切换的选项卡的内容

<template>
    <div class="NavBarBody" >
        <p>{{slotTochild}}</p>
        <div class="navbar-content-item" v-show="slotTochild.activeIndex == 0">我是微信充值</div>
        <div class="navbar-content-item" v-show="slotTochild.activeIndex == 1">我是充值卡充值</div>
        <div class="navbar-content-item" v-show="slotTochild.activeIndex == 2">我是充值记录</div>
        <div class="navbar-content-item" v-show="slotTochild.activeIndex == 3">我是充值明细</div>
    </div>
</template>
<script>
    export default{
        props:['activeIndex','slotTochild'],
        data(){
            return{
            }
        }
}
</script>
<style>
    
.NavBarBody{
margin-top: 60px;
}
.navbar-content-item{
width: 500px;
height: 100px;
border: 1px solid red;
}
</style>

至此整个功能就完成了,这里边主要的收获还是slot插槽的使用,虽然不是特别的透彻,但还是理解了一部分,目前的使用是木有问题的,后续在更新自己的理解。有什么错误希望多多指正。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容