ni/test/镂空遮罩.html
2025-05-23 18:34:51 +08:00

224 lines
6.3 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Video Background with Transparent Text Mask</title>
<style>
body {
margin: 0;
font-family: Arial, sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
overflow: hidden;
}
.container {
position: relative;
background-image: url('./background-test.jpg');
top: 0;
left: 0;
width: 100%;
height: 100%;
background-position: center;
background-size: cover;
}
.overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.overlay svg {
width: 100%;
height: 100%;
}
/* SVG文字样式 */
.overlay text {
font-family: "华文行楷", sans-serif;
font-size: 15rem;
font-weight: bold;
/* font-style: italic; */
letter-spacing: 0.1em;
text-transform: uppercase;
fill: black;
}
/* 遮罩背景样式 */
.overlay .mask-bg {
fill: white;
}
/* 遮罩层样式 */
.overlay .overlay-bg {
fill: rgba(0, 0, 0, 0.6);
}
</style>
</head>
<body>
<div class="container">
<div class="overlay">
<svg>
<defs>
<mask id="textMask">
<rect class="mask-bg" width="100%" height="100%"/>
<text
x="50%"
y="50%"
text-anchor="middle"
dominant-baseline="middle"
>星撰玉衡</text>
</mask>
</defs>
<rect class="overlay-bg" width="100%" height="100%" mask="url(#textMask)"/>
</svg>
</div>
</div>
</body>
<script>
const a = `
让我详细解释一下SVG mask的工作原理
1. **SVG Mask的基本原理**
- SVG的mask遮罩是一个灰度蒙版
- 在mask中
- 白色1.0)表示完全显示
- 黑色0.0)表示完全隐藏
- 灰色0-1之间表示部分显示
2. **当前代码的具体工作流程**
```html
<mask id="textMask">
<!-- 白色背景表示整个区域都会显示遮罩层 -->
<rect width="100%" height="100%" fill="white"/>
<!-- 黑色文字表示文字区域会隐藏遮罩层 -->
<text x="50%" y="50%" text-anchor="middle" dominant-baseline="middle" fill="black" font-size="15rem" font-weight="bold">HELLO</text>
</mask>
<!--应用遮罩的矩形 -->
<rect width="100%" height="100%" fill="rgba(0, 0, 0, 0.3)" mask="url(#textMask)" />
```
3. **渲染过程**
- 首先mask中的白色背景`fill = "white"`)表示整个区域都会显示遮罩层
- 然后mask中的黑色文字`fill = "black"`)会"挖出"文字形状的区域,使这部分完全透明
- 最后这个mask被应用到一个半透明黑色背景上`fill = "rgba(0, 0, 0, 0.3)"`
4. **最终效果**
- 文字区域mask中的黑色部分
- 遮罩层完全隐藏
- 直接显示背景图片
- 其他区域mask中的白色部分
- 显示半透明黑色遮罩层
- 背景图片被遮罩层覆盖
5. **为什么这样设计**
- 使用mask而不是直接设置透明度可以更精确地控制显示区域
- 文字区域完全透明,保证了背景图片的清晰显示
- 周围区域保持半透明黑色,提供了良好的对比度
这种实现方式的优点是:
- 精确控制:可以精确控制哪些区域显示遮罩,哪些区域透明
- 性能好:不需要重复加载背景图片
- 灵活性:可以轻松调整遮罩的透明度
- 可维护性SVG结构清晰易于修改和维护
需要我解释得更详细或者有其他问题吗?
`
const b = `
好的让我详细解释一下SVG中各个标签的含义
1. **`<svg>` 标签**
- SVG的根元素
- 定义了一个SVG文档片段
- 可以设置宽高、视口等属性
2. **`<defs>` 标签**
- 用于定义可重用的SVG元素
- 这里用来定义mask使其可以在其他地方引用
- 相当于一个"定义区域",里面的元素不会直接显示
3. **`<mask>` 标签**
- 定义一个遮罩效果
- `id="textMask"` 给遮罩一个唯一标识符,方便引用
- 遮罩中的元素决定了哪些区域显示/隐藏
4. **`<rect>` 标签**
- 用于绘制矩形
- 属性说明:
- `width="100%"`:宽度占满容器
- `height="100%"`:高度占满容器
- `fill="white"`:填充颜色为白色
5. **`<text>` 标签**
- 用于绘制文本
- 属性说明:
- `x="50%"`:文本水平居中
- `y="50%"`:文本垂直居中
- `text-anchor="middle"`:文本水平对齐方式为居中
- `dominant-baseline="middle"`:文本垂直对齐方式为居中
- `font-size="15rem"`:字体大小
- `font-weight="bold"`:字体粗细
- `fill="black"`:文本颜色
6. **应用遮罩的 `<rect>`**
- 这是实际显示的矩形
- `fill="rgba(0, 0, 0, 0.3)"`:半透明黑色
- `mask="url(#textMask)"`:引用之前定义的遮罩
完整的SVG结构
```html
<svg>
<!-- 定义区域 -->
<defs>
<!-- 定义遮罩 -->
<mask id="textMask">
<!-- 遮罩背景 -->
<rect width="100%" height="100%" fill="white"/>
<!-- 遮罩文字 -->
<text x="50%" y="50%" text-anchor="middle" dominant-baseline="middle" fill="black" font-size="15rem" font-weight="bold">HELLO</text>
</mask>
</defs>
<!-- 实际显示的矩形应用遮罩 -->
<rect width="100%" height="100%" fill="rgba(0, 0, 0, 0.3)" mask="url(#textMask)"/>
</svg>
```
SVG的一些重要特性
1. **坐标系统**
- 左上角为(0,0)点
- x轴向右增加
- y轴向下增加
2. **单位**
- 可以使用像素(px)
- 可以使用百分比(%)
- 可以使用相对单位(rem, em)
3. **定位方式**
- 可以使用绝对定位(具体数值)
- 可以使用相对定位(百分比)
- 可以使用居中定位50% + text-anchor
4. **颜色表示**
- 可以使用颜色名称如white, black
- 可以使用RGB值如rgb(255,255,255)
- 可以使用RGBA值如rgba(0,0,0,0.3)
- 可以使用十六进制(如#FFFFFF
需要我详细解释某个具体的标签或属性吗?
`
</script>
</html>