CSS的var()函数用法与JS获取css函数变量值的方法

2023-09-21 16:29:42

项目场景

        我们常在项目里见到这种写法。

<template>
  <div
    id="dashboardLayout"
    :style="styleCSSVariable"
  ></div>
</template>

    可以看到,根元素这里使用了一个名为styleCSSVariable的CSS集。这里的实现是:

get styleCSSVariable() {
    return createDashboardCSS(this.dashboard.setting.style);
}

        这里可以根据当前仪表盘的用户设置风格(如“暗黑”、“科技”、“酷炫”)进行css样式管理。return了诸如这些设置:

 return {
    // 文字颜色
    '--font': '#cccccc',
    '--font-sub': '#999999',
    '--font-info': '#666666',
    // 辅助文字
    '--font-color-secondary': '#aaaaaa',
    // 提示性文字
    '--font-color-info': '#ff2d2d',
    '--font-active-light': '#ffffff',

    // 删除按钮/文字
    '--delete': '#fe5959',
    // 警示色
    '--warning': '#ff9900',
    // 操作成功
    '--success': '#19be6b'
    ....
}

        可以看到设计器的元素style样式上绑定了一堆颜色定义。这其实就是CSS中的var()函数用法。

CSS变量

        CSS变量(var)是CSS3新增加的一项功能,它可以让我们在样式表中定义一个变量,然后在样式表中的其他地方使用这个变量,从而实现样式的复用。

        CSS 变量可以访问 DOM,这意味着您可以创建具有局部或全局范围的变量,使用 JavaScript 来修改变量,以及基于媒体查询来修改变量。

Var()函数

var(name)

     background-color: var(--font-active);

        var() 函数用于获取插入 CSS 变量的值。当然你也可以用var(name,val),val为获取不到var(name)时返回的默认值

全局变量

        写在HTML文档的根元素上面的,我们用伪类选择器来:root获取。

        在每个HTML文档中,只有一个根元素,通常是标签。

<!DOCTYPE html>
<html />
<head />
<style>
    :root {
      --blue: #1e90ff;
      --white: #ffffff; 
    }
</style>

局部变量

        如项目中的例子,你可以选择一个容器元素进行注入

<style>
    #dashboardLayout {
      --blue: #1e90ff;
      --white: #ffffff; 
    }
</style>

        或者像刚才案例通过JS或Vue进行注入,只要绑定到它的style上就行。

        局部变量只能在容器内部里获取到css变量值,而全局则是整个页面里的元素都能获取。

JS里获取CSS绑定的CSS变量值

        需要借助Window.getComputedStyle方法返回制定元素的CSS熟悉对象

<html lang="en">
<body>
    <div class="own" id="own">

    </div>
</body>
</html>
<style>
    .own {
        --ownColor: '#fffff';
        font-size: 16;
    }
</style>
<script>
    let elem1 = document.getElementById("own");
    var valObj = window.getComputedStyle(elem1);
    console.log(valObj)
    console.log(valObj['ownColor'])
    console.log(valObj.getPropertyValue('--ownColor'))
</script>

         注意,传入getComputedStyle是确切的元素对象。返回的style是一个实时的 CSSStyleDeclaration 对象,当元素的样式更改时,它会自动更新本身。

        那么可以看到这个对象是一个类数组对象。假如我们心急地直接用valObj['ownColor']来获取css变量值,那么返回的肯定是undefined。此时需要借助另外一个函数

CSSStyleDeclaration.getPropertyValue() 接口返回一个 DOMString ,其中包含请求的 CSS 属性的值

         如果在Vue+ts的环境里,我们应该如何优雅书写这个方法?

const skinColor = getSkin('--font-sub');
/**
 * 获取全局颜色
 * @param {*} key
 * @returns
 */
export function getSkin(key) {
  // 找到根部容器或局部容器
  const dom = document.querySelector('#dashboardLayout');
  return getComputedStyle(
    // 顶部容器不存在,则选择网页文档根元素
    dom ? dom : document.documentElement,
  ).getPropertyValue(key);
}
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/getComputedStyle) */
declare function getComputedStyle(elt: Element, pseudoElt?: string | null): CSSStyleDeclaration;

declare var CSSStyleDeclaration: {
    prototype: CSSStyleDeclaration;
    new(): CSSStyleDeclaration;
};

更多推荐

用微服务平台框架,实现高效的流程化办公!

