Vue.js带有变量的动态<style>

Dom*_*ski 18 css vue.js vuejs2

是否可以在样式中添加动态变量?

我的意思是:

<style>
 .class_name{
  background-image({{project.background}});
 }
@media all and (-webkit-min-device-pixel-ratio : 1.5),
 all and (-o-min-device-pixel-ratio: 3/2),
 all and (min--moz-device-pixel-ratio: 1.5),
 all and (min-device-pixel-ratio: 1.5) {
 .class_name{
  background-image({{project.background_retina}});
 } 
}
</style>
Run Code Online (Sandbox Code Playgroud)

Nam*_*ysh 81

使用Vue.js 3.2,你可以像这样执行状态驱动的动态 CSS

<template>
    <h1 id="script">Script</h1>
    <h1 id="scriptSetup">Script setup</h1>
</template>

<script>
  export default {
    data() {
      return {
        colorFromScript: 'red'
      }
    }
  }
</script>

<script setup>
const colorFromScriptSetup = 'green'
</script>

<style>
  #script {
      color: v-bind('colorFromScript')
  }

  #scriptSetup {
      color: v-bind('colorFromScriptSetup')
  }
</style>
Run Code Online (Sandbox Code Playgroud)

请参阅此处的实现

CSS 文档中的 v-bind

  • 对于使用“Vue 3”的人来说,这是最好的解决方案。 (12认同)

小智 13

包含动态样式的最佳方法是使用CSS变量。为了避免使用内联样式,同时获得动态样式的好处(或必要性,例如,数据有效负载中的用户定义的颜色),请在样式<style>内使用标签<template>(以便Vue可以插入值)。使用:root伪类包含变量,以便可以在应用程序的CSS范围内访问它们。

请注意,某些CSS值(例如url()无法插值),因此它们必须是完整的变量。

实施例(Nuxt .vueES6 / ES2015语法):

<template>

<div>
  <style>
    :root {
      --accent-color: {{ accentColor }};
      --hero-image: url('{{ heroImage }}');
    }
  </style>
  <div class="punchy">
    <h1>Pow.</h1>
  </div>
</div>

</template>
<script>

export default {
  data() { return {
    accentColor: '#f00',
    heroImage: 'https://vuejs.org/images/logo.png',
  }},
}

</script>
<style>

.punchy {
  background-image: var(--hero-image);
  border: 4px solid var(--accent-color);
  display: inline-block;
  width: 250px; height: 250px;
}
h1 {
  color: var(--accent-color);
}

</style>
Run Code Online (Sandbox Code Playgroud)

还在Codepen上创建了另一个更复杂的可运行示例。

  • 使用&lt;Templates&gt;在组件中尝试了解决方案,并出现以下错误:模板仅应负责将状态映射到UI。避免在模板中放置带有副作用的标签,例如&lt;style&gt;,因为它们不会被解析。 (14认同)
  • 这是正确的想法,但正如 Nelly 指出的那样,Vue 会发出警告,甚至可能无法加载,具体取决于使用的版本(缩小的 Vue 似乎允许这样做)。请参阅 Muthu 的答案(特别是他们的更新部分)或 [this SO 答案](/sf/answers/3659612771/) 以获得更好的解决方案 (6认同)
  • 我和妮莉有同样的问题 (2认同)

Nik*_*aut 9

当您使用 vuejs 时,请使用 vuejs 来更改背景而不是 css

