【问题标题】:Inconsistent hover state for SVG circle when using different positions使用不同位置时 SVG 圆的悬停状态不一致
【发布时间】:2016-07-13 23:10:12
【问题描述】:

首先,我是前端编码的新手,所以请原谅显而易见的问题(如果问题是这样的话)。

在过去的几天里,我一直在尝试使用 SVG 圆圈,并且在这方面度过了一段糟糕的时光。目的是对齐 3 个 SVG 圆圈(页面中心的一个小圆圈和每侧的两个大圆圈)。我今天终于实现了,但是悬停状态行为现在表现得很奇怪(我发誓这永远不会结束)。

以下是相关代码:

     <div id = "nodes">

     <!--         <object id = "about_nodes">
        <embed id = "left_about_svg" src = "resources/node-images/left-about-subnode.svg" type = "image/svg-iml"></embed>
        <embed id = "about_svg" src = "resources/node-images/about-node.svg" type = "image/svg-iml"></embed>
        <embed id = "right_about_svg" src = "resources/node-images/right-about-subnode.svg" type = "image/svg-iml"></embed>
     </object>-->

     <div id = "about_node">
         <object>
             <embed id = "about_svg" src = "resources/node-images/about-node.svg" type = "image/svg-iml"></embed>
         </object>
     </div>

     <div id = "left_about_subnode">
         <object>
             <embed id = "left_about_svg" src = "resources/node-images/left-about-subnode.svg" type = "image/svg-iml"></embed>
         </object>
     </div>

     <div id = right_about_subnode>
         <object>
             <embed id = "right_about_svg" src = "resources/node-images/right-about-subnode.svg" type = "image/svg-iml"></embed>
         </object>
     </div>

如您所见,有一些被注释掉的 HTML。我正在试验不同级别的容器,看看这是否是问题所在。不是。

CSS:

#about_svg{
display: inline;
position: absolute;
width: 10%;
height: 10%;
left: 50%;
margin-top: 2%;
-moz-transform: translateX(-50%);
-webkit-border-radius: 100%;
-moz-border-radius: 100%;
border-radius: 100%;
text-align: center;
}

#left_about_svg{
display: inline;
position: absolute;
width: 65%;
height: 65%;
left: 25%;
top: 3%;
-moz-transform: translateX(-50%);
-webkit-border-radius: 100%;
-moz-border-radius: 100%;
border-radius: 100%;
text-align: center;
}

#right_about_svg{
display: inline;
position: absolute;
width: 65%;
height: 65%;
left: 75%;
top: 3%;
-moz-transform: translateX(-50%);
-webkit-border-radius: 100%;
-moz-border-radius: 100%;
border-radius: 100%;
text-align: center;
}

还有 SVG:

<svg version="1.1" id="about_node" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
 viewBox="-0.531 -0.583 25.063 25.114" preserveAspectRatio="xMidYMid meet"
 style="enable-background:new -0.531 -0.583 25.063 25.114;" xml:space="preserve">

<defs>
    <style type="text/css">

    .circle{
        fill:white;
        stroke:#000000;
        stroke-miterlimit:10;}

    #about_node:hover .circle{
        fill: red;
        transition: 1s;
        stroke: red;
    }
    </style>
</defs>
<circle class = "circle" cx="12" cy="12" r="12"/>

目前所有 3 个圆圈的 SVG 基本相同(左右圆圈没有悬停状态)所以我只发布这个。

基本上,我发现绝对定位会导致我的嵌入对象在我的圆圈周围有一个大的矩形框(当我使用inspect element时观察到) (大约 3 个直径长)。小居中的左侧和右侧的较大的遮挡了居中的悬停状态。

如果我满足以下条件,则悬停状态有效:

1) 将我的所有圆圈混合在一起,将窗口缩小一半(我需要解决的另一个问题),我可以触摸小圆圈的尖端并改变它的颜色。

2) 去掉中间的左右两个大圆圈。但是,这会将悬停状态置于嵌入对象的大矩形上,而不是圆形本身。

