使用xlink引用SVG时CSS播放按钮hover动画失效问题
问题产生原因
- 选择器挂载目标错误:你CSS中写的
#play:hover相关规则,绑定的对象是存放在SVG容器内的<symbol>元素,这个元素本身不会被渲染到页面可视区域,鼠标无法触发它的hover状态,自然不会执行对应的动画逻辑。页面上实际可交互、能响应鼠标事件的是外层ID为PlayNow的SVG元素。 <use>引用的DOM边界限制:通过<use>标签引入的<symbol>内容,会被放置在独立的影子DOM树中,如果你把hover绑定在未渲染的symbol节点上,完全无法触发交互;即使绑定到正确的外层元素,错误的选择器嵌套逻辑也无法命中内部的路径元素。- 额外细节问题:CSS属性名书写不规范,
stroke-dashArray是SVG标签属性的驼峰写法,在CSS样式表中要使用标准连字符写法stroke-dasharray,避免部分浏览器下样式失效。另外你存放symbol的SVG容器没有加隐藏样式,会在页面底部占用额外空白空间。
修复方案
- 首先给存放symbol的SVG容器添加隐藏样式,避免占用页面空间:
<svg xmlns="http://www.w3.org/2000/svg" width="0" height="0" style="position:absolute;overflow:hidden"> <symbol id="play" viewBox="0 0 100 100"> <path class="stroke-solid" fill="none" stroke="white" d="M49.9,2.5C23.6,2.8,2.1,24.4,2.5,50.4C2.9,76.5,24.7,98,50.3,97.5c26.4-0.6,47.4-21.8,47.2-47.7 C97.3,23.7,75.7,2.3,49.9,2.5"/> <path class="stroke-dotted" fill="none" stroke="white" d="M49.9,2.5C23.6,2.8,2.1,24.4,2.5,50.4C2.9,76.5,24.7,98,50.3,97.5c26.4-0.6,47.4-21.8,47.2-47.7 C97.3,23.7,75.7,2.3,49.9,2.5"/> <path class="icon" fill="white" d="M38,69c-1,0.5-1.8,0-1.8-1.1V32.1c0-1.1,0.8-1.6,1.8-1.1l34,18c1,0.5,1,1.4,0,1.9L38,69z"/> </symbol> </svg> - 修改CSS中的hover选择器,把触发对象改成实际渲染的
#PlayNow元素,修正不规范的属性名写法:@import "compass/css3"; body {background:violet} @keyframes spin { to { transform: rotate(360deg); } } .stroke-dotted { opacity: 0; stroke-dasharray: 4,5; stroke-width: 1px; transform-origin: 50% 50%; animation: spin 4s infinite linear; transition: opacity 1s ease, stroke-width 1s ease; } .stroke-solid { stroke-dashoffset: 0; stroke-dasharray: 300; stroke-width: 4px; transition: stroke-dashoffset 1s ease, opacity 1s ease; } .icon { transform-origin: 50% 50%; transition: transform 200ms ease-out; } /* 修正后的hover规则,绑定到实际渲染的可交互元素上 */ #PlayNow:hover .stroke-dotted { stroke-width: 4px; opacity: 1; } #PlayNow:hover .stroke-solid { opacity: 0; stroke-dashoffset: 300; } #PlayNow:hover .icon { transform: scale(1.05); } #PlayNow { cursor: pointer; position: absolute; top: 50%; left: 50%; transform: translateY(-50%) translateX(-50%); width:10em; height:auto; display:block; } - 如果需要兼容版本非常老旧的浏览器,可以直接把symbol内的path结构直接写到
#PlayNow的SVG标签内部,去掉<use>和<symbol>的嵌套,让所有元素都在普通DOM树中,此时上面的CSS不需要额外调整就能正常运行。
修改完成后,即可正常实现鼠标悬浮时虚线圆环旋转、实线圆环描边消失、播放图标轻微放大的交互动画效果。
内容的提问来源于stack exchange,提问作者Julia Galden
相关产品推荐
相关产品推荐

