vue hover事件_基于 Vue 的两层吸顶踩坑总结

前言

近日,在做活动页的过程中遇到两层吸顶的需求,并且要兼容 IE9 及以上的浏览器。乍一看不就是个吸顶嘛,应该不难吧,事实证明还是踩了很多坑才出来。兼容性问题多到吐血,我太难了。废话不多说,先看一下两层吸顶的最终实现效果,如下图所示。

36fd2fed8c297c1d2947b945aeef64c7.gif

功能点:两层吸顶,因为 Tabs 区域比较长所以在滚动过程中点击一层 Tabs 会回弹至一层吸顶刚吸顶的位置,这个功能点和锚点有些类似。二层 Tabs 通过 hover 切换,没有回弹效果。

实现方式

本文主要通过 VueSticky 插件来实现吸顶,实现步骤描述如下:

  • 安装:npm install vue-sticky --save
  • 引入: import VueSticky from "vue-sticky"
  • 使用:
directives: { 'sticky': VueSticky,},
CONTENT

看了 VueSticky 的源码后将该插件的实现原理简要概括如下:

首先判断该浏览器是否支持 position:sticky;,若支持就用 position:sticky; 来实现,若不支持就用 position:fixed; 的方式实现

所以大家不用担心兼容性问题,因为我已经帮大家测试过了,IE9 及以上的浏览器都可以支持。

生效条件

需要注意的是,使用 v-sticky 有几个必要条件,否则会失效:

  • 父元素不能设置 overflow:hidden 或者 overflow:auto 属性
  • 至少指定 top 、bottom 、left 、right 4 个值中的一个,否则只会处于相对定位
  • 父元素的高度不能低于 sticky 元素的高度
  • sticky 元素仅在其父元素内生效

问题汇总

◎ 吸顶“叠罗汉”

吸顶元素在滚动到组件底部时,在谷歌、火狐等浏览器中,两层吸顶在消失过程中有重叠现象,具体现象如下图所示:

335d5128c51b866a3fc71d37ddc4fcd0.png

主要原因:第一层吸顶还符合吸顶条件,第二层吸顶已经开始消失解决方案:给第一层吸顶元素添加 minHeight 属性,其大小为第一层吸顶元素的高度与第二层吸顶元素的高度的和。这里有一个需要注意的点在于:一开始第一层吸顶元素的高度并非两者之和,所以这里就需要监听滚动事件,在吸顶元素距离底部的距离为两者高度之和的位置处给第一层吸顶元素添加 minHeight 属性

以下代码块中,sumHeight 表示两个吸顶元素的高度和,initialHeight 表示的是第一层吸顶元素的高度

const offsetTop = document.querySelector(".xxx").offsetBottom; if (offsetBottom <= sumHeight) { document.querySelector(".xxx").style.minHeight = sumHeight; } else { document.querySelector(".xxx").style.minHeight = initialHeight; }

◎ 吸顶“舍不得离开”

在 IE 浏览器中,吸顶元素滚动到组件底部时不消失,具体现象如下图所示

01a06c4a7fe2d27017bfae1e208bcd48.png

主要原因:在滚动过程中吸顶元素的 position:sticky; 属性始终存在

解决方案:监听滚动事件,当滚动到组件底部时,将 v-sticky="{ stickyTop: 0, disabled: false }" 中的 disabled 的值设为 true 即可

◎ 吸顶“难舍难分”

在 IE 浏览器中,两层吸顶元素始终吸在一起

d82a85f60eea6dee8be9532d6190479c.png

主要原因:第二层吸顶元素在不需要吸顶的区域,它的 position 值也为 sticky

解决方案:监听滚动事件,在不需要吸顶的区域设置它的 position 值为 static 即可

◎ 吸顶“变形”

同样 DOM 结构的吸顶元素,在 IE 浏览器中,吸顶会变形

查看 vue-sticky 的源码,发现 position:fixed; 是设置在要吸顶的元素的第一个子元素上

5eadb295f0d8019b976da9b15791bacd.png

因此为了兼容IE需要多加一层 div 结构

content

注意事项

  • 组件的监听与移除mounted() {
    // handleScroll 为页面滚动的监听回调
    window.addEventListener('scroll', this.handleScroll);
    },
    beforeDestroy() {
    removeEventListener("scroll", this.handleScroll);
    },
    • 同时要在 destroy 回调中移除监听
    • 在 mounted 回调中加入以下代码

