Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.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 如何使用Snap.svg和Angular 5在hover上缩放不同的svg层_Javascript_Html_Angular_Svg - Fatal编程技术网

Javascript 如何使用Snap.svg和Angular 5在hover上缩放不同的svg层

Javascript 如何使用Snap.svg和Angular 5在hover上缩放不同的svg层,javascript,html,angular,svg,Javascript,Html,Angular,Svg,我是SVG的超级高手,所以请容忍我(如果我做错了,请随时纠正我)。我的应用程序内置于Angular 5。我正在玩一个复杂的SVG,它大约有23层。这是因为它是一个包含代表各种输入的框的图形,每个框都必须在悬停或单击上缩放,以指示用户正在选择相应的框 在尝试使用简单的CSS转换(scale,translate)实现缩放后,我意识到svg矩阵和缩放需要我方进行更多的研究和理解,因此决定尝试使用Snap.svg,我读过的这本书非常擅长简化svg的工作 现在我的角5分量看起来像这样: import {

我是SVG的超级高手,所以请容忍我(如果我做错了,请随时纠正我)。我的应用程序内置于Angular 5。我正在玩一个复杂的SVG,它大约有23层。这是因为它是一个包含代表各种输入的框的图形,每个框都必须在
悬停
单击
上缩放,以指示用户正在选择相应的框

在尝试使用简单的CSS转换(scale,translate)实现缩放后,我意识到svg矩阵和缩放需要我方进行更多的研究和理解,因此决定尝试使用
Snap.svg
,我读过的这本书非常擅长简化svg的工作

现在我的角5分量看起来像这样:

import { Component, OnInit } from '@angular/core';
declare const Snap: any;


@Component({
   ...
export class SvgComponent implements OnInit {

constructor(){
}

ngOnInit(){

}

onHover(event) {
    const layer = Snap(event.target.id);
    layer.hover(function() {
       this.animate({ transform: 's1.5,1.5' }, 500);
    }, function() {
       this.animate({ transform: 's1,1' }, 500);
    });
}
HTML如下所示(其中一层):


小夜曲
因此,我得出以下结论:

  • 实现悬停函数OnInit(我先做的)不会 只对第一层设置动画(因此
    layer1
    )。这有点道理, 因为它只发射过一次
  • 悬停
    )或(
    鼠标悬停
    )或任何其他事件绑定似乎不起作用 放置在
    svg
    标记内时工作。作为参考,我阅读并 实现了本文中的一些想法: 这是非常好的,但它清楚地提到了那个事件 绑定在Angular 2中工作。也许在过去发生了一些变化 同时,现在事件绑定不再工作了
  • 任何想法都是非常受欢迎的,因为我现在被卡住了

    以后编辑:
    因此Angular 2+确实支持事件绑定(只要您给它正确的事件名称,显然“hover”不存在)。悬停对应的事件名称是(mouseenter)和(mouseleave)。如果您将它们附加到svg标记上,它们就可以工作。

    您应该能够只使用CSS来做您想要做的事情

    以下内容适用于现代浏览器版本。如果您需要支持较旧的浏览器,那么您可能需要做更多的工作

    .svg层{
    变换框:填充框;
    变换原点:50%50%;
    转变:0.2s转变;
    变换:比例(1,1);
    }
    .svg层:悬停{
    变换:比例(1.5,1.5);
    }
    
    小夜曲
    
    这很好,但我现在有另一个问题:一些悬停在上面的层在缩放时会落后于其他层。我认为这是因为svg本身中的层是如何排序的。因此,也许我不需要原始svg中的层,可以在每个路径上应用转换选项来避免这种讨厌的重叠?要解决这个问题,需要使用JS将层移动到svg的前面(即其他层之后)。不幸的是,SVG还不支持
    z-index
    。有关更多信息,请参阅和。
    <svg:g style="display:inline" class="svg-layer" id="layer1" (hover)="onHover($event)">
      <svg:g id="g4746" style="display:inline" transform="matrix(0.26458333,0,0,0.26458333,-13.055467,-56.894235)">
        <svg:path
          id="path3892"
          d="m 396.86667,292.53333 c -4.59211,0 -9.16503,0.1345 -13.7,0.36667 -4.53498,0.23217 -9.06106,0.57462 -13.53334,1.03333 -4.03511,0.41387 -8.02024,0.93941 -12,1.53334 -6.98255,23.42835 -10.71331,47.22459 -12.26666,71.16666 3.73406,-1.00536 7.41654,-2.14453 11.23333,-2.93333 6.49856,-1.34304 13.12148,-2.34492 19.83333,-3.03333 6.71185,-0.68842 13.54166,-1.06667 20.43334,-1.06667 6.89168,0 13.68815,0.37825 20.4,1.06667 6.71185,0.68841 13.33477,1.69029 19.83333,3.03333 3.82739,0.791 7.52247,1.92458 11.26667,2.93333 -1.55336,-23.94207 -5.28412,-47.73831 -12.26667,-71.16666 -3.99047,-0.59604 -7.98719,-1.11834 -12.03333,-1.53334 -4.47228,-0.45871 -8.99836,-0.80116 -13.53334,-1.03333 -4.53497,-0.23217 -9.07456,-0.36667 -13.66666,-0.36667 z"
          style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#ffffb1;fill-opacity:1;stroke:#000000;stroke-width:2.13333344;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate" />
        <svg:text
         id="text3897"
         y="333.54636"
         x="396.53268"
         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:Tahoma;-inkscape-font-specification:Tahoma;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
         xml:space="preserve"><tspan
           id="tspan3311"
           x="396.53268"
           y="333.54636"
           style="font-size:14.9333334px;line-height:1.25;stroke-width:1.06666672">sereniteit</tspan></svg:text>
      </svg:g>