在 SVG 文件或标签内添加悬停样式

2024-02-02

我有一个 SVG 标签,我想在它悬停时更改填充颜色。 我在 SVG 标签内添加了样式标签,但似乎hover不起作用,而简单的样式就可以了。 这是我的 SVG 标签:

<svg width="28" height="81" viewBox="0 0 28 81" xmlns="http://www.w3.org/2000/svg">
    <style type="text/css">
        .slick_next_arrow {
            fill:red;
         }
        .slick_next_arrow:hover {
            fill:green;
         }
     </style>
     <path class="slick_next_arrow" hover="fill:green" fill-rule="evenodd" clip-rule="evenodd" d="M3.73141 1.20959C2.95311 -0.00927037 1.3341 -0.366415 0.115239 0.411883L25.5894 40.3058L0 80.3802C1.21886 81.1585 2.83787 80.8014 3.61617 79.5825L27.4729 42.2216C27.7642 41.7653 27.8965 41.2531 27.884 40.7498C28.1017 40.0409 28.0185 39.2445 27.5881 38.5705L3.73141 1.20959Z"/>
</svg>

我已将此 svg 包含到元素::之后两种方式:

  1. 将整个标签添加到内容中

    #slick-views-customer-quotes-carousel-block-main-1 .slick__arrow .slick-next::after {
       content : url('data:image/svg+xml; utf8, <svg class="" width="28" height="81" viewBox="0 0 28 81" xmlns="http://www.w3.org/2000/svg">  <style type="text/css">  .slick_next_arrow {      fill:blue;  }  .slick_next_arrow:hover {      fill:green;  }  </style>  <path class="slick_next_arrow" hover="fill:green" fill-rule="evenodd" clip-rule="evenodd" d="M3.73141 1.20959C2.95311 -0.00927037 1.3341 -0.366415 0.115239 0.411883L25.5894 40.3058L0 80.3802C1.21886 81.1585 2.83787 80.8014 3.61617 79.5825L27.4729 42.2216C27.7642 41.7653 27.8965 41.2531 27.884 40.7498C28.1017 40.0409 28.0185 39.2445 27.5881 38.5705L3.73141 1.20959Z"/></svg>');
    

    }

  2. 作为单独的 SVG 文件

    #slick-views-customer-quotes-carousel-block-main-1 .slick__arrow .slick-next::after {
       content : url("../images/right_arrow.svg");
    }
    

但它们都不起作用。 关于如何解决这个问题有什么想法吗?


当你将其设置为伪元素的内容时,你的 svg 实际上是一个CSS https://developer.mozilla.org/en-US/docs/Web/CSS/image。 CSS 代表 svg 文档有相同的限制 https://www.w3.org/wiki/SVG_Security#SVG_as_image作为 html 代表 svg:

  • 不会获取任何外部资源
  • 脚本不会在内部文档中运行
  • 内部文档不会是交互式的(即没有指针事件)
  • ...

这意味着任何:hover这个 svg 文档中的样式将毫无用处。

然而你可以做的是设置这个:hover在父母身上.slick-next元素并更改content there.

避免在服务器上仅存储两个 svg 文件fill这将会改变,你可以使用由莉亚·维罗 https://gist.github.com/LeaVerou/5198257,它利用了:target伪类。有关此的更多信息,请点击此处 https://stackoverflow.com/questions/46045185/style-svg-loaded-to-html-as-content-tag-with-css/46045448#46045448.

你必须重组你的 svg,以便你拥有不可见的触发元素[id]属性,因此它们可以成为:target。然后所有逻辑都是使用 CSS 选择器完成的:

右箭头.svg

<svg width="28" height="81" viewBox="0 0 28 81" xmlns="http://www.w3.org/2000/svg">
  <style>
    .slick_next_arrow {
      fill:red;
    }
    /* when loaded from 'right_arrow.svg#hover' */
    #hover:target ~ .slick_next_arrow {
      fill:green;
    }
  </style>
  <!-- here is our triggerer -->
  <g id="hover"></g>
  <!-- the visual content -->
  <path class="slick_next_arrow" hover="fill:green" fill-rule="evenodd" clip-rule="evenodd" d="M3.73141 1.20959C2.95311 -0.00927037 1.3341 -0.366415 0.115239 0.411883L25.5894 40.3058L0 80.3802C1.21886 81.1585 2.83787 80.8014 3.61617 79.5825L27.4729 42.2216C27.7642 41.7653 27.8965 41.2531 27.884 40.7498C28.1017 40.0409 28.0185 39.2445 27.5881 38.5705L3.73141 1.20959Z"/>
</svg>

还有你的CSS:

.slick__arrow .slick-next::after {
  content : url('right_arrow.svg');
}
.slick__arrow .slick-next:hover::after {
  content : url('right_arrow.svg#hover');
}

