Angular中的图像放大镜

Posted

技术标签:

【中文标题】Angular中的图像放大镜【英文标题】:Image magnifier in Angular 【发布时间】:2019-10-04 10:12:03 【问题描述】:

我正在尝试在悬停时实现图像放大镜。我尝试像在 w3schools 中一样复制代码,这纯粹是 javascript。我正在尝试在 Angular 中实现以下代码

https://www.w3schools.com/howto/tryit.asp?filename=tryhow_js_image_magnifier_glass

我在 typescript 中使用了上述方法并在 Angular 中从 ngOnInit 调用它,但我无法从该方法中获得任何结果。我已确保正确传递了 id 并验证了该方法正在被调用。但仍然无法得到任何结果。我不希望将任何 npm 包用于放大镜,因为它们中的大多数都有错误。

component.ts

ngOnInit()

 this.magnify(imgID, zoom)

 

magnify(imgID, zoom) 
  var img, glass, w, h, bw;
  img = document.getElementById(imgID);
  /*create magnifier glass:*/
  glass = document.createElement("DIV");
  glass.setAttribute("class", "img-magnifier-glass");
  /*insert magnifier glass:*/
  img.parentElement.insertBefore(glass, img);
  /*set background properties for the magnifier glass:*/
  glass.style.backgroundImage = "url('" + img.src + "')";
  glass.style.backgroundRepeat = "no-repeat";
  glass.style.backgroundSize = (img.width * zoom) + "px " + (img.height * zoom) + "px";
  bw = 3;
  w = glass.offsetWidth / 2;
  h = glass.offsetHeight / 2;
  /*execute a function when someone moves the magnifier glass over the image:*/
  glass.addEventListener("mousemove", moveMagnifier);
  img.addEventListener("mousemove", moveMagnifier);
  /*and also for touch screens:*/
  glass.addEventListener("touchmove", moveMagnifier);
  img.addEventListener("touchmove", moveMagnifier);
  function moveMagnifier(e) 
    var pos, x, y;
    /*prevent any other actions that may occur when moving over the image*/
    e.preventDefault();
    /*get the cursor's x and y positions:*/
    pos = getCursorPos(e);
    x = pos.x;
    y = pos.y;
    /*prevent the magnifier glass from being positioned outside the image:*/
    if (x > img.width - (w / zoom)) x = img.width - (w / zoom);
    if (x < w / zoom) x = w / zoom;
    if (y > img.height - (h / zoom)) y = img.height - (h / zoom);
    if (y < h / zoom) y = h / zoom;
    /*set the position of the magnifier glass:*/
    glass.style.left = (x - w) + "px";
    glass.style.top = (y - h) + "px";
    /*display what the magnifier glass "sees":*/
    glass.style.backgroundPosition = "-" + ((x * zoom) - w + bw) + "px -" + ((y * zoom) - h + bw) + "px";
  
  function getCursorPos(e) 
    var a, x = 0, y = 0;
    e = e || window.event;
    /*get the x and y positions of the image:*/
    a = img.getBoundingClientRect();
    /*calculate the cursor's x and y coordinates, relative to the image:*/
    x = e.pageX - a.left;
    y = e.pageY - a.top;
    /*consider any page scrolling:*/
    x = x - window.pageXOffset;
    y = y - window.pageYOffset;
    return x : x, y : y;
  

【问题讨论】:

【参考方案1】:

根据您的要求,这是一个有效的堆栈闪电战。它显示了 w3school 中提到的图像缩放功能的实现。 https://stackblitz.com/edit/angular-w3school-image-magnification

您尚未显示您的 html 和 css 文件。所以,我不完全确定,但以下可能是缩放不适合您的原因。

问题是 img-magnifier-glass div 元素是使用经典 DOM 方法“document.createElement”创建的。然后,再次使用经典的 DOM 方法 (setAttribute) 对其应用“img-magnifier-glass”类。但是,在角度,样式被封装。因此,如果您在 app.component.css 中添加了“.img-magnifier-glass”的类定义,那么该类将不会应用于 glass div,因为模板中没有提到它 (app.component.html) .请参阅此了解更多信息 - https://github.com/angular/angular/issues/7845

要解决此问题,您可以将类 '.img-magnifier-glass' 的定义移动到 styles.css(其中定义了全局样式)

或者您可以将类保留在 app.component.css 中,但使用伪选择器 ::ng-deep 。将 ::ng-deep 伪类应用于任何 CSS 规则会完全禁用该规则的视图封装。应用 ::ng-deep 的任何样式都将成为全局样式。

::ng-deep .img-magnifier-glass 

或者你可以通过指定来停止组件的样式封装

@Component(
// ...
encapsulation: ViewEncapsulation.None, //<<<<< this one!
styles: [
  // ...
]
)

如果您使用 Renderer2 (https://angular.io/api/core/Renderer2) 代替在这里创建动态元素(如玻璃元素)会更好。 Renderer2 将负责正确封装应用于使用它创建的元素的类。

【讨论】:

【参考方案2】:

我遇到了同样的问题,但对于具有相同放大镜实现的图像缩放器。我通过调整 css 和 ts 代码(取自放大镜并与缩放器相结合)使其工作。上面的答案不是我要找的,因为我需要将缩放后的 img 放在另一个盒子里,而不是放在 img 本身的顶部。这是我修改的stackblitz 代码以满足我的需要。

【讨论】:

【参考方案3】:

要在 Angular 中实现 W3School 和 Amazon 等图像放大功能,您可以使用 npm 包ng-img-magnifier。 这是工作的DEMO。

 <ng-img-magnifier
        [thumbImage]='img' [fullImage]='img2'
        [top]='top' [right]='right'
        [lensWidth]='lensewidth' [lensHeight]='lensheight'
        [imgWidth]='imgWidth' [imgHeight]='imgheight'
        [resultWidth]='resultWidth' [resultHeight]='resultheight'
        >
 </ng-img-magnifier>

此软件包带有完整的自定义选项。

希望这能解决您的问题。

【讨论】:

以上是关于Angular中的图像放大镜的主要内容,如果未能解决你的问题,请参考以下文章

WPS中的图像的放大缩小效果怎样做

是否可以限制路径中特定 :ids 在 Angular 路由中的访问?使用放大/认知

JAVA:放大/缩小时,圆圈被绑定到图像视图中的一个位置

旋转,拖动,放大,缩小Android中的视频和图像

Matlab中怎样将一幅图像放大或缩小至固定的大小

angular js 鼠标移过图片放大,就是放在图片上图片放大 或者反击,