使用 css 定位 svg x/y 坐标不适用于 iOS 设备?

Posted

技术标签:

【中文标题】使用 css 定位 svg x/y 坐标不适用于 iOS 设备?【英文标题】:Positioning svg x/y coordinates with css not working with iOS devices? 【发布时间】:2016-11-20 23:21:00 【问题描述】:

根据 css/svg (https://www.w3.org/TR/SVG2/styling.html) 的 W3C 样式指南,我应该能够使用 x/y 属性在 css 中定位某些 svg 元素。

这适用于 chrome + Samsung Galaxy S6(未尝试其他型号/浏览器)。但是,这在 ios 和我尝试过的一些窗口/htc 设备中不起作用。

这是我正在使用的代码(在 d3.js 的帮助下);

<!DOCTYPE html>
<html>

<head>
<meta name="viewport" content="width=device-width">
<meta name="viewport" content="initial-scale=1, maximum-scale=1.5">
<script data-require="d3@4.0.0" data-semver="4.0.0" src="https://d3js.org/d3.v4.min.js"></script>

    <style>
        @media handheld,
        screen and (max-width: 425px) 
            foreignObject 
                x: 30;
                y: 30;
            
        
    </style>
</head>

<body>
    <script>
        d3.selectAll("body")
            .append("svg")
            .append("foreignObject")
            .attr("width", 30)
            .attr("height", 30)
            .attr('x', 0)
            .attr('y', 0)
            .html("hello")
    </script>
</body>

</html>

这也是代码的plnk。

我想知道是否有任何解决方法?或者是否有人可以推荐另一种为 x/y 添加响应断点的方法?

谢谢

【问题讨论】:

你为什么有handheld?它被 iOS 忽略(我认为)并被定义(我认为)为 哦,还有,foreignObject 没有很好的跨浏览器支持。如果您的目标是良好的报道,我会考虑取消它(和handheld 不适用于 Firefox 47/Ubuntu,但适用于 Chrome/Ubuntu @DavidGilbertson 我尝试删除 handheld 并将 foreignObject 更改为 rect 但不幸的是,iOS 仍然存在同样的问题 @TimB 感谢您在 Firefox 上进行测试 - 修改后的帖子,当我只在 chrome 上进行测试时,我不应该认为它适用于所有浏览器 【参考方案1】:

您所指的功能是 SVG 2。SVG 2 仍处于工作草案阶段。浏览器供应商正在实现功能,但我不会将任何依赖 SVG2 功能的产品投入生产。甚至 caniuse.com 还没有引入“我可以使用 SVG 2”部分。他们是discussing it here。

现在回答你的问题:)

选项 1

如果您只想在页面周围移动整个 SVG 块,那么您可以将 HTML 用于响应式布局并在其中使用 SVG。比如:

  <div class="responsive-wrapper">
    <svg  >
      <rect x="10" y="10"  />
    </svg>
  </div>
  <div class="responsive-wrapper">
    <svg  >
      <rect x="10" y="10"  />
    </svg>
  </div>

然后

.responsive-wrapper 
  border: 1px dashed lightgray;
  width: 100%;


@media screen and (min-width: 500px) 
  .responsive-wrapper 
    float: left;
    width: 48%;
  


rect 
  fill: steelblue;

选项二

https://jsbin.com/xesuma/1

javascript,更复杂,无法很好地扩展。

<svg  >
  <rect id="rect-1" x="10" y="10"  />
</svg>

还有一些讨厌的东西,比如:

var rect1El = document.getElementById('rect-1');
var currentWidth = rect1El.getAttribute('width');

window.addEventListener('resize', function() 
  var newWidth = window.innerWidth > 400 ? 300 : 100;

  if (newWidth !== currentWidth) 
    rect1El.setAttribute('width', newWidth);
    currentWidth = newWidth;
  
);

【讨论】:

以上是关于使用 css 定位 svg x/y 坐标不适用于 iOS 设备?的主要内容,如果未能解决你的问题,请参考以下文章

SVG + css3 动画不适用于链接标记

如何将x,y坐标转换为角度?

css 剪辑路径: url ();不适用于 svg 文件源

带有变换的css关键帧动画不适用于SVG

Vue:使用 scoped 时 CSS 不适用于 D3 的 svg

SVG CSS过渡不适用于`use`元素(Chrome)