vue实现滚动条改变头部组件样式

海星吧 2019-9-9 4596

这个也是之前看到的网站里的样式,他能根据滚动条的位置来改变css,我就也做了一个在vue里面。

这个需要用到vuex,sass,如果没有学过的可以先去网上找一下教程。

听首歌先,如果没放出来那就是我写错了,不用管了。。song name: Mermaid girl


mutation.js------:

import Vue from 'vue'

import {GETSCROLLTOP} from './mutation-types'


export default{

  [GETSCROLLTOP]:(state)=>{//这样写,mutation-types返回,然后mepMutation。

    state.scrollTop = Math.floor(document.documentElement.scrollTop)

    //使用js,把滚动条数值去掉小数点后面的数值,然后返回整数存入。

    // console.log(state.scrollTop)

  },

}


mutation-types.js------:

export const GETSCROLLTOP = 'GETSCROLLTOP'


store.js------:

import Vue from 'vue'

import Vuex from 'vuex'

Vue.use(Vuex)


import mutations from './mutation';

//import actions from './action';

//import getters from './getter';


const state = {

    scrollTop:0,//全局滚动条数值

    //count:0,

}



export default new Vuex.Store({

    state,

   // getters,

   // actions,

    mutations,

})


headerActive.vue------:

<template>

  <div>

    <div :class="[scrollTop>=100 ? 'header_Active':'header_Move', 'header_default']">

                        <!--这里使用三元表达式判断样式 ,第三个是默认样式不用管。-->

      <div>

        <div>

          <div>

            <div id="user_Information">

              <img id="blogLogo" :src="MyBlogLogo" alt />

              <div v-show="ifLogin" id="Login">

                <img id="userImg" :src="userImg" alt="错误" />

                <div id="userID">ID :{{userName}}</div>

                <div>退出账户</div>

              </div>

              <div v-show="!ifLogin" id="unLogin">

                <router-link to="/Login/LoginUser">登录</router-link>

              </div>

            </div>

          </div>


          <div>

            <ul>

              <li v-for="item in routerlinkList">

                <router-link :to="item.routerlink">{{item.routername}}</router-link>

              </li>

            </ul>

          </div>

        </div>

      </div>

      <!-- -->

    </div>


  </div>

</template>


<script>

  import { mapMutations } from 'vuex'//映射方法引入

  export default{

    data(){

      return{

        userName: "黑雪红毛怪",

        userImg: require("../../assets/img/mst.png"),

        MyBlogLogo: require("@/assets/img/MyBlog.png"),

        ifLogin: false,

        routerlinkList:[

          {routerlink:'/',routername:'首页'},

          {routerlink:'/Blog/BlogShow',routername:'我的微博'},

          {routerlink:'/News/News',routername:'新闻'},

          {routerlink:'/AboutMe/AboutMe',routername:'关于我'},

          {routerlink:'/Introduce/Introduce',routername:'介绍'},

        ]

      }

    },

    computed:{

     scrollTop(){

     return this.$store.state.scrollTop; //返回scrollTop

     }

    },

    mounted() {//组件更新后的钩子函数。

        window.addEventListener('scroll',this.setscroll)//给window添加鼠标中键滚动事件,

    },

    methods:{

      ...mapMutations([]),//应用提交方法

      setscroll(){

        this.$store.commit('GETSCROLLTOP',true)//提交滚动条数据

      }

    },

  }

</script>


<style scoped="scoped">

.header{

  width: 100%;

  height: 100px;

    .header_default{

      position: fixed;

      top: 0;

      min-width: 1200px;

      transition:all 1s;

      border-bottom-right-radius:5em 1em;

      border-bottom-left-radius:5em 1em;

      background-color: rgba(0,205,205,0.6);

      .mg_box {

          height: 100%;

          width: 80%;

          // background-color: white;

          margin: 0 auto;

          .mg_box_flex {

            display: flex;

            justify-content: space-between;

            height: 100%;

            .Label_inHeader {

              height: 85%;

              margin-top: 5px;

              /*background-color: pink;*/

              ul {

                display: flex;

                height: 100%;

                li {

                  display: flex;

                  background-color: #63b8ff;

                  width: 100px;

                  text-align: center;

                  // border-right: 3px solid  #888888;

                  box-shadow: 2px 2px 8px #888888;

                  border-radius: 8px;

                  margin-left: 2px;

                  a {

                    color: #ffdead;

                    display: flex;

                    align-items: center;

                    justify-content: center;

                    height: 100%;

                    width: 100%;

                  }

                }

              }

            }

            .User_inHeader {

              height: 100%;

              // background-color: yellow;

              #user_Information {

                display: flex;

                height: 100%;

                align-items: center;

                font-size: 12px;

                #blogLogo {

                  height: 58px;

                  margin-right: 20px;

                }

                div{

                  display: flex;

                  align-items: center;

                }

                #Login {


                  #userImg {

                    width: 50px;

                    height: 50px;

                    border-radius: 25px;

                  }

                  #userID{

                    color: #63b8ff;

                  }

                  p {

                    display: inline-block;

                  }

                }

                #unLogin{


                }

              }

            }

          }

        }

    }

    .header_Active{//scrollTop数值小于100之后的样式

      height: 65px;

      width: 100%;

    }

    .header_Move{

      height: 95px;

       width: 100%;

      // background-color: red;

    }

}

</style>




以上,在store中存入scrollTop作为存储滚动条数值的参数,

mutation中写一个计算滚动条数值的函数对象GETSCROLLTOP,通过mutation-types返回。

在组件中使用计算属性computed给出一个scrollTop,在标签中写一个{{scrollTop}}

让我们在视图层上看到滚动条数值。//当然这个我写到另一个组件里了,所以这个组件里没有。

通过mounted钩子函数给window对象添加一个鼠标滚动事件,

methods引用...mapMutations映射,

鼠标滚动事件setscroll使用commit来用mutation的GETSCROLLTOP函数提交滚动条数值,

再根据组件中的三元表达式来更换样式,这样就能达成滚动条判断样式了。

这个方法还能重复使用。

讲道理vue还是比react用起来简单的多。真香。



弱鸡程序员年底还在加班
最新回复 (1)
  • 海星吧 2019-9-9
    0 2
    不好了,原本是随便选的一首歌,结果我先被洗脑了、。
    弱鸡程序员年底还在加班
    • ACG里世界
      3
          
返回
发新帖