【问题标题】:Embed one image of a SVG sprite in HTML在 HTML 中嵌入一个 SVG 精灵的图像
【发布时间】:2014-08-13 20:18:19
【问题描述】:

我有一个自动生成的 SVG spritemap (grunt-svg-sprite),看起来像这样 file:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="116" height="69" viewBox="0 0 116 69">
    <svg width="116" height="25" viewBox="0 0 116 25" id="block1" y="0">
        <path fill="#fff" stroke="#FF51D4" stroke-miterlimit="10" d="M0 0h116v25H0z"/>
        <path fill="#D5FF54" stroke="#FF51D4" stroke-miterlimit="10" d="M0 0h116v25H0z"/>
    </svg>
    <svg width="20" height="20" viewBox="0 0 20 20" id="block2" y="25">
        <path fill="#FF001A" d="M.5.5h19v19H.5z"/>
        <path fill="#1D1D1B" d="M19 1v18H1V1h18m1-1H0v20h20V0z"/>
    </svg>
    <svg width="27" height="24" viewBox="0 0 27 24" id="block3" y="45">
        <path d="M.5.5h26v23H.5z"/>
        <path fill="#6BFF4E" d="M26 1v22H1V1h25m1-1H0v24h27V0z"/>
    </svg>
</svg>

此 SVG 包含三个“图像”,其 ID 为“block1”、“block2”和“block3”。

我想在我的网页上只显示“block1”,以便该图像的尺寸可以缩放。我想将宽度设置为10rem,高度应该自动调整。我是这样做的:

<img src="https://cdn.mediacru.sh/ahw4Jhv0r6GG.svg#block1" style="width:10rem;"/>

在这里我创建了一个JSFiddle。问题是,网络浏览器显示所有三个块,而不仅仅是“block1”。我怎样才能用&lt;img&gt; 做到这一点?我必须支持最新版本的网络浏览器并且只支持 IE11,以前的版本会很棒,但不是必须的。

(我不能使用object HTML 标签,因为我的 IE11 支持有限 - 我看不到这个 page 上的对象,我看到“iframe”、“img”和“ CSS背景”但“对象”:三次:“删除活动内容”)。

【问题讨论】:

    标签: html css image svg css-sprites


    【解决方案1】:

    解决问题的最简单方法是直接将一些 CSS 添加到 SVG 文件中:

    <style><![CDATA[ svg svg { display: none; } svg svg:target { display: inline; }]]></style>
    

    这个简单的 CSS 可防止显示所有块,并仅显示您要定位到的块。

    Here 是添加了 CSS 和 JSFiddle demo 的 SVG 文件。

    当你使用 Grunt 时,你可以使用例如自动化它。 grunt-string-replace 任务(使用 grunt-svg-sprite 处理后在 SVG 文件上运行它)。任务应该或多或少像这样:

    'string-replace': {
    dist: {
        files: {
            './src/preprocessedSVG.svg': './build/sprite.svg'
        },
        options: {
            replacements: [{
                pattern: '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="116" height="69" viewBox="0 0 116 69">',
                replacement: '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="116" height="69" viewBox="0 0 116 69"><style><![CDATA[ svg svg { display: none; } svg svg:target { display: inline; }]]></style>'
            }]
        }
    }
    

    您可以在模式中添加一些变量或正则表达式,使其更加健壮和防弹。

    --

    另一种解决方案是切换到由 Chris Coyer (http://css-tricks.com/svg-sprites-use-better-icon-fonts/) 描述的内联 SVG。还有一个 Grunt 任务 - [grunt-svgstore] (https://github.com/FWeinb/grunt-svgstore)。

    附:您需要复制这些链接并删除“https://”之后的空格,因为我是 StackOverflow 的新手,不能发布超过 2 个链接...

    【讨论】:

    • 第一个解决方案,我有问题。您在 JSFiddle 中看到了 block1 图像和标题“#block2:”之间的差距吗?如果您选择图像,您会看到图像底部有空白区域。我怎样才能删除它? / 其他解决方案:有什么好处?我必须包含完整的 SVG,所以我没有任何缓存机制,所以用户必须在每个页面上加载重新加载完整的 svg 文件? / 我认为否则我必须切换到background 解决方案,否则您怎么看?
    • 白色填充是由 viewBox 属性设置为 SVG 引起的。我还没有的解决方案。内联 SVG 应该可以解决这个问题,因为您可以在使用 SVG 的某些部分时设置 viewBox,例如:&lt;svg viewBox="0 0 100 100"&gt;&lt;use xlink:href="sprite.svg#block1"&gt;&lt;/use&gt;&lt;/svg&gt;。内联 SVG 的优点是您没有任何额外的 HTTP 请求来下载文件。当您每次使用不同的目标链接到带有#target 的文件时,将下载整个文件,因为浏览器将sprite.svg#block1sprite.svg#block2 视为不同的文件。
    • SVG 以#target 作为背景由于某些安全(?)问题而无法在 Chrome 中工作 - link
    • 我怎样才能用外部的来做到这一点,以便我可以缩放图像?这也是我对background-image 的问题。我有一个具有固定像素坐标的背景图像,似乎无法缩放此图像。
    • 在新的 webkit 版本中,它适用于 :target!因此,如果您的 JSFiddle 中没有空间,那么获得此解决方案会很棒。
    猜你喜欢
    • 1970-01-01
    • 2010-11-30
    • 2018-10-31
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 2011-08-19
    相关资源
    最近更新 更多