【问题标题】:CSS3 - Select SVG group siblingCSS3 - 选择 SVG 组兄弟
【发布时间】:2022-01-22 01:09:48
【问题描述】:

在一个 React 应用程序中,我从一个组件返回一个 SVG 标记。 SVG 由一个环和围绕它的一组元素组成。每个组都包含一个形状(圆形或矩形)和一个路径,该路径描绘了一个覆盖和标识该形状的数字。

对于一个最小的工作示例: https://codepen.io/notthelewis/pen/gOGRZQQ

每个组可以是活动的或非活动的。在非活动状态下,我希望形状的背景颜色在 hover 时改变,但我希望路径的填充保持相同的颜色。 codepen 的当前行为在悬停在形状本身上时有效,但在悬停在形状内部的路径(数字)元素上时恢复;这意味着形状的填充恢复为默认值,而不是选择的悬停颜色。

环顾四周,我尝试了一些解决方案,但无法让选择器完全按照我的意愿执行。

推测:

  • .inactive path:hover 应该以某种方式定位:is(rect, circle) 包含在同一组中
  • .inactive path 的 stroke 属性不受影响。

我尝试了以下方法(无济于事!):

.inactive ~ path:hover {
  fill: red; 
}

.inactive path:hover ~ {
  fill: red;
}

.inactive path:hover+rect {  
  fill: red; 
}

.inactive :is(rect, circle)+path:hover {
  fill: red; 
}

我确实找到了has 选择器,但它似乎没有在任何有意义的地方被采用... https://caniuse.com/css-has

在这个 SO 问题中提供的 general successor 选择器答案旁边还提到了 has 选择器: Is there a "previous sibling" selector?

【问题讨论】:

  • 你为什么使用极其复杂的<path>而不是<text>
  • SVG 新手,从 Figma 生成基础图像,这就是他们出来的样子
  • 为什么不只是g.inactive:hover rect { fill: grey; } - 或者我错过了什么?
  • 因此,当悬停在文本上时,悬停离开rect 并选择path,因此形状上的填充恢复为白色。示例中 CSS 的第 5 行和第 6 行我完全按照您在其中提到的那样做,但是如果您将鼠标悬停在该形状中包含的文本上,这就是问题所在。
  • 其实,忽略那个......你是对的!我选择的是特定元素而不是组:')

标签: css svg


【解决方案1】:

:hover 放在<g> 上,而不是<g> 的后代:

g.inactive:hover > rect,
g.inactive:hover > circle {
    fill: grey;
}

另外,用<text> 元素替换用于表示文本的巨大 <path> 元素:

之前

<svg width="468" height="304" viewBox="0 0 468 304" fill="none" xmlns="http://www.w3.org/2000/svg">
    <g id="Sensors">
      <circle id="Sensor Ring" cx="228" cy="154" r="149" stroke="black" strokeWidth="2"/>
      <g id="6" class='inactive'>
        <rect id="6_sensor" x="80" y="203" width="20" height="20" fill="white" stroke="black" strokeWidth="2"/>
        <path id="6_tag" d="M86.9941 213.561C86.9941 211.866 87.3516 210.604 88.0664 209.776C88.7852 208.948 89.8594 208.534 91.2891 208.534C91.7773 208.534 92.1602 208.563 92.4375 208.622V210.069C92.0898 209.991 91.7461 209.952 91.4062 209.952C90.7852 209.952 90.2773 210.046 89.8828 210.233C89.4922 210.421 89.1992 210.698 89.0039 211.065C88.8086 211.432 88.6934 211.954 88.6582 212.63H88.7344C89.1211 211.966 89.7402 211.634 90.5918 211.634C91.3574 211.634 91.957 211.874 92.3906 212.354C92.8242 212.835 93.041 213.499 93.041 214.346C93.041 215.261 92.7832 215.985 92.2676 216.52C91.752 217.052 91.0371 217.317 90.123 217.317C89.4902 217.317 88.9375 217.171 88.4648 216.878C87.9961 216.585 87.6328 216.157 87.375 215.595C87.1211 215.032 86.9941 214.354 86.9941 213.561ZM90.0879 215.87C90.4746 215.87 90.7715 215.741 90.9785 215.483C91.1855 215.221 91.2891 214.85 91.2891 214.37C91.2891 213.952 91.1914 213.624 90.9961 213.386C90.8047 213.143 90.5137 213.022 90.123 213.022C89.7559 213.022 89.4414 213.141 89.1797 213.38C88.9219 213.618 88.793 213.895 88.793 214.212C88.793 214.677 88.9141 215.069 89.1562 215.389C89.4023 215.71 89.7129 215.87 90.0879 215.87Z" fill="black"/>
      </g>

之后

<svg width="468" height="304" viewBox="0 0 468 304" fill="none" xmlns="http://www.w3.org/2000/svg">
    <g id="Sensors">
      <circle id="Sensor Ring" cx="228" cy="154" r="149" stroke="black" strokeWidth="2"/>
      <g id="6" class='inactive'>
        <rect id="6_sensor" x="80" y="203" width="20" height="20" fill="white" stroke="black" strokeWidth="2"/>
        <text>6</text>
      </g>

(不过你需要设置字体大小)。

【讨论】:

    猜你喜欢
    • 2012-08-02
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多