视频背景文字遮罩动画失效求助:mix-blend-mode使用问题
视频背景文字遮罩动画实现问题
我想做一个视频背景的文字遮罩动画,效果是:一开始文字和背景颜色一致,之后文字变成透明,露出底下的视频背景。但试了好多次都没成功,已经试过mix-blend-mode和透明背景,都解决不了问题。
现有代码:
CSS
body { overflow: hidden; } * { margin: 0; padding: 0; } .video-background { width: 100%; height: 100%; overflow: hidden; } .video-background > video { width: 100vw; height: 100vh; object-fit: cover; position: fixed; left: 0; right: 0; top: 0; bottom: 0; z-index: -1; } .video-background > img { width: 100vw; height: 100vh; object-fit: cover; position: fixed; left: 0; right: 0; top: 0; bottom: 0; /* animation: scale 6s forwards 1s; */ } .video-background > div { width: 100vw; height: 100vh; /* opacity: 0%; */ background-color: #1a1a1a; animation: fade 3s forwards; } .video-background > div { position: absolute; top: 0; width: 100vw; height: 100vh; display: flex; align-items: center; justify-content: center; overflow: hidden; background: #fff; color: #fff; mix-blend-mode: multiply; animation: to-white 3.5s forwards, blend 3.5s forwards, scale 4s forwards 4s; } .video-background > span { position: absolute; display: flex; justify-content: center; align-items: center; font-family: 'Ramabhadra', sans-serif; width: 100%; height: 100%; /* top: -6%; left: 0%; */ font-size: 37vw; font-weight: 700; user-select: none; color: #fff; letter-spacing: 0.75rem; animation: slide-in 2s forwards 500ms; transform: translateY(-150%); } @keyframes scale { 0% { transform: scale(1); } 100% { transform: scale(250); display: none; } } @keyframes slide-in { 0% { transform: translateY(-100%); } 70% { transform: translateY(0%); } 100% { transform: translateY(0%); } } @keyframes to-white { 0% { color: #141414; background-color: #1a1a1a; } 75% { color: #141414; background-color: #1a1a1a; } 76% { background-color: #000; } 100% { color: #fff; background-color: #000; } } @keyframes fade { 0% { opacity: 100%; } 70% { opacity: 100%; } 100% { opacity: 0%; } } /* video-background > span { position: absolute; font-family: "IntervalNextWideBold"; left: 0; top: 0; height: 100%; width: 100%; font-size: 70vh; display: flex; align-items: center; justify-content: center; text-transform: uppercase; font-weight: 800; animation-name: drop-down; animation-duration: 3.6s; animation-direction: normal; transition: 1s; user-select: none; mix-blend-mode: multiply; } @keyframes drop-down { 0% { transform: translateY(-100%); color: #fff; } 50% { transform: translateY(-100%); } 80% { transform: translateY(0%); color: #fff; } 100% { color: #fff; } } @keyframes background-fix { 0% { opacity: 0; } 80% { opacity: 0; } 100% { opacity: 1; } } @keyframes blah-blah { 0% { background-color: #000; } 80% { background-color: #000; } 100% { background-color: #fff; } } */
HTML
<!DOCTYPE html> <html> <head> <meta charset='utf-8'> <meta http-equiv='X-UA-Compatible' content='IE=edge'> <title>test</title> <meta name='viewport' content='width=device-width, initial-scale=1'> <link rel='stylesheet' type='text/css' media='screen' href='main.css'> <script src='main.js'></script> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Ramabhadra&display=swap" rel="stylesheet"> </head> <body> <div class="video-background"> <video src="video.mp4" autoPlay loop muted></video> <div></div> <!-- <img src="/GPSI-background.svg" alt="background" /> --> <span>GPSI</span> </div> </body> </html>
修复方案:
你的代码存在元素层级冲突、动画逻辑混乱的问题,调整后可以实现目标效果:
修改后的CSS
body { overflow: hidden; } * { margin: 0; padding: 0; } .video-background { width: 100%; height: 100vh; overflow: hidden; position: relative; /* 定位基准,确保内部元素层级正确 */ } .video-background > video { width: 100vw; height: 100vh; object-fit: cover; position: absolute; left: 0; top: 0; z-index: -1; } /* 遮罩层:负责背景色过渡 */ .video-background .mask-layer { position: absolute; top: 0; left: 0; width: 100vw; height: 100vh; display: flex; align-items: center; justify-content: center; background-color: #1a1a1a; /* 初始背景色与文字一致 */ animation: mask-fade 3.5s forwards; } /* 遮罩文字:负责下滑+颜色过渡 */ .video-background .mask-text { font-family: 'Ramabhadra', sans-serif; font-size: 37vw; font-weight: 700; user-select: none; color: #1a1a1a; /* 初始文字色与背景一致 */ letter-spacing: 0.75rem; mix-blend-mode: difference; /* 关键:混合模式实现遮罩效果 */ animation: text-reveal 3.5s forwards 0.5s; transform: translateY(-100%); } /* 遮罩层背景从深色变透明 */ @keyframes mask-fade { 0% { background-color: #1a1a1a; } 70% { background-color: #1a1a1a; } 100% { background-color: transparent; } } /* 文字下滑+颜色从同背景色变白色(配合混合模式露出视频) */ @keyframes text-reveal { 0% { transform: translateY(-100%); color: #1a1a1a; } 70% { transform: translateY(0); color: #1a1a1a; } 100% { transform: translateY(0); color: #fff; } }
修改后的HTML
<!DOCTYPE html> <html> <head> <meta charset='utf-8'> <meta http-equiv='X-UA-Compatible' content='IE=edge'> <title>test</title> <meta name='viewport' content='width=device-width, initial-scale=1'> <link rel='stylesheet' type='text/css' media='screen' href='main.css'> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Ramabhadra&display=swap" rel="stylesheet"> </head> <body> <div class="video-background"> <video src="video.mp4" autoPlay loop muted></video> <div class="mask-layer"> <span class="mask-text">GPSI</span> </div> </div> </body> </html>
关键调整说明:
- 给
.video-background添加position: relative,统一内部元素的定位基准 - 合并重复的div样式,将文字放入遮罩层内,结构更清晰
- 使用
mix-blend-mode: difference实现文字与背景的颜色对比,当背景变透明时,文字会自然透出底层视频 - 简化动画逻辑,拆分遮罩层背景过渡和文字的下滑+颜色变化动画,时序更贴合需求
- 移除无效的
scale动画(CSS动画不支持修改display属性)
内容的提问来源于stack exchange,提问作者HassenBenHadjHassen
相关产品推荐
相关产品推荐

