SVG 图像模式如何在保留纵横比的情况下工作? [英] How does SVG image pattern work with preserving aspect ratio?

查看:26
本文介绍了SVG 图像模式如何在保留纵横比的情况下工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下 svg:

<svg height="100%" width="100%" viewBox="0 0 100 100" preserveAspectRatio="none" style="display: block; position: absolute; top: 0;">
  <defs>
    <pattern id="img1" patternUnits="objectBoundingBox" width="100%" height="100%">
      <image xlink:href="https://media.npr.org/assets/img/2016/06/22/gettyimages-467390112_custom-e8fa0c9a7224b7172555577fde25a08949bde2d2-s900-c85.jpg" x="0" y="-20" width="100" height="100"/>
    </pattern>
  </defs>
  <polygon points="0 100, 50,50 100,100" id="abajo" style="stroke-width:0" fill="url(#img1)"/>
</svg>

它没有按预期工作,因为它放大了图像上人物的脸,如下所示:

It's not working as expected because it enlarge te face of the people on the image as follows:

但它应该是这样的:

具有三角形多边形会影响图像吗?我该如何解决,我需要 4 个带有图像的三角形图形才能点击.

Does having a triangular polygon affects the image? How can I solve it, I need 4 triangle figures with images inside to be clickables.

推荐答案

嗯,这是按预期工作的.您指定一个模式,其单位应填充容器的边界框,然后指定一个 2:1 容器 - 这样它就会拉伸图像.有很多排列可以保留图像的纵横比 - 这完全取决于您想要的行为.

Well this is working as intended. You specify a pattern whose unit should fill the bounding box of the container, and then specify a 2:1 container - so it stretches the image. There are lots of permutations that preserve the aspect ratio of the image - it depends on exactly what behavior you want.

这是一种即使在被要求填充更大空间时也能保留 SVG 本身纵横比的版本.

This is one version that preserves the aspect ratio of the SVG itself even when it's asked to fill a larger space.

<svg height="100%" width="100%" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid slice" style="display: block; position: absolute; top: 0;">
    <defs>
        <pattern id="img1" patternUnits="objectBoundingBox" width="100%" height="100%">
            <image xlink:href="https://media.npr.org/assets/img/2016/06/22/gettyimages-467390112_custom-e8fa0c9a7224b7172555577fde25a08949bde2d2-s900-c85.jpg" x="0" y="-20" width="100" height="100"/>
          </pattern>
    </defs>
        <polygon points="0 100, 50,50 100,100" id="abajo"  fill="url(#img1)" />
    </svg>

或者,如果您想调整图案本身,您可以将图案的高度加倍并在 Y 方向偏移以调整容器的 2:1 比例:

Or if you want to adjust the pattern itself, you can double the height of the pattern and offset it in Y to adjust for the 2:1 ratio of your container:

<svg height="100%" width="100%" viewBox="0 0 100 100"  style="display: block; position: absolute; top: 0;">
    <defs>
        <pattern id="img1" patternUnits="objectBoundingBox" y="-100%" width="100%" height="200%">
            <image xlink:href="https://media.npr.org/assets/img/2016/06/22/gettyimages-467390112_custom-e8fa0c9a7224b7172555577fde25a08949bde2d2-s900-c85.jpg" x="0" y="0" width="100" height="100" preserveAspectRatio="xMidYMax meet"/>
          </pattern>
    </defs>
        <polygon points="0 100, 50,50 100,100" id="abajo"  fill="url(#img1)" />
    </svg>

这是另一个使用过滤器填充图像的版本.

This is another version that uses a filter to fill in the image.

<svg height="100%" width="100%" viewBox="0 0 100 100" style="display: block; position: absolute; top: 0; background:grey">
    <defs>
        <filter id="img1" x="0%" y="0%" width="100%" height="100%" >
            <feImage xlink:href="https://media.npr.org/assets/img/2016/06/22/gettyimages-467390112_custom-e8fa0c9a7224b7172555577fde25a08949bde2d2-s900-c85.jpg" x="0" y="0" width="100" height="100" preserveAspectRatio="xMidYMax meet"/>
             <feComposite operator="in" in2="SourceGraphic"/>
          </filter>
    </defs>
        <polygon points="0 100, 50,50 100,100" id="abajo"  filter="url(#img1)" />
    </svg>

这篇关于SVG 图像模式如何在保留纵横比的情况下工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