优化点

  • 用监听事件监听滚动时,吸顶消失的很突兀let supportCSSSticky = document.querySelector(".xxx").style.position === "sticky";
    if (!supportCSSSticky) {
    // 不支持的情况下监听滚动
    }
    • 判断浏览器是否支持 sticky ,若支持用 position:sticky; 实现,否则用 position:fixed;
  • 图片懒加载
    • 对于图片过多的页面,为了加速页面的加载速度,我们需要将页面内未出现在可视区域内的图片先不做加载, 等到滚动到可视区域后再去加载。这样子对于页面加载性能上会有很大的提升,也提高了用户体验,关于图片优化方面内容可以阅读我们团队另一篇文章 为你重新系统梳理下, Web 体验优化中和图有关的那些事(万字长文)

总结

本文简单的介绍了 VueSticky 插件的实现原理并分享了实战过程中出现的问题以及解决方案,希望对大家有所帮助。如果大家也遇到过两层吸顶的问题或者你还知道更好的解决方案,欢迎在评论区留下宝贵评论。

原文链接:https://www.zoo.team/article/double-ceiling

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Vue中,可以使用`@mouseover`或`@mouseenter`来监听鼠标移入元素的事件,使用`@mouseleave`来监听鼠标移出元素的事件。例如: ```html <template> <div> <div @mouseover="handleMouseOver" @mouseleave="handleMouseLeave"> Hover me! </div> <p v-if="isHovering">You are hovering over me!</p> </div> </template> <script> export default { data() { return { isHovering: false } }, methods: { handleMouseOver() { this.isHovering = true }, handleMouseLeave() { this.isHovering = false } } } </script> ``` 在上面的例子中,当鼠标移入`<div>`元素时,会触发`handleMouseOver`方法,将`isHovering`变量设为`true`,从而显示`<p>`元素;当鼠标移出`<div>`元素时,会触发`handleMouseLeave`方法,将`isHovering`变量设为`false`,从而隐藏`<p>`元素。 ### 回答2: Vue中的hover事件是指鼠标悬停在某个元素上时触发的事件。在Vue中可以通过指令v-on:mouseenter和v-on:mouseleave来绑定hover事件。 当鼠标进入元素时,会触发v-on:mouseenter指令绑定的事件函数。通过该事件函数可以对元素进行相应的操作,例如改变元素的样式、显示隐藏的内容等。可以在methods选项中定义事件函数,并在模板中使用v-on:mouseenter指令绑定到相应的元素上。 当鼠标离开元素时,会触发v-on:mouseleave指令绑定的事件函数。通过该事件函数同样可以对元素进行操作,例如恢复元素的原始样式、隐藏显示的内容等。也可以在methods选项中定义该事件函数,并通过v-on:mouseleave指令绑定到相应的元素上。 使用Vuehover事件可以为元素添加交互效果,提升用户体验。例如,可以通过hover事件实现鼠标悬停在图片上时显示放大效果,或者鼠标悬停在按钮上时改变按钮的颜色等。通过Vue的数据绑定特性,我们还可以动态改变元素的样式或内容。在事件函数中可以直接使用Vue实例的属性或方法来实现数据的响应式更新。 总而言之,Vuehover事件是通过v-on:mouseenter和v-on:mouseleave指令来实现的,通过定义事件函数并绑定到相应的元素上,可以实现鼠标悬停时的各种交互效果。 ### 回答3: Vue中的hover事件是指当鼠标悬停在特定元素上时触发的事件。在Vue中,可以使用v-on指令来绑定hover事件。 首先,在需要绑定hover事件的元素上使用v-on指令,并将事件名称设置为"mouseenter"或"mouseover",然后指向一个定义在Vue实例中的方法。例如: ```html <div v-on:mouseenter="handleMouseEnter"></div> ``` 在Vue实例中,定义handleMouseEnter方法来处理悬停事件的逻辑。例如: ```javascript new Vue({ el: "#app", methods: { handleMouseEnter: function() { // 处理鼠标悬停事件的逻辑 } } }) ``` 当鼠标悬停在该元素上时,handleMouseEnter方法将被触发,并执行相应的逻辑。 除了使用v-on指令,Vue还提供了一些方便的绑定事件的缩写形式,如@mouseenter。使用缩写形式可以使代码更简洁,例如: ```html <div @mouseenter="handleMouseEnter"></div> ``` 总的来说,Vue中的hover事件可以通过使用v-on指令或其缩写形式来绑定,并在Vue实例中定义相应的方法来处理悬停事件的逻辑。这样可以方便地实现鼠标悬停时的交互效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值