gpt4 book ai didi

javascript - SVG 调整大小有这么难吗?我缺少什么?

转载 作者:行者123 更新时间:2023-12-03 05:20:17 27 4
gpt4 key购买 nike

我正在尝试编写代码来调整图像顶部的 SVG 覆盖层的大小。我正在使用的服务器返回图像并通过 API 返回我需要覆盖在图像顶部的多边形点列表。

这就是它应该的样子(下图是正确对齐的 SVG 图层)。图像尺寸为1280x720(我已将其缩小) enter image description here

我需要在我的应用程序(ionic v1 应用程序)中做的是确保 SVG 覆盖层随着浏览器窗口大小的调整而调整,这似乎非常困难。这是我的方法:

我正在捕获窗口调整大小事件,当调整图像大小时,我相对于绘制窗口的大小缩放 SVG 多边形点,因为似乎确实没有办法通过浏览器“自动”缩放 SVG,例如它对图像起作用。

Here is my code pen如您所见,当我重新缩放时,它无法按预期工作(就此而言,当其完整尺寸时,覆盖不准确)。叠加看起来不准确,当我调整大小时,一切都变得一团糟。有人可以帮忙吗?

鉴于 SO 需要一个用于 codepen 链接的代码块,但如果您想运行它,查看 codepen 会更容易

CSS:

.imagecontainer{position:relative; margin:0 auto;}

.zonelayer
{
position:absolute;
top:0;
left:0;
background:none;

}

.zonelayer polygon {
fill-opacity: 0.25;
stroke-width: 2px;
}

.Active {
stroke: #ff0000;
fill: #ff0000;
}

HTML 代码:

<ion-content>
image:{{disp}}<br/>
<small>points: <span ng-repeat="item in zoneArray">{{item}}</span></small>
<div class="imagecontainer">

<img id="singlemonitor" style="width:100vw; height:100vh;object-fit:contain" ng-src="http://m9.i.pbase.com/o9/63/103963/1/164771719.2SfdldRy.nphzms.jpeg" />
<div class="zonelayer">
<svg ng-attr-width="{{cw}}" ng-attr-height="{{ch}}" class="zonelayer" ng-attr-viewBox="0 0 {{cw}} {{ch}}">
<polygon ng-repeat="item in zoneArray" ng-attr-points="{{item}}" class="Active"/> </polygon>

</svg>
</div>
</div>

</ion-content>

JS Controller :

window.addEventListener('resize', liveloaded);
liveloaded();
// credit: http://stackoverflow.com/questions/41411891/most-elegant-way-to-parse-scale-and-re-string-a-string-of-number-co-ordinates?noredirect=1#41411927
function scaleCoords(string, sx, sy) {
var f = [sx, sy];
return string.split(' ').map(function (a) {
return a.split(',').map(function (b, i) {
return Math.round(b * f[i]);
}).join(',');
}).join(' ');
}

function liveloaded()
{

$timeout (function () {
console.log ("IMAGE LOADED");
var img =document.getElementById("singlemonitor");

//var offset = img.getBoundingClientRect();
$scope.cw = img.clientWidth;
$scope.ch = img.clientHeight;
$scope.vx = img.offsetWidth;
$scope.vy = img.offsetHeight;

var rect = img.getBoundingClientRect();
//console.log(rect.top, rect.right, rect.bottom, rect.left);
$scope.disp = img.clientWidth+ "x"+img.clientHeight + " with offsets:"+$scope.vx+"/"+$scope.vy;

$scope.zoneArray = [
"598,70 700,101 658,531 516,436",
"531,243 687,316 663,593 360,717 191,520",
"929,180 1108,248 985,707 847,676",
"275,17 422,45 412,312 271,235",
];

var ow = 1280;
var oh = 720;

for (var i=0; i < $scope.zoneArray.length; i++)
{
var sx = $scope.cw/ow;
var sy = $scope.ch/oh;
$scope.zoneArray[i] = scaleCoords($scope.zoneArray[i],sx,sy);
console.log ("SCALED:"+$scope.zoneArray[i]);
}


});
}

最佳答案

您的代码存在一些问题。

主要问题是你不能使用ng-attr-viewBox,因为 Angular 会将属性“规范化”为小写。它将属性转换为(当前)无效的 viewbox (小写 B)。 viewBox 区分大小写。

解决方案是使用 Angular 的特殊技巧来保留驼峰式大小写。如果您使用 ng-attr-view_box,它将生成 viewBox 的正确驼峰式命名的属性名称。

<svg width="100vw" height="100vh" class="zonelayer" ng-attr-view_box="0 0 {{cw}} {{ch}}">

另一件事是您使用了错误的 viewBox 宽度和高度值。您需要在 viewBox 中使用自然/固有图像尺寸。

$scope.cw = img.naturalWidth;
$scope.ch = img.naturalHeight;

Link to updated code pen

关于javascript - SVG 调整大小有这么难吗?我缺少什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41416484/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com