在 Vue.js 中有条件地定位具有 CSS 样式的类

Posted

技术标签:

【中文标题】在 Vue.js 中有条件地定位具有 CSS 样式的类【英文标题】:Conditionally target a class with a CSS style in Vue.js 【发布时间】:2020-01-10 09:38:32 【问题描述】:

这里有几个关于如何有条件地向元素添加类或如何有条件地向元素添加样式的问题,但我想做的是有条件地为类设置样式。

我有一个带有自己的主题系统的应用程序,它允许用户选择自定义的前景色和背景色。然后我想将这些颜色应用于 quill.js 工具栏按钮。如果我提前知道颜色,我可以在我的风格中添加这样的东西。

.ql-toolbar .ql-stroke 
    stroke: #f00;

我什至可以选择在我的容器上抛出一个条件类,并在我的模板中包含多个子样式。

.ql-container.foo 
    .ql-toolbar .ql-stroke 
        stroke: #f00;
    

.ql-container.bar 
    .ql-toolbar .ql-stroke 
        stroke: #b4c;
    

但由于用户可以选择任何 rgb 颜色,我不能这样做。

我也尝试将样式标签写入组件模板,但尝试编译时失败。

现在,为了让事情顺利进行,我只能使用document.querySelector 来访问工具栏并在用户颜色设置更改时更改每个按钮 svg 元素的属性。这是一个丑陋的 hack,它无法处理间歇性样式,例如活动/悬停状态。

有人知道更好的方法吗?

【问题讨论】:

【参考方案1】:

我从this post 学到的答案是使用 CSS 变量,可以通过样式绑定传入。

<template>
   <div class="container" v-bind:style="'--toolbarColor': toolbarColor">
      <!-- quill goes here -->
   </div>
</template>

<style>
    .ql-toolbar 
        background-color: var(--toolbarColor) !important;
    
</style>

<script>
    export default 
        computed: 
            toolbarColor() 
                return '#f00';
            
        
    

</script>

【讨论】:

【参考方案2】:

您可以使用styled-components 实现此目的

或者如果您不想自己设置所有这些,请使用vue-styled-components

const StyledDiv = styled.div`
  flex: 1;
  $props =>
    props.justifyContent &&
    css`
      justify-content: $x => x.justifyContent;
    `;
  $props =>
    props.padd &&
    css`
      padding: 24;
    `;
`;

在 vue 模板中

<styled-div padd justifyContent="flex-start" ></styled-div>

【讨论】:

这只是设置包含组件的样式,它不针对 .ql-stroke

以上是关于在 Vue.js 中有条件地定位具有 CSS 样式的类的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js - 根据文本长度为 textarea 应用 CSS 样式

Vue JS CSS 样式绑定

Vue JS 上基于日期的条件 CSS

Vue 事件&样式样式

CSS 使用条件注释和一个样式表来定位IE

试图让 vue.js 根据 created() 中的方法有条件地渲染某些东西