如何防止孩子的内容拉伸父母的宽度

Paw*_*ski 5 css flexbox reactjs

我有一个组件 ( Container),其中包含一个图标(标有X下方)、一个标题和一个Message包含长消息的子组件 ( )。我希望Container's宽度环绕图标和标题,因此它们都在一行上,因为窗口的宽度允许它。

消息组件有一个按钮,可以切换长文本的显示。此文本不应拉伸父级Container,并且应与标题的宽度对齐。消息内容可以在任何时候被破坏和包装:

文本切换关闭

文本切换

我用了flex-grow: 1; width: 0;一个虚拟的风格divMessage的建议 在这里,以防止它的生长。这适用于除 MS Edge 之外的所有浏览器,其中消息内容延伸父级:

边缘

如何在 MS Edge 上解决此问题?是否有仅使用 CSS 的替代方法可以防止消息内容拉伸其父级?

样式.css:

.box {
  display: table;
  margin: auto;
  border: 1px solid black;
}

.container {
  display: flex;
  justify-content: center;
}

.icon {
  margin-right: 10px;
}

.message {
  display: flex;
}

.message > div {
  flex-grow: 1;
  width: 0;
  word-break: break-all;
}
Run Code Online (Sandbox Code Playgroud)

容器.jsx:

export const Container = () => {
  return (
    <div className='box'>
      <div className='container'>
        <div className='icon'>
          X
        </div>
        <div className='content'>
          <div className='title'>
            Some title
          </div>
          <Message>
            Long message that should not make parent wider
          </Message>
        </div>
      </div>
    </div>
  );
}
Run Code Online (Sandbox Code Playgroud)

消息.jsx:

export const Message = ({children}) => {
  const [isExpanded, setExpanded] = React.useState(false);

  const handleClick = () => setExpanded(!isExpanded);

  return (
    <div>
      <div>
        <button onClick={handleClick}>Click</button>
      </div>
      {isExpanded &&
        <div className='message'>
          <div>{children}</div>
        </div>
      }
    </div>
  );
}
Run Code Online (Sandbox Code Playgroud)

Tem*_*fif 12

试试width:0;min-width:100%;消息容器:

.box {
  display: table;
  margin: auto;
  border: 1px solid black;
}

.container {
  display: flex;
  justify-content: center;
}

.icon {
  margin-right: 10px;
}

message {
  display:block;
  width:0;
  min-width:100%;
}
Run Code Online (Sandbox Code Playgroud)
<div class='box'>
  <div class='container'>
    <div class='icon'>
      X
    </div>
    <div class='content'>
      <div class='title'>
        Some title
      </div>
      <message>
        <div>Long message that should not make parent wider</div>
      </message>
    </div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

或者到消息中的 div:

.box {
  display: table;
  margin: auto;
  border: 1px solid black;
}

.container {
  display: flex;
  justify-content: center;
}

.icon {
  margin-right: 10px;
}

message {
  display:block;
}
message  > div {
  width:0;
  min-width:100%;
}
Run Code Online (Sandbox Code Playgroud)
<div class='box'>
  <div class='container'>
    <div class='icon'>
      X
    </div>
    <div class='content'>
      <div class='title'>
        Some title
      </div>
      <message>
        <div>Long message that should not make parent wider</div>
      </message>
    </div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 我花了几个小时试图让预标记发挥作用,包括盒子大小、显示替代方案、宽度等。我不知道为什么会这样,但它成功了。我的问题是,只要我将动态宽度 100% 包含在其父组件中,预标记就会将其宽度泄漏到父组件,依此类推。 (3认同)
  • 谁能解释为什么这有效? (2认同)