使用CSS文本阴影属性和一点jQuery创建一个逼真的交互式阴影,该阴影看起来会落在你的鼠标指针所在的位置,并创建一个文本落在另一个文本后面的错觉。
1.将文本添加到页面中。
<!-- Shadow Text --> <div class="shadow-text lighter"> jQuery </div> <div class="shadow-text bolder"> jQuery </div> <!-- Foreground Text --> <div class="shadow-text text"></div>
2.文本阴影所需的CSS。
.shadow-text { font-size: 270px; letter-spacing: 0.2em; width: 100vw; position: absolute; top: 50%; left: calc(50% + 15px); transform: translate(-50%, -50%); display: flex; align-items: center; justify-content: center; } .shadow-text.lighter { mix-blend-mode: multiply; z-index: 2; color: transparent; opacity: 0.9; text-shadow: 0px 0px 10px #1e1e1e; } .shadow-text.bolder { transform: translate(-50%, -50%) scale(1); filter: blur(10px); color: #fff; mix-blend-mode: multiply; z-index: 1; color: transparent; opacity: 0.35; } .shadow-text.text { background-image: url("/path/to/text.png"); background-repeat: no-repeat; background-position: stretch; background-size: contain; z-index: 10; position: absolute; top: 50%; left: 50%; height: 200px; width: 864px; transform: translate(-50%, -50%); text-shadow: none; color: #fff; }
3.在文档末尾加载所需的jQuery库。
<script src="/path/to/cdn/jquery.slim.min.js"></script>
4.检测鼠标移动事件并根据光标位置将阴影应用于文本的主jQuery脚本。
$(function () { let $shadow = $(".text"); let $shadowLighter = $(".lighter"); let $shadowBolder = $(".bolder"); //let shadowMax = $(window).innerHeight(); let shadowMax = 450; let shadowMin = shadowMax * -1; let shadowMidPoints = [ $shadow.offset().left + $shadow.width() / 2, $shadow.offset().top + $shadow.height() / 2 ]; let shadowSteps = 20; var shadowBlur = 10; $(document).on("mousemove", (e) => { let shadowX = Math.min( shadowMax, Math.max(shadowMin, shadowMidPoints[0] - e.pageX) ); let shadowY = Math.min( shadowMax, Math.max(shadowMin, shadowMidPoints[1] - e.pageY) ); var shadowValue; var shadowValueBolder; var shadowOpacity; var shadowOpacityBolder; for (var i = 0; i < shadowSteps; i++) { var newOffsetX = Math.floor(((shadowX / 2) * i) / 50); var newOffsetY = Math.floor(((shadowY / 2) * i) / 50); shadowOpacity = 1 - shadowSteps * i * 0.002; shadowOpacityBolder = 1 - shadowSteps * i * 0.005; shadowBlur = i * 1.5; if (shadowValue === undefined) { shadowValue = "0px 0px " + 10 + "px rgba(20, 17, 15, 0.3)"; shadowValueBolder = "0px 0px " + 10 + "px rgba(20, 17, 15, 1)"; } else { shadowValue += ", " + newOffsetX * 2 + "px " + newOffsetY * 2 + "px " + shadowBlur * 1.25 + "px rgba(20, 17, 15, " + shadowOpacity / 5 + ")"; shadowValueBolder += ", " + newOffsetX * 0.25 + "px " + newOffsetY * 0.25 + "px " + shadowBlur * 1.5 + "px rgba(20, 17, 15, " + shadowOpacityBolder / 5 + ")"; } } $shadowLighter.css("text-shadow", shadowValue); $shadowBolder.css("text-shadow", shadowValueBolder); }); });