我目前正在为我的 React 应用程序构建一个图标组件。它将接收一个path
字符串作为props
,并使用它呈现<svg>
。
像这样:
常量文件:
export const ICONS = {
BUBBLE: 'M512 64c282.77 0 512 186.25 ...',
ENLARGE2: 'M1024 0v416l-160-160-192 192-96-96 ...',
该组件将按如下方式使用:
import Icon from './Icon.js';
import {ICONS} from '../../constants';
<Icon icons={ICONS.BUBBLE}/>
组件文件:图标.js
const Icon = props => (
<svg width="22" height="22" viewBox="0 0 1024 1024">
<path d={icons[props.icon]}></path>
</svg>
);
问题
我是否通过将返回的<svg>
包装在<span>
中获得任何 CSS 样式功能或灵活性,或者我可以应用于<span>
的每个样式我也可以直接应用于<svg>
?例如:显示、位置等。我将使用样式化组件来设置它的样式。
像这样:
<span>
<svg width="22" height="22" viewBox="0 0 1024 1024">
<path d={icons[props.icon]}></path>
</svg>
</span>
简短的回答
不,我不相信你从使用任何一个中获得任何CSS样式功能。但是你确实获得了语义上的好处,这将带来SEO和可访问性的好处。
长答案
在我看来,您应该将它们包装在一个span
元素中。这是因为span
语义更正确。
这是 W3 中的以下内容:
标记定义 HTML 文档中的分区或节。
我个人不会将svg
视为HTML文档中的部门或部分。
如果我必须尝试证明在图标div
上使用span
是合理的,我会指出accordion
组件(或此链接上的任何其他示例)wai-aria
最佳实践。可以在这里找到。在下面的链接中,他们给出了这个例子:
<h3>
<button aria-expanded="true"
class="Accordion-trigger"
aria-controls="sect1"
id="accordion1id">
<span class="Accordion-title">
Personal Information
<span class="Accordion-icon"></span>
</span>
</button>
</h3>
如您所见,他们使用的是span
元素。在这些标签中,我希望有一个图标。因此,使用您的示例,它看起来像这样:
<StyledIconSpan class="Accordion-icon">
<Icon icons={ICONS.BUBBLE}/>
</StyledIconSpan>
我会将StyledIconSpan
放在组件级别,而不是Icon
组件中。所以Component File: Icon.js
将保持不变。在将使用它的组件中,在上面的示例中使用它。
希望这有帮助。