如何将过渡加载动画脚本仅作用于指定的.player类div而非整个页面
如何将过渡加载动画脚本仅作用于指定的.player类div而非整个页面
嘿,我来帮你调整这个加载脚本,让它只在你的.player容器里工作,而不是霸占整个页面~
首先,原脚本的问题是用了全屏固定定位和全局元素选择,我们需要把这些都改成针对.player容器的逻辑,同时还要把触发时机从页面加载完成改成音频可以播放的时机(毕竟你的场景是等待mp3加载完毕能流式播放)。
下面是修改后的完整代码:
// 配置项保持不变 const loaderConfig = { backgroundColor: "#fff", filterBrightness: 2, strokeWidth: 10, timeOnScreen: 100 }; // 1. 找到目标.player容器,而不是全局元素 const playerContainer = document.querySelector(".player"); if (!playerContainer) return; // 如果找不到容器就终止脚本 // 给容器添加相对定位,让内部的加载动画可以相对于它定位 playerContainer.style.position = "relative"; playerContainer.style.overflow = "hidden"; // 2. 创建加载遮罩容器,改成绝对定位覆盖整个.player const loaderOverlay = document.createElement("div"); loaderOverlay.style.cssText = ` background-color: ${loaderConfig.backgroundColor}; color: ${loaderConfig.backgroundColor}; display: flex; align-items: center; justify-content: center; position: absolute; top: 0; left: 0; height: 100%; width: 100%; z-index: 10; `; // 3. 创建SVG加载动画(这部分逻辑不变,只是挂载到遮罩里) const svgNS = "http://www.w3.org/2000/svg"; const svg = document.createElementNS(svgNS, "svg"); const circle = document.createElementNS(svgNS, "circle"); // 添加动画关键帧样式 const style = document.createElement("style"); style.innerHTML = "@keyframes swell{to{transform:rotate(360deg)}}"; document.head.appendChild(style); // 配置SVG和圆的属性 svg.style.cssText = ` height: 50px; filter: brightness(${loaderConfig.filterBrightness}); animation: .3s swell infinite linear; `; svg.setAttribute("viewBox", "0 0 100 100"); circle.setAttribute("cx", "50"); circle.setAttribute("cy", "50"); circle.setAttribute("r", "35"); circle.setAttribute("fill", "none"); circle.setAttribute("stroke", "currentColor"); circle.setAttribute("stroke-dasharray", "165 57"); circle.setAttribute("stroke-width", loaderConfig.strokeWidth); // 组装动画元素 svg.appendChild(circle); loaderOverlay.appendChild(svg); playerContainer.appendChild(loaderOverlay); // 4. 禁用.player内部的交互,而不是整个页面 const playerContent = playerContainer.querySelector("*"); playerContent.style.pointerEvents = "none"; playerContent.style.userSelect = "none"; playerContent.style.cursor = "wait"; // 5. 监听音频的canplay事件(而不是window.onload),音频准备好后移除加载动画 const audioElement = playerContainer.querySelector("audio"); if (audioElement) { audioElement.addEventListener("canplay", () => { setTimeout(() => { // 恢复交互 playerContent.style.pointerEvents = ""; playerContent.style.userSelect = ""; playerContent.style.cursor = ""; // 移除加载遮罩 loaderOverlay.remove(); // 移除之前添加的相对定位(可选,如果你不需要保留的话) playerContainer.style.position = ""; playerContainer.style.overflow = ""; }, loaderConfig.timeOnScreen); }); }
接下来给你解释几个关键的修改点:
- 定位方式调整:把原来全屏的
fixed定位改成absolute,同时给.player加上relative定位,这样遮罩只会覆盖这个容器,不会影响页面其他部分。 - 目标元素锁定:所有操作都针对
.player内部的元素,不再选择全局的document.querySelector("*"),避免影响整个页面的交互。 - 触发时机修正:原脚本用
window.onload是等整个页面加载完成,这和你等待音频加载的场景不符,改成监听<audio>的canplay事件,当音频准备好可以流式播放时再移除加载动画,逻辑更准确。 - 交互限制范围:只禁用
.player内部的点击、选择等交互,页面其他区域依然可以正常操作。
这样修改后,加载动画就只会在你的播放器容器里显示,完全不会影响页面其他部分啦~
备注:内容来源于stack exchange,提问作者rocco
相关产品推荐
相关产品推荐