var vm = new Vue({
  el: '#vue-instance',
  data: {
    rows: [
      {value: 'green'},
      {value: 'red'},
      {value: 'blue'},
    ],
    item:""
  },
  methods:{
  	  onTimeSlotClick: function(item){
         console.log(item);
      	document.querySelector(".dynamic").style.background = item;
      }

  }
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.16/vue.js"></script>
<div id="vue-instance">
   <select class="form-control" v-model="item" v-on:change="onTimeSlotClick(item)">
         <option value="">Select</option>
        <option v-for="row in rows">
          {{row.value}}
        </option>
      </select>
      <div class='dynamic'>VALUE</div>
      <br/><br/>
      <div :style="{ background: item}">Another</div>
</div>
Run Code Online (Sandbox Code Playgroud)


Seb*_*ian 9

是的,这是可能的。Vue.js 不支持style模板中的标签,但您可以通过使用标签来解决这个问题component。未经测试的伪代码:

在您的模板中:

<component type="style" v-html="style"></component>
Run Code Online (Sandbox Code Playgroud)

在你的脚本中:

props: {
    color: String
}
computed: {
    style() {
        return `.myJSGeneratedStyle { color: ${this.color} }`;
    }
}
Run Code Online (Sandbox Code Playgroud)

有很多原因导致您不应该使用此方法。这绝对是hacky,并且:style=""在大多数情况下可能更好,但对于您的媒体查询问题,我认为这是一个很好的解决方案。


Mut*_*ran 8

CSS<style>是静态的。我不认为你可以这样做......你可能不得不寻找不同的方法。

您可以尝试使用CSS 变量。例如,(下面的代码未经测试)

<template>
  <div class="class_name" :style="{'--bkgImage': 'url(' + project.background + ')', '--bkgImageMobile': 'url(' + project.backgroundRetina + ')'}">
  </div>
</template>

<style>
  .class_name{
      background-image: var(--bkgImage);
  }
  @media all and (-webkit-min-device-pixel-ratio : 1.5),
     all and (-o-min-device-pixel-ratio: 3/2),
     all and (min--moz-device-pixel-ratio: 1.5),
     all and (min-device-pixel-ratio: 1.5) {
        .class_name{
            background-image: var(--bkgImageMobile);
        } 
  }
</style>
Run Code Online (Sandbox Code Playgroud)

注意:只有最新的浏览器支持CSS Variables.

更新:

如果您仍然看到:style模板中的任何问题,请尝试此操作,

<div :style="'--bkgImage: url(' + project.background + '); --bkgImageMobile: url(' + project.backgroundRetina + ')'">
</div>
Run Code Online (Sandbox Code Playgroud)


小智 7

我遇到了同样的问题。我一直在尝试使用数据库中的背景色值。我找到了一个很好的解决方案,可以在我从数据库中设置的内联CSS上添加背景色值。

<img  :src="/Imagesource.jpg" alt="" :style="{'background-color':Your_Variable_Name}">
Run Code Online (Sandbox Code Playgroud)

  • 如果您不想将其括在额外的一对引号中,您也可以用蛇形写法编写``background-color```。它看起来很整洁并且节省时间 ```:style="{backgroundColor:Your_Variable_Name}"``` (5认同)
  • 如果您使用 lib,则这不起作用。我需要 apply 将样式应用于子组件的子组件。 (3认同)
  • @MuhammadNaufil不是snake_case而是camelCase,除了那个好建议:) (3认同)

Fle*_*ipp 6

Vue 3 状态驱动的动态 CSS 变量

我知道这有点晚了,并且正在使用 Vue.js 2,但截至目前,在 Vue.js 3 中您可以创建状态驱动的 CSS 变量。

您现在可以在样式标签内使用 SFC(单文件组件)状态数据,使用v-bind().

您可以在此处阅读有关状态驱动 CSS 变量的更多信息,或在此处阅读 Vue.js 3 文档。

这是一个代码示例

例子

<template>
  <div>
    <input type="text" v-model="color" />
    <div class="user-input-color">
      {{ color }}
    </div>
  </div>
</template>

<script>
export default {
  data: () => ({
    color: 'white'
  })
}
</script>

<style scoped>
.user-input-color {
  background-color: v-bind(color)
}
</style>
Run Code Online (Sandbox Code Playgroud)

这是现场示例的链接。

链接


Joh*_*anu 5

您可以使用 Vue.js 提供的组件标签。

<template>
  <component :is="`style`">
    .cg {color: {{color}};}
  </component>
  <p class="cg">I am green</p> <br/>
  <button @click="change">change</button>
</template>
<script>
  export default {
    data(){
      return { color: 'green' }
    },
    methods: {
      change() {this.color = 'red';}
    }
  }
</script>
Run Code Online (Sandbox Code Playgroud)