mask-image实现渐变消失遮罩

1,250 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第15天,点击查看活动详情

前言:

成功没有捷径但成长有路径

css必备场景。专注积累,每天记录一个知识点,老概念新理解,重点记录一下

正文

背景

css里面的mask-image属性。我之前并不知道这个属性,某一天翻文档的时候看到了这个渐变遮罩,同样的效果我之前也写过,当时用的两个加渐变的div前置遮挡,效果是出来了但这样有个问题,被遮挡的那个无法点击,而且因为遮罩层颜色是固定的,当背景色不是白色的时候,这个组件是没法复用的。没做出来始终是个遗憾,这次遇到了,就详细整理下这个需求的实现方法。

这样的一个效果,渐变遮罩且可点击

基础属性

我们需要先来了解下用到的以下几个属性

mask-image 文档

用于设置元素上遮罩层

linear-gradient 文档

两种或多种颜色线性渐变

pointer-events: 文档

当值为none时,元素永远不会成为鼠标事件的target,也就是我们常说的,实现了鼠标点击穿透。

模拟场景一个li菜单

<div className="wrap">
  <ul>
    <li>快速上手</li>
    <li>开发一个Blog</li>
    <li>API</li>
    <li>配置</li>
    <li>运行时配置</li>
    <li>命令行</li>
  </ul>
</div>

方法1

渐变+pointer-event:none

像上文介绍的两个加渐变的div前置遮挡也是可以的,用伪元素叠加两个从透明到白色的渐变层,定位到位置上,最主要的是实现遮罩层下方按钮可点击,只要在遮罩层加一个pointer-event:none,鼠标穿透就可以了。

css

.wrap {
  position: relative;
  border: 1px solid #999;
  width: 500px;

  ul {
    padding: 5px;
    height: 300px;
    overflow: scroll;

  &::before {
    content: "";
    position: absolute;
    top: 0;
    bottom: 0;
    width: 100%;
    height: 100px;
    background: linear-gradient(0deg, transparent, #fff);
    pointer-events: none;
  }

  &::after {
    content: "";
    position: absolute;
    bottom: 0;
    width: 100%;
    height: 100px;
    background: linear-gradient(180deg, transparent, #fff);
    pointer-events: none;
  }
}

方法2

mask-image 遮罩

方法1解决不了背景色切换的问题,而css提供的mask 可以很好的解决这个问题,也不需要使用pointer-event:none(裁切当前层,不存在遮挡),代码简单不需要使用伪类。

mask的原理类似ps的剪切蒙版功能,设置了以后,只有非透明部分(颜色不重要,只跟颜色的透明度有关,或者图片的形状),只有非透明部分覆盖到的区域可以显示,其他区域透明。

css

ul {
  padding: 5px;
  height: 300px;
  overflow: scroll;
  mask-image: linear-gradient(to bottom,
      rgba(255, 255, 255, 0) 0,
      rgba(255, 255, 255, .6) 15%,
      rgba(255, 255, 255, 1) 50%,
      rgba(255, 255, 255, 1) 75%,
      rgba(255, 255, 255, .6) 85%,
      rgùa(255, 255, 255, 0) 100%);
}

总结

带着问题找答案,积累的多了自然有柳暗花明的一天。