Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使HTML元素继承另一个元素的转换_Javascript_Html_Css Transforms_Firefox Addon Webextensions - Fatal编程技术网

Javascript 使HTML元素继承另一个元素的转换

Javascript 使HTML元素继承另一个元素的转换,javascript,html,css-transforms,firefox-addon-webextensions,Javascript,Html,Css Transforms,Firefox Addon Webextensions,我正在构建一个浏览器扩展,它可以在第三方网站的图像上绘制内容。为简单起见,假设它在图像中心绘制了一个大小为(img.width/2,img.height/2)的红色框。例如,请参见此图 我目前正在创建一个红色的,并根据计算的值将其设置为style.width、style.height、style.left和style.top。这种方法似乎很脆弱,因为我总是需要手动处理另一种奇特的变换/动画。例如,我没有考虑旋转或倾斜,如下图所示 有没有办法说我的div应该继承的所有转换,这样无论页面开发人员

我正在构建一个浏览器扩展,它可以在第三方网站的图像上绘制内容。为简单起见,假设它在图像中心绘制了一个大小为
(img.width/2,img.height/2)
的红色框。例如,请参见此图

我目前正在创建一个红色的
,并根据
计算的值将其设置为
style.width
style.height
style.left
style.top
。这种方法似乎很脆弱,因为我总是需要手动处理另一种奇特的变换/动画。例如,我没有考虑旋转或倾斜,如下图所示


有没有办法说我的
div
应该继承
的所有转换,这样无论页面开发人员做什么,我的内容都会随之移动?

好的,这花了一点时间,但我自己解决了

键是一个名为
getComputedStyle
的函数,它在执行所有操作后返回图像的净css转换。您需要正确地将非css转换与此堆栈。我认为你只能在没有CSS的情况下缩放和翻译图像,尽管这很简单

// get the CSS transform and it's origin
const cssProps = window.getComputedStyle(image);
const transformOrigin = cssProps["transformOrigin"]
const transform: cssProps["transform"]

// get the HTML scaling and translation
const left = image.offsetLeft;
const top = image.offsetTop;
const width = image.width;
const height = image.height;

// create a new element and set it's color
const elem = document.createElement('div');
elem.style.zIndex = 10; 
elem.style.border = 'solid red 2px';
elem.style.position = 'absolute';

// set the css transform and origin
elem.style.transformOrigin = basePos.transformOrigin;
elem.style.transform = `${basePos["transform"]} translate(${left}px, ${top}px)`;
elem.style.width  = `${width/2}px`;
elem.style.height = `${height/2}px`;

这种方法的唯一缺点是必须等待页面完成加载,然后才能使用
getComputedStyle

,所以我觉得这有点过头了。Idk如果您尝试了这个,但是使包含整个旋转窗口的div相对,然后执行类似的操作也会起作用

html:

<body> <!-- or whatever the parent is of the whole view -->
  <div class="overlay-window">
    <div class="image-overlay">
    </div>
  </div>
</body>
body {
  position: relative;
  .overlay-window {
    bottom: 0;
    left: 0;
    position: absolute:
    right: 0;
    top: 0;
    .image-overlay {
      // add grid styling in the parent of this to position your 
      // image outline or however you want to position it here
    }
  }
}

即使只是制作覆盖层,也可以消除对javascript内容的需要。这应该可以避免旋转的需要,因为它实际上是旋转物体的一部分。

我会说,这是一个非常详细的解决方案,但我自己也没有尝试解决它。您是否尝试使用flex或grid指令并覆盖它?也就是说,创建一个覆盖并对其应用no select,然后对整个窗口应用绝对div。在该分区中使用这些指令定位此对象。我添加了自己的非javascript解决方案,因此您不必在javascript中处理旋转。我对HTML/CSS非常陌生,不理解您使用的概念。我的一个高级问题是,它如何知道我指的是页面上的哪个图像?基本上是这样。有些东西在你的屏幕上旋转,你的问题是你在旋转的东西外面放置了一个覆盖层,所以它不会移动。你需要在旋转的物体内部创建覆盖层。这就是我的答案告诉你的方法。否则,在放置覆盖层的方式上不做任何更改,只需将其放在允许覆盖旋转元素的部分中即可。