CSS特效:pointer-events: none;的一种特殊应用

一、需求描述

今天看到一个设计需求:需要在弹框中显示如下界面,其中有两个效果:

1.顶部点击项目,下面的内容能相应滚动定位,同时滚动的时候顶部项目也能相应激活显示

2.顶部右侧有一个模糊渐变效果,并且要保证不影响项目的点击

二、功能实现

第一点,实现很简单,核心代码如下:

html 复制代码
<div class="drug-detail-content">
      <van-tabs v-model:active="active" @click-tab="handleTabClick">
        <van-tab v-for="i in ['适用症', '包装规格', '用法用量', '不良反应', '禁忌事项']" :title="`${i}`"></van-tab>
      </van-tabs>
      <div ref="tabContentRef" class="tabs-content">
        <div class="tab-title">适用症</div>
        <div class="tab-content">
        </div>
        <div class="tab-title">包装规格</div>
        <div class="tab-content">
        </div>
        <div class="tab-title">用法用量</div>
        <div class="tab-content">
        </div>
        <div class="tab-title">不良反应</div>
        <div class="tab-content">
        </div>
        <div class="tab-title">禁忌事项</div>
        <div class="tab-content">
        </div>
      </div>
    </div>
js 复制代码
const visiable = ref(false)
const active = ref(0)
import { useEventListener, useDebounceFn } from '@vueuse/core'
const tabContentRef = ref()

let isClick = false // 防止点击引起的内容区滚动影响tab激活
const handleTabClick = ({name}) => {
  const ele = tabContentRef.value.getElementsByClassName('tab-title')[name]
  isClick = true
  ele?.scrollIntoView()
}
 
const show = () => {
  visiable.value = true
  nextTick(() => {
    useEventListener(tabContentRef.value, 'scroll', useDebounceFn(() => {
      if(isClick) {
        isClick = false
        return ;
      }
      const scrollTop = tabContentRef.value?.scrollTop
      const eles = tabContentRef.value?.getElementsByClassName('tab-title')
      if(eles) {
        const tops = []
        Array.from(eles)?.map(o => {
          tops.push(o.offsetTop - 20)
        })
        active.value = tops.findIndex((v, i) => {
          return v <= scrollTop && scrollTop < tops[i+1]
        })
      }
    }, 300))
  })
}

第二点,它的实现,就得提到我们今天要说的pointer-events: none;

先看一下实现的效果:

可以看到我们利用伪元素::after,在wrap的右侧覆盖了带渐变背景的层:

css 复制代码
background-image: linear-gradient(90deg,hsla(0,0%,100%,.5),#fff);

为了不让这个层影响我们点击后面的tab,这里重点需要对这个伪元素的层设置pointer-events: none;,它在这里起到一种点击"击穿"的效果:

By setting pointer-events to none, the element becomes "transparent" to pointer events, meaning it won't capture any clicks or other pointer interactions, and they'll pass through to the element behind it.

参考:How to Prevent Elements Receiving Click Events With CSS

相关推荐
m0_7482361125 分钟前
Calcite Web 项目常见问题解决方案
开发语言·前端·rust
Watermelo61738 分钟前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
m0_7482489439 分钟前
HTML5系列(11)-- Web 无障碍开发指南
前端·html·html5
m0_748235611 小时前
从零开始学前端之HTML(三)
前端·html
一个处女座的程序猿O(∩_∩)O3 小时前
小型 Vue 项目,该不该用 Pinia 、Vuex呢?
前端·javascript·vue.js
hackeroink6 小时前
【2024版】最新推荐好用的XSS漏洞扫描利用工具_xss扫描工具
前端·xss
迷雾漫步者7 小时前
Flutter组件————FloatingActionButton
前端·flutter·dart
向前看-8 小时前
验证码机制
前端·后端
燃先生._.9 小时前
Day-03 Vue(生命周期、生命周期钩子八个函数、工程化开发和脚手架、组件化开发、根组件、局部注册和全局注册的步骤)
前端·javascript·vue.js