【问题标题】:Custom React SVG component not rendering on iOS, renders fine on Desktop自定义 React SVG 组件不在 iOS 上呈现,在桌面上呈现正常
【发布时间】:2021-08-26 22:59:50
【问题描述】:

我刚刚制作了这个组件以避免在 React.js 中加载 SVG 图像,在这种情况下我想绘制自己的 SVG 按钮。不幸的是,我编写的组件在 Mac 或 PC 桌面上运行良好(它呈现一个蓝色矩形),但在 iPhone 或 iPad 上却不行(试过 Safari 和 Chrome,在 iOS 上没有运气)。你能帮我吗?这是我正在测试的组件:

import React from 'react'

const Svg = (props) => {

    return(

        <svg
            viewBox = {`0 0 ${props.width} ${props.height}`}
        >

            <defs>

                <path
                    id = 'path-main'
                    d = {`
                    M 0, 0
                    L ${props.width}, 0
                    L ${props.width}, ${props.height}
                    L 0, ${props.height}
                    L 0, 0 z
                    `}
                />

            </defs>

            <g>

                <use
                    stroke = 'blue'
                    strokeWidth = '2'
                    fill = 'blue'
                    xlinkHref = '#path-main'
                />

            </g>

        </svg>

    )
}

export default Svg

这应该很简单,因为我还没有对它做任何特别的事情,我只是确保它可以跨设备和响应式地工作,但是很遗憾,它没有。你知道我在这里想念什么吗? iOS不支持在运行时绘制的SVG吗?

顺便说一句,组件只是被这样调用(很明显但仍然):

<Svg
  width = '300px'
  height = '50px'
/>

谢谢

Edit1:记录一下,它也不会在 Mac Desktop Safari 上呈现,只是注意到了。

【问题讨论】:

  • 在 iOS 上,每个浏览器都是 webkit,也就是说,在渲染内容方面,它们都与 Safari 完全相同。
  • 你是不是暗示不能在 webkit 上渲染运行时 SVG?我确信 webkit 确实会在运行时显示加载/导入的 SVG。
  • 不,我是在回答你说你在 iOS 上尝试过 Safari 和 Chrome 的部分问题,告诉你一定会得到相同的结果。
  • 欣赏它 :D 实际上并不知道 :D 顺便说一句,我用 SVG 解决了这个问题,你可以在下面看到我自己的答案。谢谢。

标签: ios reactjs svg


【解决方案1】:

显然,我在 svg 标记中编写的代码不够健壮,无法在所有浏览器上运行。我在 Sketch 中制作了一个新的简单 SVG 只是为了测试它,这个在所有浏览器中都正确显示。这将是我现在在所有浏览器中工作的测试组件:

import React from 'react'

const Svg = (props) => {

    return(

        <svg
            width = {props.width}
            height = {props.height}
            viewBox = {`0 0 ${props.width} ${props.height}`}
        >

            <g
                fill = '#B91799'
                fillRule = 'evenodd'
            >

                <path
                    d = {`
                    M 0, 0
                    L ${props.width}, 0
                    L ${props.width}, ${props.height}
                    L 0, ${props.height}
                    L 0, 0 z
                    `}
                />

            </g>
            
        </svg>

    )
}

export default Svg

编辑:正如 Robert 在下面提到的,请注意第一次尝试的问题是 svg 元素上缺少属性宽度和高度。

【讨论】:

  • 那么问题是 元素还是 元素缺少宽度/高度属性?请注意,到目前为止,使用固定大小的 viewBox 似乎更简单,然后也修复所有路径值。
  • 你是对的,问题是 元素缺少宽度和高度属性,我将在我的答案中添加一个编辑。我可能会说我更喜欢基于 props.width 和 props.height 的 viewBox 和 svg,原因很简单,如果我想要一个矩形按钮并且我的 viewbox 标准尺寸是一个正方形,我最终会得到将不必要的空白空间写入 DOM,即使它没有显示。我认为让两者都依赖于发送的道具更干净:D 谢谢!
猜你喜欢
  • 2010-11-17
  • 2021-04-17
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多