我需要将CSS悬停与VueJS v-bind:style指令一起使用,但无法找到有关它的信息。
我需要为悬停绑定样式,但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>
谢谢
答案 0 :(得分:5)
如果您只打算使用现代/常青浏览器,那么使用CSS自定义属性和变量是可行的方法!您实际上可以将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属性时,这些变量将仅应用于您的特定按钮组件。 / p>
唯一的缺点是你必须迭代地声明悬停和未悬停状态中的所有变量,这可能有点麻烦。但是,与使用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'
});
&#13;
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);
}
&#13;
<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>
&#13;
您可以将元素的悬停状态存储在data
中,例如hoverState
。默认情况下设置为false
,并在true
触发时切换为@mouseenter
,并在触发false
时切换回@mouseleave
:
然后,您只需将计算属性绑定到style
属性,例如styleObject
。在此styleObject
中,您可以返回正确的CSS样式,具体取决于在组件数据中找到的hoverState
:
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'
});
&#13;
<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>
&#13;
答案 1 :(得分:5)
其他方式(使用css变量)。
您需要使用样式
创建HTML $(document).ready(function(){
$("#buttonId").click(function(){
// Code goes here
});
});
并将其注入您的组件。
<style>
div[vueid=${_uid}] { --btn-hover: ${`Here your hover brush`} }
</style>
然后只需在静态<template>
<div vueid="_uid">
<button></button>
<div v-html="styleCode"></div>
</div>
</template>
文件中使用此变量即可设置按钮样式。
css
注意:您可以在button:hover { background: var(--btn-hover); }
选择器中描述默认变量值。
答案 2 :(得分:2)
您可以为您的Vuejs组件分配一个ID,并在样式表中应用所需的悬停样式。
<button id="styledButton" type="button"
:style="{
color:button.color,
backgroundColor:button.colorBackd,
borderColor:button.borderColor,
}"
class="btn btn-outline-info large-button">
{{ button.text }}
</button>
然后在标记中
<style>
styledButton:hover {
color: #FFFFFF
};
</style>
如果您希望悬停样式包含任何动态数据。制作一个调用计算属性的标签。
<style>{{computedStyle}}</style>
答案 3 :(得分:0)
如果使用单个文件组件,则只需将按钮样式设置为范围:
<template>
<button></button>
</template>
<style scoped>
button {
/* your button style here */
}
</style>
甚至对于更紧凑的样式,还有一些模块,如下所示:How to correctly use "scoped" styles in VueJS single file components?
答案 4 :(得分:0)
看到在vue中未实现此功能后,我决定使用叠加层,这将对叠加层使用:style相加,将通过更改不透明度来显示。
基本上是:
<div id="test" :style="style">
<div class="overlay" :style="style.hover"></div>
</div>
var testArea = Vue.component('test-area', {
template: '<div id="test" :style="style"><div class="overlay" :style="style.hover"></div></div>',
computed: {
style() {
return {
backgroundColor: '#0f0',
hover: {
backgroundColor: '#f00'
}
};
},
}
});
new Vue({
el: '#app'
});
#test {
position: relative;
width: 100px;
height: 100px;
}
#test>.overlay {
opacity: 0;
}
#test:hover>.overlay {
width: 100%;
height: 100%;
position: absolute;
opacity: 1;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<test-area></test-area>
</div>
答案 5 :(得分:0)
我想更改悬停时的z-index,以便将悬停的p标签显示在顶部。为此,我必须听事件以及一些值。
<template>
...
<p @mouseover="changeZIndex"
@mouseleave="changeZIndexToOriginal({$event,old_z_index})
>
...
</template>
<script>
...methods
changeZIndex(e){
//change to new z-index
e.target.style.zIndex = 5 //to show on top
}
changeZIndexToOriginal(e){
//e.$event is an event which is trirgered. to get event along with some value we have to use this approach
// e.old_z_index is z-index that I want to set back again. I am just using loop index to set z-index
e.$event.target.style.zIndex = e.old_z_index
}
...
</script>
使用上述方法,我们可以更改与目标元素相关的任何内容。
答案 6 :(得分:0)
我发现的一个非常简单的解决方案是改用 v-bind:class
指令:
在我的例子中,当这个元素处于非活动状态时,我需要添加一个悬停:
:class="{'inactive': !item.count}"
在这种情况下,我可以向我的类添加一个非活动属性,然后我可以简单地使用 hover
属性设置该类的样式,如下所示:
.inactive {
color: black;
&:hover {
background-color: green;
}
}