d3.js - svg 如何在 svg 符号上添加边框?
问题描述
我正在使用一个包含国家标志的大 svg,例如
<symbol viewBox="0 0 640 480" id="flag-be">
<g fill-rule="evenodd" stroke-width="1pt">
<path d="M0 0h213.34v480H0z" />
<path fill="#ffd90c" d="M213.34 0h213.33v480H213.33z" />
<path fill="#f31830" d="M426.67 0h213.34v480H426.66z" />
</g>
</symbol>
它效果很好,我可以简单地使用 svg #flag-be 和瞧,得到了我的标志。
<svg class="icon flag-be"><use href="#flag-be"></use></svg>
但是,我想在标志周围添加一个边框(因为一些有很多白色的东西没有它看起来很奇怪),理想情况下只能通过 css 设置
当我将每个标志放入单独的 svg(使用边框)时它工作正常,但是当我使用多个标志作为单个 svg 容器的一部分时我未能使其工作(图表)
什么是最简单的?我应该在边框的每个符号中添加一个新元素吗?在 svg 中设置“使用”符号最灵活的样式是什么?
解决方案
也不是元素<svg>
也不是图形元素。试图设置一种样式来改变它们的图形外观只会导致其子代继承该样式。因此,如果您设置 a on ,它将被所有路径元素继承,并且您会在每个标志字段周围获得一个边框。<use>
<g>
stroke
<use>
(要记住的一点:使用元素克隆的<use>
内容可以继承样式,但不能使用 CSS 选择器定位它们。)
那么为什么要在最外层的元素上设置一个border
工作呢?因为该元素被视为 HTML 命名空间的一部分并像普通的一样呈现,而对于 SVG 命名空间中的子元素,该属性没有任何意义。 <svg>
<span>
border
在您的用例中,您需要在整个标志周围添加一个图形元素。大概在使用的时候,像这样:
<svg ...>
...
<svg class="icon flag-be" width="24" height="16">
<use href="#flag-be" />
<rect width="100%" height="100%" style="fill:none;stroke:black;stroke-width:1" />
</svg>
...
</svg>
注意内部<svg>
元素。其目的是提供参考的百分比宽度和高度<rect>
。否则,它们将相对于外部 <svg>
计算。
当前,width
并且height
必须设置为内部<svg>
元素的属性。SVG 2将它们定义为可以使用 CSS 设置的表示属性,但一些浏览器仍然只允许在外部<svg>
元素上使用。
推荐阅读
- sql - 获取通过一个属性连接的父级及其子级
- mysql - Sequelize 中的关联抛出错误为
未连接到 - java - 这个程序有什么错误?它没有给出任何输出。为什么?
- javascript - 如何在 Vue.js 中将列表拆分为页面?
- rest - 使用 OpenAPI 到底有什么意义?
- r - 使用 tidyeval 编写自定义 case_when 函数以在 dplyr mutate 中使用
- azure - 单个天蓝色应用程序中的多个功能未触发
- angular - 在 Angular (8.0) 中创建将在 FormGroup 和 FormArray 中使用的可重用部分或组件
- javascript - 使用 ajax 和 php 动态更改 html
- node.js - 如何将反应中的默认端口从 3000 更改为另一个端口?