我需要将CSS hover与VueJS v-bind:style指令一起使用,但找不到相关信息.

我需要为hover but v-bind:style.hover={}绑定样式

有没有其他方法可以使用VueJS在鼠标悬停或CSS悬停时绑定样式?

这是我的密码

这就是目标:

button: {
    colorBackd: '#1e2021',
    colorBackdHover: '#000000',
    text: 'Results',
    color: '#d3e0ff',
    colorHover: "#ffffff",
    borderColor: '#d3e0ff',
    borderColorHover: "#ffffff"
},

下面是需要与样式绑定的html元素

<button type="button"
    :style="{
    color:button.color,
        backgroundColor:button.colorBackd,
        borderColor:button.borderColor,
    }"
    class="btn btn-outline-info large-button">

        {{ button.text }}

</button>

谢谢

推荐答案

改进的解决方案:使用CSS自定义属性和变量

如果你只想使用modern/evergreen浏览器,那么使用CSS自定义属性和变量就是最好的 Select !实际上,您可以将CSS自定义属性传递到:style绑定中,例如.

computed: {
  styleObject: function() {
    return {
      '--color': this.button.color,
      '--color-hover': this.button.colorHover
    }
  }
}

在模板中:

<custom-button :style="styleObject" />

对于CSS,这只是一个问题:

button {
  color: var(--color);
}

button:hover {
  color: var(--color-hover);
}

这种方法的优点是,您可以定义CSS自定义属性的范围,因此当您在元素级别(而不是在:root中)定义CSS属性时,这些变量将仅应用于特定的按钮组件.

唯一的缺点是,您必须在悬停和未悬停状态下迭代声明所有变量,这可能有点麻烦.然而,与使用CSS变量的好处相比,我认为这是一个非常小的缺点.

见下面的概念证明:

var customButton = Vue.component('custom-button', {
  template: '#custom-button',
  data() {
    return {
      button: {
        colorBackd: '#1e2021',
        colorBackdHover: '#000000',
        text: 'Results',
        color: '#d3e0ff',
        colorHover: "#ffffff",
        borderColor: '#d3e0ff',
        borderColorHover: "#ffffff"
      }
    };
  },
  computed: {
    styleObject() {
      return {
        '--button-color': this.button.color,
        '--button-background-color': this.button.colorBackd,
        '--button-border-color': this.button.borderColor,
        
        '--button-color--hover': this.button.colorHover,
        '--button-background-color--hover': this.button.colorBackdHover,
        '--button-border-color': this.button.borderColorHover
      };
    },
  },
});

new Vue({
  el: '#app'
});
button {
  color: var(--button-color);
  background-color: var(--button-background-color);
  border-color: var(--button-border-color);
}

button:hover {
  color: var(--button-color--hover);
  background-color: var(--button-background-color--hover);
  border-color: var(--button-border-color--hover);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.4/vue.min.js"></script>
<div id="app">
  <custom-button></custom-button>
</div>

<script type="text/template" id="custom-button">
  <button type="button" :style="styleObject" class="btn btn-outline-info large-button">
        {{ button.text }}
  </button>
</script>

原始sotluion:使用基于JS的鼠标事件

可以将元素的悬停状态存储在其data(例如hoverState)中.默认设置为false,当@mouseenter触发时切换为true,当@mouseleave触发时切换回false:

然后,您可以简单地将computed property绑定到style属性,例如styleObject.在此styleObject中,您可以根据组件数据中的hoverState返回正确的CSS样式:

var customButton = Vue.component('custom-button', {
  template: '#custom-button',
  data() {
    return {
      button: {
        colorBackd: '#1e2021',
        colorBackdHover: '#000000',
        text: 'Results',
        color: '#d3e0ff',
        colorHover: "#ffffff",
        borderColor: '#d3e0ff',
        borderColorHover: "#ffffff"
      },
      hoverState: false
    };
  },
  computed: {
    styleObject() {
      var modifier = '';
      if (this.hoverState)
        modifier = 'Hover';
        
      return {
        color: this.button['color' + modifier],
        backgroundColor: this.button['colorBackd' + modifier],
        borderColor: this.button['borderColor' + modifier]
      };
    },
  },
  methods: {
    updateHoverState(isHover) {
      this.hoverState = isHover;
    }
  }
});

new Vue({
  el: '#app'
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.4/vue.min.js"></script>
<div id="app">
  <custom-button></custom-button>
</div>

<script type="text/template" id="custom-button">
  <button type="button" :style="styleObject" @mouseenter="updateHoverState(true)" @mouseleave="updateHoverState(false)" class="btn btn-outline-info large-button">
        {{ button.text }}
  </button>
</script>

Vue.js相关问答推荐

在Nuxt项目中混合Scrolltrigger与Lenis

如何使用 Vite 从公共目录导入 JSON 文件?

如何在 vuejs 中导入和使用本地 .csv 文件

两个div元素之间的vue2过渡

Rails Webpacker 还是 Vue-CLI?

Webpack 编译错误:TypeError: __WEBPACK_IMPORTED_MODULE_1__ … is not a function

Vue:根元素内容和内容分发槽

Vue:在表格中显示嵌套数据

使用 aria-live 在 vue.js 中向屏幕阅读器宣布信息

Vuetify 容器不会填充高度

为什么当我 Select 第二个输入框时音译transliteration不起作用?

使用 vue-property-decorator 时注册本地组件

在渲染组件之前从 api 获取数据

v-model 不会检测到 jQuery 触发事件所做的更改

VueRouter 未定义

Select 下拉列表中的复选框后如何清除 v-autocomplete(多个)搜索输入?

无法访问数据对象的嵌套属性

如何使用 JavaScript 按索引删除数组元素?

未在实例上定义,但在渲染期间引用

更改事件上的 Select2 在 Vuejs 中不起作用