这是一个更复杂的实时片段,因为我们必须解决无法托管来自 StackSnippets 的第三方文件的事实。

const svg_content = `<svg width="28" height="81" viewBox="0 0 28 81" xmlns="http://www.w3.org/2000/svg">
  <style>
    .slick_next_arrow {
      fill:red;
    }
    #hover:target ~ .slick_next_arrow {
      fill:green;
    }
/* some goodies */
    circle {
      display: none;
    }
    /* hide previous path */
    [id^="show_circle"]:target ~ .slick_next_arrow {
      display: none;
    }
    /* show new one */
    [id^="show_circle"]:target ~ circle {
      display: block; 
      fill: red;
    }
    #show_circle_hover:target ~ circle.change-color {
      fill: green;
    }
  </style>
  <!-- here are all our triggerers -->
  <g id="hover"></g>
  <g id="show_circle"></g>
  <g id="show_circle_hover"></g>
  <path class="slick_next_arrow" hover="fill:green" fill-rule="evenodd" clip-rule="evenodd" d="M3.73141 1.20959C2.95311 -0.00927037 1.3341 -0.366415 0.115239 0.411883L25.5894 40.3058L0 80.3802C1.21886 81.1585 2.83787 80.8014 3.61617 79.5825L27.4729 42.2216C27.7642 41.7653 27.8965 41.2531 27.884 40.7498C28.1017 40.0409 28.0185 39.2445 27.5881 38.5705L3.73141 1.20959Z"/>
  <circle cx="14" cy="15" r="12"/>
  <circle cx="14" cy="40" r="12" class="change-color"/>
  <circle cx="14" cy="65" r="12"/>
</svg>`;

// StackSnippets force us to make a complex js-powered live demo...
// but in production all is done from CSS
const url = URL.createObjectURL( new Blob( [ svg_content ], { type: "image/svg+xml" } ) );

const el = document.querySelector( '.parent' );
el.style.setProperty( '--url', 'url(' + url + ')' );
el.style.setProperty( '--url-hovered', 'url(' + url + '#hover)' );
el.style.setProperty( '--url-circle', 'url(' + url + '#show_circle)' );
el.style.setProperty( '--url-circle-hovered', 'url(' + url + '#show_circle_hover)' );
.parent{
  display: inline-block;
  width: 28px;
  height: 90px;
}
.parent::before {
  /* right_arrow.svg */
  content: var(--url);
}
.parent:hover::before {
  /* right_arrow.svg#hover */
  content: var(--url-hovered);
}
/* goodies */
:checked ~ .parent::before {
  /* right_arrow.svg#show_circle */
  content: var(--url-circle);
}
:checked ~ .parent:hover::before {
  /* right_arrow.svg#show_circle_hover */
  content: var(--url-circle-hovered);
}
<input type="checkbox" id="check"><label for="check">change shape</label><br>
<div class="parent"></div>