想要实现流程化办公,可以用什么样的软件平台实现?随着市场竞争越来越激烈,很多企业会采用低代码技术平台实现高效管理企业的内部资源,从而减少很多繁琐工作和时间,实现提质增效的目的。流辰信息助力大家采用微服务平台框架低代码技术平台打破信息孤岛,创造高效办公。低代码的便捷性和灵活性就不言而喻了,它在企业的发展过程中扮演了非常重

K8S-存储卷,pv,pvc

pv,pvc一、emptyDir存储卷1.概述2.示例二、hostPath存储卷1.概述三、nfs共享存储卷1.在stor01节点上安装nfs,并配置nfs服务2.master节点操作3.在nfs服务器上创建index.html4.master节点操作四、PVC和PV1.概述2.PV和PVC之间的相互作用遵循的生命周期

Java高级: 反射

目录反射反射概述反射获取类的字节码反射获取类的构造器反射获取构造器的作用反射获取成员变量&使用反射获取成员方法反射获取成员方法的作用反射的应用案例接下来我们学习的反射、动态代理、注解等知识点,在以后开发中极少用到,这些技术都是以后学习框架、或者做框架的底层源码。讲这些技术的目的,是为了以后我们理解框架、或者自己开发框架

网络安全(黑客)自学

前言我是去年8月22日才正式学习网络安全的,因为在国营单位工作了4年,在广东一个月工资只有5000块,而且看不到任何晋升的希望,如果想要往上走,那背后就一定要有关系才行。而且国营单位的气氛是你干的多了,领导觉得你有野心,你干的不多,领导却觉得你这个人不错。我才24周岁,实在的受不了这种工作氛围,情绪已经压制了很多久,一

网络安全中的欺骗攻击与防御技术

在Internet上计算机之间相互进行的交流建立在两个前提之下:认证、信任。认证是网络上的计算机用于相互间进行识别的一种鉴别过程,经过认证的过程,获准相互交流的计算机之间就会建立起相互信任的关系。信任和认证具有逆反关系,即如果计算机之间存在高度的信任关系,则交流时就不会要求严格的认证。而反之,如果计算机之间没有很好的信

阿里云无影云电脑、VDI以及传统PC电脑有什么区别?

阿里云无影云电脑和传统电脑PC有什么区别?区别大了,无影云电脑是云端的桌面服务,传统PC是本地的硬件计算机,无影云电脑的数据是保存在云端,本地传统PC的数据是保存在本地客户端,阿里云百科分享阿里云无影云电脑和传统PC电脑的详细区别对比:目录无影云电脑和传统电脑区别对比阿里云无影云电脑无影云电脑和传统电脑区别对比阿里云无

webpack打包速度优化

优化WebPack打包速度在开发过程中,WebPack的打包速度是一个非常重要的考虑因素。随着项目规模的增长,打包时间也会越来越长,影响开发效率和用户体验。本文将循序渐进地介绍一些优化WebPack打包速度的方法,先分析打包瓶颈,然后逐步优化。分析打包瓶颈在开始优化之前,我们需要了解当前项目的打包瓶颈在哪里。为了帮助我

Java集成支付宝沙箱支付,详细教程(SpringBoot完整版)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、开发前准备?二、使用步骤1、引入库2、配置在application.yml里面进行配置:3、alipay的java配置:AplipayConfig.java4、支付接口4、回调接口一、开发前准备?easy支付官方文档:https://opend

Ubuntu下 Docker、Docker Compose 的安装教程

Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。DockerCompose是用于定义和运行多容器docker应用程序的工具,compose通过一个配置文件来管理多个do

微信小程序python+nodejs+php+springboot+vue 健身教练私教预约系统

管理员的主要功能有:1.管理员输入账户登陆后台2.个人中心:管理员修改密码和账户信息3.用户管理:对注册的用户信息进行删除,查询4.教练管理:对教练信息进行添加,修改,删除,查询5.教练简介管理:对教练的简介信息进行查询,删除6.在线预约信息:用户对教练的预约信息进行查询,删除7.健身指南管理:对用户查看的健身指南信息

Nginx之防盗链及高可用解读

目录防盗链解读盗链是什么?Nginx中配置防盗链高可用解读KeepalivedNginx中配置高可用防盗链解读盗链是什么?网页的加载顺序是先加载HTML相关的内容,然后解析HTML的内容,那些需要加载图片,那些需要加载文件,是逐步加载的,对于我们线上的图片等静态资源,经常会被其他网站盗用,外面可以我们请求到一个页面后,

热文推荐