SVG 的绝对定位导致内部路径元素移动到其包含元素之外

Posted

技术标签:

【中文标题】SVG 的绝对定位导致内部路径元素移动到其包含元素之外【英文标题】:Absolute positioning of SVG causes the inner path elements to move outside their containing element 【发布时间】:2020-01-08 22:13:16 【问题描述】:

我有一个简单的 CollapseIcon React 组件,它本质上是由 Circle 样式组件包裹的两个 SVG 路径(形成一个箭头)。

它在我将它放在页面上的任何位置都可以完美运行...除非我选择使用 postion: absolute 来放置它。例如,我需要将它对齐在其容器的右上角。我尝试了position: absolute(与top: 0right: 0),我还尝试了float: rightmargin-top: -50px。在这两种情况下,箭头都迁移到了圆形边界之外。

这是图标的简化 React 代码:

return (
      <Circle  justify="center" alignItems="center"
          onClick=toggleSelect
          name="collapse"
          ...props
        >
          <Icon viewBox="0 0 18 10" xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink"
            ...props
          >
            <g id="Style-Guide" strokeWidth="1" fill="none" fillRule="evenodd" strokeLinecap="round">
              <g id="Style-Guide---Elements" transform="translate(-198.000000, -3941.000000)" stroke="#686868" strokeWidth="2">

                <RotateGroup ...props id="Collapse-Arrow-Small">
                  <Path ...props d="M0.727272727,7.33333333 L8.03627318,0.633416253" id="Line-2"></Path>
                  <Path ...props d="M8,7.33333333 L15.3090005,0.633416253" id="Line-2-Copy" transform="translate(11.636364, 4.000000) scale(-1, 1) translate(-11.636364, -4.000000) "></Path>
                </RotateGroup>
              </g>
            </g>
          </Icon>
        </Circle>
    )

const Circle = styled(FlexContainer)`
  width: 32px;
  height: 32px;
  border-radius: 18px;
  border: 2px solid $colors.primary700;

const Path = styled.path`
  fill: none;
  stroke: $colors.primary700;
`;

const Icon = styled.svg`
  width: 18px;
  height: 10px;

  &:disabled $Path 
    stroke: $colors.primary300;
  
`

这就是我试图放置图标的位置:

  <Section flexDirection="column">
    <SectionTitle>My Food Preferences</SectionTitle>
    <Collapsible trigger=<StyledCollapseIcon/>>
      <FoodPrefsForm />
    </Collapsible>
  </Section>

const StyledCollapseIcon = styled(CollapseIcon)`
  position: absolute;
  top: 0;
  right: 0

  $'' /* float: right;
  margin-top: -50px; */
`

【问题讨论】:

【参考方案1】:

absolute 定位是绝对的,相对到最近的position: relative 祖先。给圈子position: relative 看看能不能解决问题。

CSS Tricks 有一个great article that explains this。

【讨论】:

Circle 组件是设置position: absolute 的 StyledCollapseIcon 组件的后代。但我尝试将所有后代设置为 position: relative 和 position: absolute ,但都没有帮助。

以上是关于SVG 的绝对定位导致内部路径元素移动到其包含元素之外的主要内容,如果未能解决你的问题,请参考以下文章

相对定位与绝对定位

相对定位与绝对定位的理解

5.16

层模型--绝对定位(position:absolute)

17 css定位

解析什么是绝对定位,相对定位与浮动