但您可以在此 plnkr 中访问简单版本。 https://plnkr.co/edit/vPQKF9QtA9oZoZrMOpBH?p=preview

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 SVG 文件或标签内添加悬停样式 的相关文章

  • JavaScript 中的 CSS 边框

    我正在使用下面的过程从 JavaScript 修改 CSS 但它没有给出任何结果 任何人都可以检查代码并让我知道正确的方法 我需要带有半径的表格边框 这是我的表结构 table width 400 border 0 cellspacing
  • 如何在node.js中使用express框架提供图像文件?

    在我的应用程序中 我使用 Express 框架来服务客户端文件 但是在为 html 元素提供背景图像时 它显示无法加载给定的 url var express require express http require http var app
  • 如何在加载ajax内容和javascript时加载gif图像[重复]

    这个问题在这里已经有答案了 我一直在尝试加载 gif 图像 直到 ajax 加载数据并显示它 但我对此感到安慰 我希望你能帮助我 这是我的高级搜索代码 现在我想为此添加加载 gif ajax type POST url base rul s
  • Bootstrap 4.1 中悬停时的下拉菜单

    我有一个网站 我在其中创建了下拉菜单引导程序4 1 https getbootstrap com docs 4 1 dist css bootstrap min css 此时 下拉菜单正在点击 我用来创建下拉列表的 HTML 代码是 div
  • 防止页面跳转到iframe

    我正在尝试通过 iframe 将 wetransfer 集成到网站中 但是当页面加载时遇到问题 它会跳转到页面的一半 因此它专注于 iframe 而不是在页面顶部打开 据我所知 wetransfer 网站上有一个脚本告诉它跳转到该部分 而不
  • 在 html 中显示表单时使用 table 标签是不是不好的设计?

    我一直听到这样的话div标签应该用于布局目的 而不是table标签 那么这也适用于表单布局吗 我知道表单布局仍然是一个布局 但似乎使用以下命令创建表单布局divs 需要更多html and css 因此 考虑到这一点 表单布局应该使用div
  • 如何创建一个对角分割的页面,两半是可点击的链接

    我需要创建一个对角分割的登陆页面 像这样的东西 我需要页面的两个区域都是可单击的 并且在最好的情况下 所有内容都应该动态地适应用户的显示器 以便显示器始终分成两半 我该怎么做 我应该使用画布吗 欢迎任何建议 以及如果我使用画布可能的后备方案
  • 如何在iframe中插入html

    大家好 我需要在 iframe 中插入一个 html 字符串 如下所示 var html p body p jQuery popolaIframe click function parent indexIframe 0 documentEl
  • 让两个按钮彼此相邻

    我的设计有问题 我的产品页面上有两个按钮 然而 由于其中一个处于表格中 因此它们彼此叠置 参见图片 我想让这两个按钮彼此相邻 有人可以帮我吗 下面我添加了 HTML 和 CSS 代码 提前致谢 HTML div class containe
  • ScrollTop 在 Chrome/Safari 中不起作用

    我的网站上有一个循环内的表单 当有人提交表单时 查询字符串会添加到 URL 中 例如 updated 111 然后 我的 JQuery 脚本检查数字的 url 并在提交表单并重新加载页面后滚动到该 div 该脚本在 Firefox 中运行良
  • 方向改变后的javascript最大视口高度Android和iOS

    目标 查找设备的最大视口高度 包括设备的空间address bar这样我们就可以动态调整 min body 的大小并将内容向上推 问题 移动浏览器处理方向状态的方式不同 方向变化时更新 DOM 属性的方式也不同 使用 JavaScript
  • 粉碎一个元素,向随机方向发送碎片

    我试图 粉碎 一个元素 例如 一个图像 并将其碎片朝随机方向飞行 当碎片到达目的地时 即x距离 以像素为单位 它们变成原始图像的较小版本 jQuery UI 的explode http api jqueryui com explode ef
  • 提交表单时显示警告框

    所以我有这两页 pageOne php and pageTwo php 表格在pageOne php
  • 如何更改点击事件上的引导插入符指向方向

    我正在使用 2 3 2 引导程序 因为当我单击菜单按钮时 我可以更改插入符号图标的位置 我需要当我单击图标插入符号向上时 当您单击另一个项目时 插入符号返回到初始状态 这怎么可能 导航代码 div div class container d
  • 带有针织滑轨的垂直滚动条可实现长功能

    是否可以使用knitr幻灯片制作垂直滚动条以实现长功能 使用xaringan https slides yihui name xaringan 自定义样式 我正在根据上一个问题尝试一些选项如何使垂直滚动条出现在RMarkdown代码块中 h
  • 元素在主体内找不到足够的空间 - JavaScript 样式

    相关信息 该页面包含两个元素 An
  • 单击时突出显示文本(javascript jquery html)

    当您在所有浏览器中双击某个单词时 它们会自动突出显示单击下的单词 但是否有可能找到一种方法exact单击一下就会发生同样的事情吗 我想这涉及到的事情可能是 TextRange 的东西 对所有段落 或整个正文或 div 的 onclick 做
  • 按钮导致页面重新加载

    我在我的页面上使用 html 和 jquery 在我的 html 中 我有一个按钮 单击该按钮将触发一个功能 当页面加载时 我调用文档准备中的主函数 这是我的代码 div div
  • Bootstrap - 为反向行模式创建移动自适应

    我想用 Bootstrap 创建一个反向效果 第一行 左边是文字 右边是图像 第二行 左边是图片 右边是文字 第三行 左边是文字 右边是图片 第四行 左边是图片 右边是文字 而且这种情况一直持续下去 它在大型设备上看起来非常漂亮 但当它在设
  • javascript:获取带有单位的CSS prop值[重复]

    这个问题在这里已经有答案了 我的代码是这样的 image 1 position absolute top 3vw 我的尝试 http jsfiddle net z8k6t3fb 1 http jsfiddle net z8k6t3fb 1

