鼠标悬停或悬停vue.js


104

将鼠标悬停在vue.js中的元素上时,我想显示一个div。但是我似乎无法正常工作。

似乎vue.js中没有悬停或鼠标悬停的事件。这是真的吗?

是否可以结合使用jquery悬停和vue方法?


2
v-on指令也可用于“悬停”事件。如果您将所写的代码添加到问题中,我们可能会帮助您使其正常工作。是的,Vue简单小巧,旨在与jQuery之类的其他软件包集成。
David K. Hess 2015年

Answers:


93

这是我认为您要的工作示例。

http://jsfiddle.net/1cekfnqw/3017/

 <div id="demo">
        <div v-show="active">Show</div>
        <div @mouseover="mouseOver">Hover over me!</div>
    </div>

var demo = new Vue({
    el: '#demo',
    data: {
        active: false
    },
    methods: {
        mouseOver: function(){
            this.active = !this.active;   
        }
    }
});

26
不适用于最新的vue版本。@CYB尝试编辑您的答案,v-on:mouseover="mouseOver"但没有提及语法在哪个版本的vue中更改了
Aprillion '16

2
@NICO具有比我的更好的解决方案,并且可以使用当前版本(在本文发布时为1.0.26)。请参考他的答案。谢谢。
贾罗德

1
我想删除这个,因为我刚刚说过,@ NICO的帖子比我的要好,并且是最新的。请给NICO这个正确答案,我将删除我的。谢谢!
Jarrod

2
这个例子坏了吗?
user3743266

3
我认为最好用 @mouseover:mouseover
空手

176

我觉得上述悬停逻辑不正确。当鼠标悬停时,它只是反过来。我用下面的代码。它似乎工作正常。

<div @mouseover="upHere = true" @mouseleave="upHere = false" >
    <h2> Something Something </h2>
    <some-component v-show="upHere"></some-component>
</div>

在vue实例上

data : {
    upHere : false
}

希望有帮助


15
这应该是公认的答案!接受且最受好评的答案的确会导致闪烁。@ mouseover-div上光标的每一次移动都会反转当前状态...
Stefan Medack 17/09/12

如果显示的是像气泡一样的隐藏div,则鼠标悬停时会闪烁。只需将同样出色的mouseover / mouseleave代码添加到隐藏的div中即可。
mcmacerson

为我工作,使用webpack只需更改您的数据即可:data: () => ({ upHere: false })
Emile Cantero '18年

77

这里不需要方法。

的HTML

<div v-if="active">
    <h2>Hello World!</h2>
 </div>

 <div v-on:mouseover="active = !active">
    <h1>Hover me!</h1>
 </div>

JS

new Vue({
  el: 'body',
  data: {
    active: false
  }
})

10
您可以使用v-on:mouseover或快捷@mouseover%的文档vuejs.org/guide/syntax.html#v-on-Shorthand
NU珠峰

1
您可以onv-on:或替换@任何html事件属性。w3schools.com/tags/ref_eventattributes.asp
珠穆朗玛峰

有什么问题?这是可行的,应标记为正确答案。
NICO

Vue 2.2.0不喜欢这样-发出警告“ [Vue警告]:请勿将Vue安装到<html>或<body>-请安装到普通元素。”
Dima Fomin

为了简单起见,我将<body>设为vue实例。当然,您不应该在实际的应用程序中这样做。
NICO

25

要显示子元素或同级元素,只能使用CSS。如果使用:hover组合程序之前(+~>space)。然后,样式不适用于悬停的元素。

的HTML

<body>
  <div class="trigger">
    Hover here.
  </div>
  <div class="hidden">
    This message shows up.
  </div>
</body>

的CSS

.hidden { display: none; }
.trigger:hover + .hidden { display: inline; }

1
发问者专门询问vue.js。由于它允许javascript轻松绑定到mouseover事件。
珠穆朗玛峰,2016年

5
我正在使用Vue,这对我来说是最好的解决方案。我有一个嵌套列表,其中的按钮只应显示在悬停上,而使用额外的变量来跟踪悬停状态是过大的。CSS更加优雅。谢谢qsc!
david_nash

13

使用mouseovermouseleave事件,您可以定义一个切换功能,该功能实现此逻辑并对渲染中的值做出反应。

检查此示例:

