iview动态换肤

in iviewui with 0 comment

实现方案 :

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <title>iview动态换肤</title>
    <link rel="stylesheet" href="./iview.css" >
    <meta id="iviewCss"> <-- 为了将新创建的style放置到当前标签之前-->
</head>
<body>
    <div id="app"></div>
</body>
</html>
//ThemePicker.vue
<template>
    <div>
        <ColorPicker
            v-model="color"
            :colors="['#6f2fc9','#2d8cf0']"
            recommend
            @on-change="getThemeCss('customCss')"
            @on-open-change="colorOpenChange" />
    </div>
</template>

<script>
export default {
    data() {
        return {
            color: "#6f2fc9", 
            defaultColor: "#6f2fc9" //iview原始color
        }
    },
    created() {
        this.getThemeCss("customCss");
    },
    methods: {
        //实现less fade函数
        fade(rgb, opacity) {
            let list = this.formatRgbaList(this.hexToRgba(rgb, opacity));
            list[3] = opacity;
            (opacity+"").substring(0,1)==="0"?list[3]=(opacity+"").substring(1):'';
            return `${list.join()}`
        },
        //实现less tint函数
        tint(rgb, opacity) {
            let list = this.formatRgbaList(this.hexToRgba(rgb, opacity));
            for (let i = 0; i < 3; i++) {
                list[i] = Math.ceil(list[i] + (255 * opacity) - (list[i] * opacity));
            }
            return this.rgbaToHex(`rgb(${list.join()})`)
        },
        //实现less shade函数
        shade(rgb, opacity) {
            let list = this.formatRgbaList(this.hexToRgba(rgb, opacity));
            for (let i = 0; i < 3; i++) {
                list[i] = Math.ceil(list[i] - list[i] * opacity);
            }
            return this.rgbaToHex(`rgb(${list.join()})`)
        },
        //将rgba格式化为数组
        formatRgbaList(rgba) {
            let list = rgba.replace('rgba(', '').replace(')', '').split(',');
            list = [...list].map(Number);
            return list;
        },
        //hex转换rgba
        hexToRgba(hex, opacity) {
            return 'rgba(' + parseInt('0x' + hex.slice(1, 3)) + ',' + parseInt('0x' + hex.slice(3, 5)) + ',' +
                parseInt('0x' + hex.slice(5, 7)) + ',' + opacity + ')';
        },
        //rgba转换hex
        rgbaToHex(rgba) {
            var bg = rgba.match(/^rgb\((\d+),\s*(\d+),\s*(\d+),\s*(\d?(\d|(\.[0-9]{1,2})))\)$/);

            function hex(x) {
                return ("0" + parseInt(x).toString(16)).slice(-2);
            }
            return ("#" + hex(bg[1]) + hex(bg[2]) + hex(bg[3])).toUpperCase();
        },
        //获取主题css
        getThemeCss(id) {
            if (!this.color) return;
            this.$axios.get('/iview.css').then(res => {
                let defaultColor = this.;
                let cssReg = new RegExp(defaultColor, 'gi');
                let tintReg = new RegExp(this.tint(defaultColor, .2), 'gi');
                let shadeReg = new RegExp(this.shade(defaultColor, .05), 'gi');
                let fadeReg = new RegExp("rgba\\("+this.fade(defaultColor, .9)+"\\)", 'gi');
                res = res.replace(cssReg, this.color);
                res = res.replace(tintReg, this.tint(this.color, .2));
                res = res.replace(shadeReg, this.shade(this.color, .05));
                res = res.replace(fadeReg, "rgba("+this.fade(this.color, .9)+")");
                let styleTag = document.getElementById(id);
                if (!styleTag) {
                    styleTag = document.createElement('style');
                    styleTag.setAttribute('id', id);
                    document.head.insertBefore(styleTag, document.head.querySelector('#iviewCss'));
                }
                styleTag.innerText = res;
            })
        },
        colorOpenChange(val) {
            val && this.color === "" ? this.color = "#6f2fc9" : '';
        }
    }
}
</script>

思路 :

Responses