随机推荐

  • 我需要为关系数据库表的主键创建单独的索引吗

    如果我使用主键创建表 则会自动为表创建索引 还是需要单独执行 即如果这是表 ddl CREATE TABLE release guid varchar 36 NOT NULL PRIMARY KEY name varchar 255 xml
  • BeautifulSoup:

    我正在尝试使用 BeautifulSoup 提取 id titleDescription 所包含的字符串 div class itemText div class wrapper span class itemPromo Customer
  • 根据 GPS 坐标计算 PNG 地图上的 X 和 Y 位置

    我正在 iPhone 应用程序上实现自定义地图 尺寸为 map width 和 map height 的图像 并尝试在该地图上显示当前用户位置 current long 和 current lat 我有 2 个参考点 具有已知的 GPS 坐
  • 在 while_loop TensorFlow 函数内索引列表

    Hello 我有一个问题 我实际上有一个清单 真正的Python列表 占位符 我的清单很长n T 在下面的代码中 如下 my list D0 K D1 K Dn K 其中 Di 不必具有相同的大小 这就是我使用列表的原因 因为我无法在没有填
  • android x 设计依赖

    如何导入 androidx 设计依赖项 我尝试导入 implementation androidx design design 1 0 2 应用程序紧凑版本是 implementation androidx appcompat appcom
  • 当仅将 C_LOC 地址返回到 C 程序时,Fortran 变量需要 SAVE 属性吗?

    通常情况下 SAVE属性在 Fortran 类型声明中使用 以便变量在子程序结束时保留其值 例如 SO 问题的答案中所描述的here https stackoverflow com q 2893097 7038689 然而 我最近举了一个例
  • 我的应用程序在横向模式下崩溃

    我不知道出了什么问题 每当我在模拟器上启动我的应用程序并切换到横向模式时 它都会崩溃 但在纵向模式下它工作得很好 请问我可以做什么来解决这个问题 提前致谢 这是我的代码 MainActivity class import android a
  • 如何在 Next.js 中动态导入非 React 客户端库?

    我有一个简单的项目 import Music from components music export default function Home return
  • 无法使用 matplotlib 底图和 cx_freeze 冻结脚本

    再次回来 我仍在努力 但无法修复它 该脚本运行良好 但当我使用 cx freeze 冻结它时 会出现 cx freeze 错误 消息末尾说 OSError 找不到项目数据目录 期待它在 C python34 mpl toolkits bas
  • “现在”和给定日期之间的差异

    我需要检索集合中存在差异的所有文档新的 ISODate 并且文档的日期字段应该大于给定的参数 我可以通过查询在 mongo shell 上执行此操作 db getCollection tb registered app aggregate
  • Visual Studio 无法打开网站错误

    我使用 Visual Studio 2008 并处理一个包含网站的 Web 项目 打开解决方案文件时 我收到错误消息 无法打开网站 http localhost myWebsite de 网站 http localhost myWebsit
  • jest.mock 不适用于 Javascript 测试和 Typescript 模块

    我的嘲笑utilFunction没有被使用 并且向工厂函数添加日志记录表明它从未被调用 我已经尝试过搜索 jest mock 不使用相对路径 并且 jest mock 没有被 Typescript 调用 认为它可能与 JS 测试和 TS 源
  • 使用 JAXB 将空列表编组为缺席节点

    使用 JAXB 我希望能够将空列表编组为缺失节点 我认为 EclipseLink MOXy 有这种可能性 但我无法让它工作 根据 http wiki eclipse org User Rick barkhouse oracle com Te
  • 如何在内存中没有密钥的情况下对 EF core 3 视图进行单元测试?

    我正在使用 EF Core 3 并编写一些单元测试 但似乎无法为视图设置测试数据 当我尝试保存时 出现错误 无法跟踪类型的实例 因为它没有主键 只能跟踪具有主键的实体类型 public class EFContext DbContext p
  • django - DetailView如何同时显示两个模型

    我有两个模型 广告和横幅 当我使用 通用视图 DetailView时我怎样才能同时带两个模型下面的代码只带一个广告 我的网址 py url r P
  • PySpark 结构化流,窗口根据时间戳值获取最早和最新记录

    我有一个从 deltalake 读取的结构化流处理 数据包含随时间增加的值 在每个窗口中 我想根据该窗口内记录的时间戳来获取最早记录和最新记录之间的差异 价值观就像 sensor id TimeStamp Value sensor 1 Ju
  • Lisp 多次格式化一个字符

    我正在寻找一种输出字符的方法 多次使用格式 这可能吗 有人可以填写吗 在里面 的 这样这个例子就可以工作了吗 let n 3 format nil 应该返回 gt 很高兴看到这么多解决方案 到目前为止 A 迭代结构提供了一个简洁的解决方案
  • 如何在 Mercurial 中将文件从一个分支检出到另一个分支?

    如何在 Mercurial 中将单个文件从一个分支检出到另一个分支 基本上我想从分支复制单个文件experimental到另一个分行production 您可以显示任何版本的任何文件hg cat r experimental filenam
  • 内存映射文件和单个块的原子写入

    如果我使用普通 IO API 读取和写入单个文件 则保证每个块的写入都是原子的 也就是说 如果我的写入仅修改单个块 则操作系统保证要么写入整个块 要么什么也不写入 如何在内存映射文件上达到相同的效果 内存映射文件只是字节数组 因此如果我修改
  • 在 SVG 文件或标签内添加悬停样式

    我有一个 SVG 标签 我想在它悬停时更改填充颜色 我在 SVG 标签内添加了样式标签 但似乎hover不起作用 而简单的样式就可以了 这是我的 SVG 标签