关于动态换肤的解决方案

关于动态换肤的解决方案

最近在学习electron,希望在页面切换的时候动态更换背景色,也是参考了一个知名软件的效果,让我手痒起来,也想实现以下,之前在用element开发的时候接触到过换肤的一些思路,但是当时并没有这块的需求,也就搁置了,下面个跟大家探讨以下我的两种思路。
效果图关于动态换肤的解决方案

方式一 动态增加link标签

所谓动态增加link标签就是在需要换肤的时候,把需要更改的颜色进行关键字替换,把新生成的颜色代替掉旧文件的颜色,然后动态挂载到head中,从而实现样式的覆盖。这种方式也是element官方给出的解决方案,具体实现方式这里给出一小块代码体会一下,在GitHub上一个issue里比较详细,这里给出传送门,需要的去看一下。

 if (document.head.lastChild.innerText !== '') {//增加一个style标签
          const style = document.createElement('style')
           // 这个值是你生成的需要替换的样式或者颜色
          style.innerText = csstext
          document.head.appendChild(style)
        } else {
          // 如果是空的说明你已经加过了,但是又删除了这个样式,下次就可以
          //直接添加内容,不用再添加标签了
          document.head.lastChild.innerText = csstext
        }
      } 
      //这个判断是根据业务来的,可以不用看,就是在我取消换肤回到默认样式的
      //判断
      else {
        document.head.lastChild.innerText = ''
      }

方式二 通过css变量的方式

这种方式是我在逛codepen的时候看到的一种写法,感觉用到换肤上很合适,就自己实践了一下,发现效果还不错,这种方式需要我们对css的一个不常用属性进行恶补一下(至少我是不知道的哈哈),css有一个属性为:root,它代表根元素的样式,也就是html标签的样式,知道了这个后在来了解一下原生css的变量。

我们现在说到css变量,首先想到的是一些预处理器,比如sass 、less、 stylus等,但是css自己的变量机制可以说是很好用了,首先看一个例子

:root {
  --main-color: hotpink;
  --pane-padding: 5px 42px;
}

这是W3c上的介绍,我当初看也是一脸懵逼,这种写法没见过啊,仔细看了一下发现原理很简单,在根元素下定义变量,变量通过—的方式进行声明,之所以不用$是因为被sass用掉了。然后使用也非常简单

:root { --bg-color: #369;}
h3    { --bg-color: #d9444a;}
#main { --bg-color: #94a437;}


div {
  background: var(--bg-color);
}

我们可以使用js来进行动态换肤,像这样

var styles = getComputedStyle(document.documentElement);
var value = String(styles.getPropertyValue('--bg-primary-color')).trim();

/* 或取背景顏色 */
document.getElementById("color-name").innerHTML=value;

/* 修改背景顏色 */
document.documentElement.style.setProperty('--bg-primary-color', '#369');

变量声明的作用域为声明是所在的层级作用域,它和声明的类的作用域相同,此外变量还可以进行计算,我这里只是给大家提供一种方案,具体的可以参考这个文章,写的很清晰。


最后如果有同学感兴趣效果图的源码,可以在这个理查看

上一篇:Python3 tkinter基础 Button bg 按钮的背景颜色


下一篇:background属性