如何在特定卡片上制作悬停效果并停止在剩余卡片上悬停?

Posted

技术标签:

【中文标题】如何在特定卡片上制作悬停效果并停止在剩余卡片上悬停?【英文标题】:How to make a hover effect on a particular card and stops hovering on remaining cards? 【发布时间】:2021-08-31 22:49:39 【问题描述】:

如果我将鼠标悬停在一张卡片上,它会显示每张卡片的图标,但我想在特定的悬停卡片上显示图标(我卡片的输出-image)。这些卡片是通过使用 v-for 和从 axios 包中获取数据,DisplayNotes.vue 文件的职责是向用户显示卡片中的笔记,请帮我解决这个问题。`

[DisplayNotes.vue]

<template>
<div class="main-section">
    <div v-for="note in notes" :key="note.data" class="container">
        <div class="card-content">
            <h5>note.title</h5>
            <p><i>note.body</i></p>
        </div>
        <div @mouseover="hover=true" @mouseleave="hover=false" class="import-icons">
            <icons v-if="hover" />
            <button type="button" @click="handlesubmit()">close</button>
        </div>
    </div>
</div>
</template>
<script>
import service from '../service/User'
import icons from './icons'
export default 
    components: 
        icons
    ,
    data() 
        return 
            hover: false,
            notes: [
                id: 1,
                title: 'Fundoo',
                body: 'unlimited Notes...'
            , ],
        
    ,
    methods: 
        async handlesubmit() 
           const response = await axios.get('/displayNotes', );
            localStorage.getItem('token', response.data.token);
           this.notes.push(response.data);
        ,
    

</script>
<style lang="scss">

.card-content 
    input 
        border: none;
    
    textarea 
        border: none;
        outline: none;
    

/* dividing the width percentage */
.container 
    height: 200px;
    width: 25%;
    float:left;
    margin: -2.98%; 
    margin-left:20%;
    margin-top: 5%;
    border-style: ridge;

.import-icons 
    display: block;
    margin-left: -2%;
    padding-top: 25%;

    button 
        border: none;
        background: none;
        float: right;
        font-weight: 600;
        font-family: Arial, Helvetica, sans-serif;
        margin-top: -2%;
        padding-left: 400px;
    


</style>

[icons.vue]

<template>
<div class="used-icons">
    <i id="first-icon" class="fas fa-bell"></i>
    <i id="second-icon" class="fas fa-user"></i>
    <i id="third-icon" class="fas fa-palette"></i>
    <i id="forth-icon" class="fas fa-archive"></i>
    <!-- <i id="fifth-icon" class="fas fa-ellipsis-v"></i> -->
</div>
</template>

<style scoped>
#first-icon 
    opacity: 0.9;


#second-icon 
    padding-left: 30px;
    padding-right: 30px;
    opacity: 0.9;


#third-icon 
    opacity: 0.9;


#forth-icon 
    padding-left: 30px;
    padding-right: 30px;
    opacity: 0.9;


#fifth-icon 
    padding-right: 195px;
    opacity: 0.9;

</style>

【问题讨论】:

【参考方案1】:

所有项目都有条件地呈现在同一个hover 属性上,因此只要该属性为真(当项目悬停时),所有项目都会显示,而不仅仅是悬停的项目。

解决此问题的一种方法是将hover 添加到每个notes[] 数组元素,并使用它来有条件地渲染它们:

<div v-for="note in notes">
  <div @mouseover="note.hover=true" @mouseleave="note.hover=false">
    <icons v-if="note.hover" />
  </div>
</div>
export default 
  data() 
    return 
      // hover: false, // remove this
      notes: [
        
          id: 1,
          title: 'Fundoo',
          body: 'unlimited Notes...',
          hover: false, // add this
        ,
        
          id: 2,
          title: 'Fundoo',
          body: 'unlimited Notes...'
          hover: false, // add this
        ,
      ],
    
  ,

hover 属性添加到handlesubmit() 中的新notes[] 数组元素:

export default 
  methods: 
    async handlesubmit() 
      //...
      this.notes.push(
        ...response.data,
        hover: false,
      )
    
  

【讨论】:

【参考方案2】:

您只需要 CSS 就可以做到这一点,不需要 javascript

note 类添加到笔记容器,将note-icons 添加到图标元素。

然后通过一些简单的 css 我们可以有条件地在悬停时显示note-icons

.note-icons 
  visibility: hidden;


.note:hover .note-icons
  visibility: visible;

完整片段

<template>
<div class="main-section">
    <div v-for="note in notes" :key="note.data" class="container note"> <!-- ⭐️ -->
        <div class="card-content">
            <h5>note.title</h5>
            <p><i>note.body</i></p>
        </div>
        <div class="import-icons">
            <icons class="note-icons"/> <!-- ⭐️ -->
            <button type="button" @click="handlesubmit()">close</button>
        </div>
    </div>
</div>
</template>
<script>
import service from '../service/User'
import icons from './icons'
export default 
    components: 
        icons
    ,
    data() 
        return 
            hover: false,
            notes: [
                id: 1,
                title: 'Fundoo',
                body: 'unlimited Notes...'
            , ],
        
    ,
    methods: 
        async handlesubmit() 
           const response = await axios.get('/displayNotes', );
            localStorage.getItem('token', response.data.token);
           this.notes.push(response.data);
        ,
    

</script>
<style lang="scss">

.card-content 
    input 
        border: none;
    
    textarea 
        border: none;
        outline: none;
    

/* dividing the width percentage */
.container 
    height: 200px;
    width: 25%;
    float:left;
    margin: -2.98%; 
    margin-left:20%;
    margin-top: 5%;
    border-style: ridge;

.import-icons 
    display: block;
    margin-left: -2%;
    padding-top: 25%;

    button 
        border: none;
        background: none;
        float: right;
        font-weight: 600;
        font-family: Arial, Helvetica, sans-serif;
        margin-top: -2%;
        padding-left: 400px;
    


.note-icons  /* ⭐️ */
  visibility: hidden;


.note:hover .note-icons  /* ⭐️ */
  visibility: visible;

</style>

【讨论】:

【参考方案3】:

根据您的实现,我认为您将“悬停”属性添加到每张卡片,然后在事件处理程序中对其进行操作。

<template>
  <div class="main-section">
    <div v-for="(note, index) in notes" :key="note.data" class="container">
        <div class="card-content">
            <h5>note.title</h5>
            <p><i>note.body</i></p>
        </div>
        <div @mouseover="note[index].hover=true" @mouseleave="note[index].hover = false" class="import-icons">
            <icons v-if="hover" />
            <button type="button" @click="handlesubmit()">close</button>
        </div>
    </div>
  </div>
</template>
<script>

export default 
    data() 
        return 
            hover: false,
            notes: [
                id: 1,
                title: 'Fundoo',
                body: 'unlimited Notes...',
                hover: false
            , ],
        
    ,
    methods: 
        async handlesubmit() 
           const response = await axios.get('/displayNotes', );
            localStorage.getItem('token', response.data.token);
           this.notes.push(response.data);
        ,
    

</script>

【讨论】:

以上是关于如何在特定卡片上制作悬停效果并停止在剩余卡片上悬停?的主要内容,如果未能解决你的问题,请参考以下文章

如何在材质 ui 卡中悬停时更改文本颜色?我想更改卡片悬停时的文本颜色而不是悬停在文本上?

202.CSS 3D 卡片悬停效果

手机上的剩余悬停效果

具有变换比例 CSS 属性的卡片块在悬停时失去其边界半径

悬停时的 CSS 变换和框阴影

如何在悬停时保持 Bootstrap 弹出框活着?