css mask 案例

CSS的mask属性用于定义一个可重复使用的遮罩,可以将其应用到任何可视元素上。这个功能类似于Photoshop中的图层蒙版。通过mask属性,可以创建独特的效果,比如圆形、渐变或图案性的遮罩。

一、基本用法

mask和background属性基本是一致的,主要有以下:

  • mask-image:用于指定要用作遮罩的图像。可以是任何有效的图像路径。
  • mask-mode:设置遮罩的模式,例如alpha、luminance或luminance-inverted。这决定了遮罩如何影响元素。
  • mask-position:确定遮罩的位置,例如center、top、left等。
  • mask-size:指定遮罩的尺寸。可以是具体的数值或关键字,如cover、contain等。

想要了解更多值可以参考MDN官网。本篇博客主要讲mask案例效果

二、图案遮罩

在这里我们会用到两张图片,即下面的猫图片和爱心图片。我们想实现的效果即是将猫放入爱心中,爱心之外的图片剪切掉。

基本图片
在这里插入图片描述
在这里插入图片描述
实现效果

在这里插入图片描述

案例代码

<template>
  <div class="mask">
    <img src="@/assets/cat.png" alt="" />
  </div>
</template>

<script setup lang="ts">
import { ref, reactive } from "vue";
</script>
<style scoped>
.mask {
  width: 1200px;
  height: 780px;
  -webkit-mask-image: url("../../assets/love.png");
  -webkit-mask-repeat: no-repeat;
  -webkit-mask-size: 100% 100%;
}
img {
  width: 1200px;
  height: 780px;
}
</style>

二、文字阴影效果

在这里插入图片描述
如上图所示,文字的阴影从远到近看起来有种由虚到实的效果。我们也可以采用mask-image来实现

<template>
  <div class="reflection">
    <span> HELLO WORLD </span>
  </div>
</template>

<script setup lang="ts">
import { ref, reactive } from "vue";
</script>
<style scoped lang="scss">
.reflection {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 500px;
  height: 200px;
  color: #fff;
  background-color: #f5e1da;

  span {
    position: relative;
    z-index: 2;
    font-size: 50px;
    font-weight: bolder;
    &::before {
      position: absolute;
      left: 0px;
      bottom: 0px;
      z-index: -1;
      content: "HELLO WORLD";
      transform: translate(-18px, 7px) scaleY(0.5) skew(45deg);
      color: #000;
      filter: blur(2px);   //模糊
      -webkit-mask-image: linear-gradient(0deg, black, transparent);
    }
  }
}
</style>

在上面案例中,阴影部分采用的是伪类进行实现,并对阴影进行缩放倾斜等效果。最后采用模糊,遮罩实现由虚到实的效果

三、日历探照灯效果

在这里插入图片描述
我们可以看见,鼠标位置变化照亮周围的边框,这个实现也可以采用mask-image来实现

<template>
  <div ref="gridBody" class="grid-body">
    <div ref="gridMask" class="grid-mask">
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
    </div>
    <div class="grid-item">1</div>
    <div class="grid-item">2</div>
    <div class="grid-item">3</div>
    <div class="grid-item">4</div>
    <div class="grid-item">5</div>
    <div class="grid-item">6</div>
    <div class="grid-item">7</div>
    <div class="grid-item">8</div>
    <div class="grid-item">9</div>
  </div>
  <router-view></router-view>
</template>
<script setup lang="ts">
import { ref, onMounted } from "vue";

const gridBody = ref<any>(null);
const gridMask = ref<any>(null);

onMounted(() => {
  let bounding = gridMask.value?.getBoundingClientRect();
  gridBody.value?.addEventListener("mousemove", (e: MouseEvent): void => {
    let x = e.pageX;
    let y = e.pageY;
    gridMask.value.style.webkitMaskPosition = `${x - bounding.x - 80}px ${
      y - bounding.y - 80
    }px`;
  });
});
</script>

<style scoped lang="scss">
.grid-body {
  width: 300px;
  height: 300px;
  padding: 10px;
  box-sizing: border-box;
  position: relative;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 10px;
  cursor: default;
  color: rgba(255, 255, 255, 0.8);
  background-color: rgb(60, 60, 60);
}

.grid-item {
  display: flex;
  align-items: center;
  justify-content: center;
  border: 3px solid rgba(255, 255, 255, 0);
}

.grid-mask {
  width: 100%;
  height: 100%;
  padding: 10px;
  box-sizing: border-box;
  position: absolute;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 10px;
  background: transparent;
  -webkit-mask-image: radial-gradient(
    circle at center,
    white 0%,
    transparent 80px
  );
  -webkit-mask-repeat: no-repeat;
  -webkit-mask-size: 160px 160px;
  pointer-events: none;
}

.grid-mask div {
  border: 3px solid rgba(255, 255, 255, 0.5);
}
</style>

日历探照灯案例是参考了另一位博主,在这里实现过程我就不过多赘述,效果不错,小伙伴们也可以自己动手实现一下
想要看日历探照灯具体实现思路,可以跳转至https://blog.csdn.net/weixin_42662269/article/details/119859827

### 使用 CSS `mask` 属性的方法 CSS 的 `mask` 属性提供了一种强大的方式来控制元素的可见部分,它可以通过遮罩图像或其他合成方法实现复杂的视觉效果。以下是关于如何使用 `mask` 属性的具体说明: #### 基本语法 `mask` 是一个复合属性,可以设置多个子属性,例如 `mask-image`, `mask-mode`, 和 `mask-composite` 等。下面是一个基本的例子展示如何应用遮罩到一张图片上。 ```css .mask-img { width: 300px; height: auto; -webkit-mask-image: url(mask.png); /* 兼容 WebKit 浏览器 */ mask-image: url(mask.png); } ``` 上述代码定义了一个名为 `.mask-img` 的类,并设置了它的宽度和高度自动调整[^2]。这里的关键在于 `-webkit-mask-image` 和 `mask-image` 属性的应用,它们指定了用于遮罩的图像文件路径。 #### 高级用法:组合不同的合成模式 除了简单的遮罩外,还可以利用 `mask-composite` 来指定不同遮罩层之间的混合行为。常见的值有 `add`, `subtract`, `intersect`, 和 `exclude`。比如: ```css .example { mask-image: linear-gradient(to bottom, black, transparent); mask-composite: source-over; /* 定义当前遮罩与其他遮罩的关系 */ } ``` 这里的 `linear-gradient` 创建了一个渐变作为遮罩图案,而 `mask-composite` 则决定了该遮罩是如何与之前已有的遮罩相互作用的[^1]。 #### 考虑浏览器兼容性 需要注意的是,在实际开发过程中应当考虑到各主流浏览器对于 `mask` 属性的支持情况。尽管现代大多数浏览器都支持标准形式下的 `mask-*` 属性,但在某些旧版本或特殊环境下可能仍需依赖前缀如 `-webkit-` 提供额外支持[^3]。 #### 实际案例分析 假设我们希望制作一个圆形头像显示框,则可以用如下样式完成这一需求: ```html <div class="profile-pic"></div> ``` ```css .profile-pic { background-image: url('avatar.jpg'); background-size: cover; width: 150px; height: 150px; border-radius: 50%; -webkit-mask-box-image: radial-gradient(circle at center, white 70%, transparent 80%); mask-box-image: radial-gradient(circle at center, white 70%, transparent 80%); } ``` 此段代码片段创建了一个具有圆角边界的 div 并将其背景设为用户上传的照片;同时借助径向梯度生成内部不透明外部逐渐淡化的遮罩效果[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值