网站换皮肤功能实现

泰康这个项目有个换皮肤的功能,实现效果如下:

实现思路:用户点击哪个颜色在顶层增加一个class,然后改变这个class下面element-ui的组件颜色。具体代码如下:

app.vue要写几套样式:例:绿色是每套样式的前缀

.clYellow .el-header {
  background-color: #ef7800;
  color: #FFF;
  text-align: center;
  height: 49px!important;
}

.clYellow .el-menu-item:hover,.clYellow .el-date-table td.end-date span,
.clYellow .el-date-table td.start-date span{
  background-color:#ef7800!important;
}

在嵌套router-view和nav的页面:功能是在最顶层添加class

<template>
  <div style="height:100%" :class="{'clYellow':chooseCl == '#ef7800','clRed':chooseCl == '#b92d28'}">
    <el-container style="height:100%">
      <!--选皮肤-->
      <div class="bg-choose-box" v-if="showColor" id="bgBox">
        <div @click="chooseClFn(item)" class="pifuItem" v-for="(item,index) in pfList" :key="index" :style="{background:item}"></div>
      </div>
      <el-header class="clearfix">
        <i id="setingIcon" class="el-icon-setting fr" @click="showColor = !showColor"></i>
      </el-header>
      <el-container style="height:100%">
        <el-aside width="200px">
          <Nav :actBtn="actBtn"></Nav>
        </el-aside>
        <el-container>
          <el-main>
            <router-view></router-view>
          </el-main>
        </el-container>
      </el-container>
    </el-container>
  </div>
</template>

<script>
import Nav from '@/components/Nav'
export default {
  name: 'HelloWorld',
  components:{
      Nav
  },
  data () {
    return {
      chooseCl:'',
      actBtn:'hr',
      showColor:false,
      pfList:['#599ef8','#ef7800','#b92d28','#FFF'],
    }
  },
  methods:{
    chooseClFn(val){
      this.chooseCl = val;
    },
  },
}
</script>

本来以为就完事了,然后发现个问题:这种弹出层的picker和下拉框样式没有生效,原因是这个dom元素和app是同层级的,并且是后加上来的,所以他没在我们定义的class下一层,导致样式不生效。

为了解决这个问题也是各种在群里问和在github上找,终于在github上找到一个可以监听页面新增dom的一个库arrive.js,地址是:https://github.com/uzairfarooq/arrive

然后把arrive.js里的arrive.min.js复制到static文件夹,然后我们就可以使用了,在main.js里使用arrive.js,给每个新增的popper加上name属性

if(document.arrive){
  document.arrive('.el-popper',function(){
    let doms = document.querySelectorAll('.el-popper');
    let val = sessionStorage.getItem('bgCl');
    if(val == '#ef7800'){
      doms.forEach(item=>{
        item.setAttribute('name','clYellow')
      })
    }else if(val == '#b92d28'){
      doms.forEach(item=>{
        item.setAttribute('name','clRed')
      })
    }
  })
}

然后在app.vue里增加样式

.el-select-dropdown[name=clYellow] .el-select-dropdown__item.selected{
  color:#ef7800!important;
  background-color:none!important;
}

.el-select-dropdown[name=clRed] .el-select-dropdown__item.selected{
  color:#b92d28!important;
  background-color: none!important;
}

并更改点击右边颜色时的代码,让点击右边时候也添加name属性,防止已经加载过picker用户在换皮肤问题

chooseClFn(val){
        let doms = document.querySelectorAll('.el-popper');
        this.chooseCl = val;
        sessionStorage.setItem('bgCl',val)
        if(val == '#ef7800' ){
          doms.forEach(item=>{
            item.setAttribute('name','clYellow')
          })
        }else if(val == '#b92d28'){
          doms.forEach(item=>{
            item.setAttribute('name','clRed')
          })
        }else{
          doms.forEach(item=>{
            item.removeAttribute('name')
          })
        }
 },

以上就是完整更换皮肤过程与思路

posted @ 2019-05-17 15:38  小小的忧愁  阅读(897)  评论(0编辑  收藏  举报