var vm = new Vue({
	el: '#app',
	data: {btn: 'primary'}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">


<div id='app'>
    <button
        @mouseover="btn='warning'"
        @mouseleave="btn='primary'"
        :class='"btn btn-block btn-"+btn'>
        {{ btn }}
    </button>
</div>


如果像这样动态构建它们,则css后处理器(例如purgecss)将无法拾取您的类。更好:@mouseover="btn-color='btn-warning' @mouseleave="btn-color='btn-primary' :class="btn btn-block { btn-color}"
Erich

7

随着mouseover只是停留元素时可见叶鼠标悬停元素,所以我加了这一点:

@mouseover="active = !active" @mouseout="active = !active"

<script>
export default {
  data(){
   return {
     active: false
   }
 }
</script>

6

可以严格在组件的模板内切换悬停类,但是,出于明显的原因,这不是实际的解决方案。另一方面,对于原型制作,我发现不必在脚本中定义数据属性或事件处理程序很有用。

这是如何使用Vuetify尝试图标颜色的示例。

new Vue({
  el: '#app'
})
<link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/vuetify/dist/vuetify.min.css" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuetify/dist/vuetify.js"></script>

<div id="app">
  <v-app>
    <v-toolbar color="black" dark>
      <v-toolbar-items>
        <v-btn icon>
          <v-icon @mouseenter="e => e.target.classList.toggle('pink--text')" @mouseleave="e => e.target.classList.toggle('pink--text')">delete</v-icon>
        </v-btn>
        <v-btn icon>
          <v-icon @mouseenter="e => e.target.classList.toggle('blue--text')" @mouseleave="e => e.target.classList.toggle('blue--text')">launch</v-icon>
        </v-btn>
        <v-btn icon>
          <v-icon @mouseenter="e => e.target.classList.toggle('green--text')" @mouseleave="e => e.target.classList.toggle('green--text')">check</v-icon>
        </v-btn>
      </v-toolbar-items>
    </v-toolbar>
  </v-app>
</div>


2

我想到了同样的问题,然后解决了!

        <img :src='book.images.small' v-on:mouseenter="hoverImg">



1

虽然我会使用新的composition api进行更新。

零件

<template>
  <div @mouseenter="hovering = true" @mouseleave="hovering = false">
    {{ hovering }}
  </div>
</template>

<script lang="ts">
  import { ref } from '@vue/compsosition-api'

  export default {
    setup() {
      const hoverRef = ref(false)
      return { hovering }
    }
  })
</script>

可重复使用的合成功能

创建useHover函数将允许您在任何组件中重用。

export function useHover(target: Ref<HTMLElement | null>) {
  const hovering = ref(false)

  const enterHandler = () => (hovering.value = true)
  const leaveHandler = () => (hovering.value = false)

  onMounted(() => {
    if (!target.value) return
    target.value.addEventListener('mouseenter', enterHandler)
    target.value.addEventListener('mouseleave', leaveHandler)
  })

  onUnmounted(() => {
    if (!target.value) return
    target.value.removeEventListener('mouseenter', enterHandler)
    target.value.removeEventListener('mouseleave', leaveHandler)
  })

  return hovering
}

这是一个在Vue组件内调用函数的简单示例。

<template>
  <div ref="hoverRef">
    {{ hovering }}
  </div>
</template>

<script lang="ts">
  import { ref } from '@vue/compsosition-api'
  import { useHover } from './useHover'

  export default {
    setup() {
      const hoverRef = ref(null)
      const hovering = useHover(hoverRef)
      return { hovering, hoverRef }
    }
  })
</script>

您还可以使用诸如之类的库,@vuehooks/core其中包含许多有用的功能,包括useHover


0

这是MouseOver和MouseOut的非常简单的示例:

<div id="app">
   <div :style = "styleobj" @mouseover = "changebgcolor" @mouseout = "originalcolor"> 
   </div>
</div>

new Vue({
  el:"#app",
  data:{
     styleobj : {
       width:"100px",
       height:"100px",
       backgroundColor:"red"
     }
  },
  methods:{
    changebgcolor : function() {
      this.styleobj.backgroundColor = "green";
    },
    originalcolor : function() {
      this.styleobj.backgroundColor = "red";
    }
  }
});

0

如果您不满意这段代码的外观,请查看vue-mouseover软件包:

<div
    @mouseover="isMouseover = true"
    @mouseleave="isMouseover = false"
/>

vue-mouseover提供了一个v-mouseover指令,当光标进入或离开该指令所附加的HTML元素时,该指令会自动更新指定的数据上下文属性。

默认情况下,下一个示例isMouseover属性将是true光标在HTML元素上时的属性,false否则:

<div v-mouseover="isMouseover" />

同样,默认情况下,当附加到元素时isMouseover会默认分配初始值,因此在第一个/ 之前不会保持未分配状态v-mouseoverdivmouseentermouseleave事件。

您可以通过指令指定自定义值v-mouseover-value

<div
    v-mouseover="isMouseover"
    v-mouseover-value="customMouseenterValue"/>

要么

<div
    v-mouseover="isMouseover"
    v-mouseover-value="{
        mouseenter: customMouseenterValue,
        mouseleave: customMouseleaveValue
    }"
/>

可以在安装过程中通过options对象自定义默认值传递给软件包。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.