美文网首页
web换肤的三种方案

web换肤的三种方案

作者: 三省吾身_9862 | 来源:发表于2021-08-30 16:59 被阅读0次

前提提要:有黑白两种皮肤,需要动态换肤

方案一:引入less.js,浏览器上动态编译。

点击查看方案一效果

  • index.html
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>less换肤</title>
  <link rel="stylesheet/less" type="text/css" href="./index.less" />
  <script src="https://cdn.bootcdn.net/ajax/libs/less.js/4.1.1/less.min.js"></script>
  <script>
    let whiteVars = {
      '@body-bgColor': '#fff',
      '@text-color': '#000',
      '@btn-color': '#fff',
      '@primary-color': '#1890ff'
    }
    let blackVars = {
      '@body-bgColor': '#000',
      '@text-color': '#fff',
      '@btn-color': '#fff',
      '@primary-color': '#1890ff'
    };
    // 根据传入的变量,编译生成新的css,把这些css用style标签包裹起来,插入到对应的less文件下,见下方:图一
    window.less.modifyVars(whiteVars);
  </script>
</head>

<body>
  <h1>less换肤方案</h1>
  <button class="btn" onclick="window.less.modifyVars(whiteVars);">白色皮肤</button>
  <button class="btn" onclick="window.less.modifyVars(blackVars);">黑色皮肤</button>
</body>

</html>
  • index.less
@body-bgColor: #fff;
@text-color: #000;
@btn-color: #fff;
@primary-color: #1890ff;


body{
  background: @body-bgColor;
  color: @text-color;
}
.btn{
  color: @btn-color;
  border-color: @primary-color;
  background: @primary-color;
}
image.png

方案二:改变最外层的容器的class

点击查看方案二效果

因为要node服务编译less,所以这里采用 vue-cli框架

  • main.js
import Vue from 'vue'
import App from './App.vue'
import './assets/styles/white.less'
import './assets/styles/black.less'

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')
  • index.less
*{
  padding: 0;
  margin: 0;
}
html,body,.application{
  height: 100%;
}

.theme-@{skin} {
  &.application{
    background: @body-bgColor;
    color: @text-color;
  }
  
  .btn{
    color: @btn-color;
    border-color: @primary-color;
    background: @primary-color;
  }
}
  • white.less
@body-bgColor: #fff;
@text-color: #000;
@btn-color: #fff;
@primary-color: #1890ff;
@skin: light;

@import './index.less';
  • black.less
@body-bgColor: #000;
@text-color: #fff;
@btn-color: #fff;
@primary-color: #1890ff;
@skin: dark;

@import './index.less';
  • app.vue (这里是触发换肤的地方,改变最外层的容器的class)
<template>
  <div id="app" :class="['application', drak?'theme-dark':'theme-light']">
    <h1>less换肤方案2</h1>
    <button class="btn" @click="drak=false">白色皮肤</button>
    <button class="btn" @click="drak=true">黑色皮肤</button>
  </div>
</template>

<script>

export default {
  data() {
    return {
      drak: false
    }
  }
}
</script>

方案三:移动css文件位置 或者 禁用css文件

点击查看方案三效果

先看图二,理解下这个方案是怎么实现的


image.png

这里涉及自动化工程,还是采用 vue-cli

  • webpack.base.conf.js
module.exports = {
  context: path.resolve(__dirname, '../'),
  entry: {
    app: './src/main.js',
    black: './src/assets/styles/black.less',
    white: './src/assets/styles/white.less',
  },
  ...
}
  • black.less
@body-bgColor: #000;
@text-color: #fff;
@btn-color: #fff;
@primary-color: #1890ff;

@import './index.less';
  • white.less
@body-bgColor: #fff;
@text-color: #000;
@btn-color: #fff;
@primary-color: #1890ff;

@import './index.less';
  • index.less
body{
  background: @body-bgColor;
  color: @text-color;
}

.btn{
  color: @btn-color;
  border-color: @primary-color;
  background: @primary-color;
}
  • app.vue (这里是触发换肤的地方,禁用css文件)
<template>
  <div id="app">
    <h1>less换肤方案3</h1>
    <button class="btn" @click="setBlackTheme(false)">白色皮肤</button>
    <button class="btn" @click="setBlackTheme(true)">黑色皮肤</button>
  </div>
</template>

<script>
export default {
  methods: {
    setBlackTheme(flag) {
      document.querySelectorAll('link').forEach(tag => {
        let tagName = tag.href.split('/').pop();
        if (tagName.startsWith('white')) {
          if (flag) {
            tag.setAttribute('disabled', 'disabled');
          } else {  
            tag.removeAttribute('disabled');
          }
        }
      })
    }
  }
}
</script>

总结,所有的方案,都是css样式覆盖实现的。

当然以上只是一些简单的总结,实际项目中更复杂,需要解决一些其他的问题,为方便理解,在这里没有写上去。项目中如有疑问,欢迎留言讨论。

代码地址:https://github.com/wkpGitHub/switch-skin

相关文章

  • web换肤的三种方案

    前提提要:有黑白两种皮肤,需要动态换肤 方案一:引入less.js,浏览器上动态编译。 点击查看方案一效果[htt...

  • android 夜间模式(换肤)总结

    一、android 平台常见的换肤方案. Android 平台常见的额换肤方式总结起来有如下三种: 1.设置set...

  • 【靶点突破】网易云换肤方案探讨

    【靶点突破】网易云换肤方案探讨 老方案 网易云音乐换肤方案原理 动手实现一个网易云换肤方案的demo 动手打造换肤...

  • [Swift And OC] 聊一聊换肤方案

    [Swift And OC] 聊一聊换肤方案 [Swift And OC] 聊一聊换肤方案

  • Android Runtime Resource Overlay

    系统换肤方案来源于2014年sony在Android 5.0上针对定制化的Theme所提供的换肤方案,并且该方案被...

  • 换肤

    换肤 1. 换肤的应用场景? 2. 换肤的实现方案 方案1 1. 将图片以及颜色按照主题命名,使用虚拟文件夹, 直...

  • web端换肤功能-方案2

    1、原理 通过css3的自定义属性,在不同风格下改变css的自定义属性值,达到换肤的效果。 2、方案 换肤分为黑白...

  • web端换肤功能-方案1

    1、版本 webpack: 4.42.1html-webpack-plugin: 4.0.4mini-css-ex...

  • iOS换肤方案

    换肤方案在一些文艺App上经常见到。为新项目和老项目添加换肤方案查看原文

  • 换肤方案

    背景需求 目前Android APP换肤大体可分为两大类: 两套主题的切换(比如白天/黑夜),使用一个开关按钮进行...

网友评论

      本文标题:web换肤的三种方案

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