3) 将所有内容更改为相对定位,所有内容都搞砸了,但圆圈的悬停状态正常工作,嵌入对象框变为正方形

这似乎归结为绝对定位。但是,我不能使用相对,因为我失去了可伸缩性并且不可能定位元素(至少对我来说)。

有谁知道我做错了什么?天哪,我只想要三个具有悬停功能的圆圈!为什么这么难!?

【问题讨论】:

  • 如果没有一个有效的例子——甚至是一张图片,就很难理解你想要实现的目标。你的宽度看起来很奇怪。 65%+10%+65% > 100%。你为什么要给你的 SVG 一个边界半径?另外,您的 SVG 是外部的是否有原因?
  • 抱歉,这些高度和宽度值不是容器元素的百分比吗?所以 50% 的宽度会在水平方向占据容器的一半,50% 的高度会在垂直方向占据容器的 50%。我想因为它是一个圆圈,我只需要一个,但我认为它不必总和为 100%。并非所有浏览器都支持内联 svg,因此是外部的。

标签: svg hover positioning geometry absolute


【解决方案1】:

这是你追求的那种东西吗?

Plunker demo

HTML

<object class="svg-left"
        type="image/svg+xml" data="circle.svg"></object>
<object class="svg-middle"
        type="image/svg+xml" data="circle.svg"></object>
<object class="svg-right"
        type="image/svg+xml" data="circle.svg"></object>

CSS

.svg-left {
  position: absolute;
  width: 200px;
  height: 200px;
  left: 0px;
  top: 100px;
}

.svg-middle {
  position: absolute;
  width: 100px;
  height: 200px;
  left: 200px;
  top: 100px;
}

.svg-right {
  position: absolute;
  width: 200px;
  height: 200px;
  left: 300px;
  top: 100px;
}

SVG

<svg version="1.1" id="about_node" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
 viewBox="-0.531 -0.583 25.063 25.114" preserveAspectRatio="xMidYMid meet">

<defs>
    <style type="text/css">

    .circle{
        fill:white;
        stroke:#000000;
        stroke-miterlimit:10;}

    .circle:hover{
        fill: red;
        transition: 1s;
        stroke: red;
    }
    </style>
</defs>
<circle class = "circle" cx="12" cy="12" r="12"/>
</svg>

【讨论】:

  • 很抱歉没有上传图片,但您在这个演示中得到了正确的想法。你也帮我发现了一个错误。我有一个边界半径的原因是因为最初悬停状态是响应 about_node 的视图框(“#about_node: hover .circle{...}”)。边界半径解决了这个问题,尽管我认为现在没有必要了。另外,我不喜欢使用像素,因为它无法缩放。
  • 更好地了解我想要的方式:plnkr.co/edit/8BfhejxyTPQRK3LFtFnn?p=preview 但是请注意,您压缩的部分越多,元素变得越古怪。也许这是意料之中的,我只是不知道,但是我如何在不丢失圆圈的内联布局的同时保持可伸缩性?
  • 忽略该链接。如果是圆形,则需要同时指定高度和宽度:plnkr.co/edit/8BfhejxyTPQRK3LFtFnn?p=preview
  • 你受限于你对每个圈子绝对定位的坚持。当每个 SVG 都具有与其他东西(页面)相关的大小和位置时,您不能轻易地将 SVG 保持在相对于彼此的相同位置。如果您需要它们相对于彼此保持相同的位置,最简单的方法是将所有圆圈放在同一个 SVG 中。
  • 也许你是对的。将它们包含在单个 SVG 元素中然后从那里居中该对象似乎更有意义。我在我刚才一次又一次地实际发布问题之前尝试过这个,但我就是无法实现我想要的。也许我现在对 SVG 感到困惑。现在回到常规的 CSS 形状。
猜你喜欢
  • 2021-01-12
  • 2017-10-13
  • 2013-03-17
  • 2016-12-23
  • 2019-08-21
  • 2021-07-31
  • 1970-01-01
  • 2021-02-24
  • 2017-06-11
相关资源
最近更新 更多