英文:
Using a flex container, how can I give a child image its full width while right aligning all of the flex children?
问题
我试图实现这种布局,其中有一张图片,它具有固定的宽度,如果旁边的文本太长,则文本会被截断。我还希望 flex 容器的内容右对齐。
我一直在 https://codepen.io/zeckdude/pen/jOQeRoZ 上进行尝试,当我在段落上设置 flex: 1 以确保图片获得其全宽时,我无法弄清楚如何仍然将所有内容右对齐。不幸的是,我仍然得到了这个结果:
以下是我在 CodePen 中的代码:
.container {
  display: flex;
  flex-direction: column;
  gap: 16px;
  width: 300px;
  padding: 16px;
  background-color: gray;
}
hr {
  width: 100%;
}
.flex-container {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 16px;
  width: 100%;
}
/* 使图像容器占据 50px 宽度 */
.flex-container .image-container {
  width: 50px;
  height: 50px;
  border-radius: 25px;
  overflow: hidden;
}
/* 使图像占据图像容器的全宽和全高 */
.flex-container img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
/* 当空间不足时,使文本截断并显示省略号 */
.flex-container p {
  flex: 1;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
<div class="container">
  <div class="flex-container">
    <div class="image-container">
      <img src="https://picsum.photos/id/64/200" alt="Image">
    </div>
    <p>在这里放置您的长文本,可以一直延续很长时间</p>
  </div>
  <hr />
  <div class="flex-container">
    <div class="image-container">
      <img src="https://picsum.photos/id/64/200" alt="Image">
    </div>
    <p>短文本</p>
  </div>
</div>
一些人建议移除 .flex-container p 上的 flex: 1,但不幸的是,我需要它以确保图像获得其全宽。您可以看到我已将其移除并且图像看起来不正确的屏幕截图:
英文:
I'm trying to achieve this layout where there is an image that is a set width and the text next to it is truncated if it is too long. I also want the content of flex container to be right aligned.
I have been playing with this at https://codepen.io/zeckdude/pen/jOQeRoZ and when I set flex: 1 on the paragraph in order to ensure that the image gets its full width, I can't figure out how to still right align all of the content. Unfortunately, I still end up with this result:
Here's the code that I have in the codepen:
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-css -->
.container {
display: flex;
flex-direction: column;
gap: 16px;
width: 300px;
padding: 16px;
background-color: gray;
}
hr {
width: 100%;
}
.flex-container {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 16px;
width: 100%;
}
/* Make the image container take 50px width */
.flex-container .image-container {
width: 50px;
height: 50px;
border-radius: 25px;
overflow: hidden;
}
/* Make the image take its full width and height within the image container */
.flex-container img {
width: 100%;
height: 100%;
object-fit: cover;
}
/* Make the text truncate with ellipsis when there's not enough space */
.flex-container p {
flex: 1;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
<!-- language: lang-html -->
<div class="container">
<div class="flex-container">
<div class="image-container">
<img src="https://picsum.photos/id/64/200" alt="Image">
</div>
<p>Your long text goes here and can keep going for a long time</p>
</div>
<hr />
<div class="flex-container">
<div class="image-container">
<img src="https://picsum.photos/id/64/200" alt="Image">
</div>
<p>Short text</p>
</div>
</div>
<!-- end snippet -->
Some folks have suggested removing the flex: 1 on the .flex-container p but unfortunately I need that there in order to ensure that the image gets to take its full width. You can see that in this screenshot where I have removed it and the image isn't looking correct:
答案1
得分: 1
这是一个不同的解决方案,因为这些内容是动态的。我所做的更改如下:
.flex-container .image-container {
    /* overflow: hidden; */
}
.flex-container img {
    width: 50px;
    height: 50px;
    border-radius: 25px;
}
.flex-container p {
    /* flex: 1; */
}
<div class="container">
  <div class="flex-container">
    <div class="image-container">
      <div class="image-inner-container">
        <img src="https://picsum.photos/id/64/200" alt="Image">
      </div>
    </div>
    <p>Your long text goes here and can keep going for a long time</p>
  </div>
  <hr />
  <div class="flex-container">
    <div class="image-container">
      <div class="image-inner-container">
        <img src="https://picsum.photos/id/64/200" alt="Image">
      </div>
    </div>
    <p style="flex: initial;">Short text</p>
  </div>
</div>
英文:
Here is a different solution as these contents are dynamic. The changes I have made:
.flex-container .image-container {
    /* overflow: hidden; */
}
.flex-container img {
    width: 50px;
    height: 50px;
    border-radius: 25px;
}
.flex-container p {
    /* flex: 1; */
}
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-css -->
    .container {
  display: flex;
  flex-direction: column;
  gap: 16px;
  width: 300px;
  padding: 16px;
  background-color: gray;
}
hr {
  width: 100%;
}
.flex-container {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 16px;
  width: 100%;
}
/* Make the image container take 50px width */
.flex-container .image-container {
  width: 50px;
  height: 50px;
  border-radius: 25px;
  /* overflow: hidden; */
}
/* Make the image take its full width and height within the image container */
.flex-container img {
  width: 50px;
  height: 50px;
  border-radius: 25px;
  object-fit: cover;
}
/* Make the text truncate with ellipsis when there's not enough space */
.flex-container p {
  /* flex: 1; */
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
<!-- language: lang-html -->
<div class="container">
  <div class="flex-container">
    <div class="image-container">
      <div class="image-inner-container">
        <img src="https://picsum.photos/id/64/200" alt="Image">
      </div>
    </div>
    <p>Your long text goes here and can keep going for a long time</p>
  </div>
  <hr />
  <div class="flex-container">
    <div class="image-container">
      <div class="image-inner-container">
        <img src="https://picsum.photos/id/64/200" alt="Image">
      </div>
    </div>
    <p style="flex: initial;">Short text</p>
  </div>
</div>
<!-- end snippet -->
答案2
得分: 1
你可以通过对你的代码进行两个简单的调整来实现这个布局:
.flex-container p {
   /* flex: 1; */ /* 您不需要这个 */
   white-space: nowrap;
   overflow: hidden;
   text-overflow: ellipsis;
}
.flex-container .image-container {
   width: 50px;
   height: 50px;
   border-radius: 25px;
   overflow: hidden;
   flex-shrink: 0; /* 新增; 禁用 flex-shrink */
}
.container {
  display: flex;
  flex-direction: column;
  gap: 16px;
  width: 300px;
  padding: 16px;
  background-color: gray;
}
hr {
  width: 100%;
}
.flex-container {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 16px;
  width: 100%;
}
/* 让图像容器占据 50px 的宽度 */
.flex-container .image-container {
  width: 50px;
  height: 50px;
  border-radius: 25px;
  overflow: hidden;
  flex-shrink: 0; /* 新增 */
}
/* 让图像在图像容器内占满整个宽度和高度 */
.flex-container img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
/* 当空间不足时,使用省略号截断文本 */
.flex-container p {
  /* flex: 1; */
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
<div class="container">
  <div class="flex-container">
    <div class="image-container">
      <img src="https://picsum.photos/id/64/200" alt="Image">
    </div>
    <p>Your long text goes here and can keep going for a long time</p>
  </div>
  
  <hr />
  
  <div class="flex-container">
    <div class="image-container">
      <img src="https://picsum.photos/id/64/200" alt="Image">
    </div>
    <p>Short text</p>
  </div>
</div>
你写道:
有些人建议在
.flex-container p上删除flex: 1,但不幸的是,我需要它来确保图像可以占据其全宽度。
flex容器的默认设置是 flex-shrink: 1。这意味着flex项目会自动缩小以避免溢出容器。为了确保图像遵守其定义的宽度,只需禁用 flex-shrink。
英文:
You can achieve the layout with two simple adjustments to your code:
.flex-container p {
   /* flex: 1; */ /* you don't need this */
   white-space: nowrap;
   overflow: hidden;
   text-overflow: ellipsis;
}
.flex-container .image-container {
   width: 50px;
   height: 50px;
   border-radius: 25px;
   overflow: hidden;
   flex-shrink: 0; /* new; disable flex-shrink */
}
<!-- begin snippet: js hide: true console: true babel: false -->
<!-- language: lang-css -->
.container {
  display: flex;
  flex-direction: column;
  gap: 16px;
  width: 300px;
  padding: 16px;
  background-color: gray;
}
hr {
  width: 100%;
}
.flex-container {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 16px;
  width: 100%;
}
/* Make the image container take 50px width */
.flex-container .image-container {
  width: 50px;
  height: 50px;
  border-radius: 25px;
  overflow: hidden;
  flex-shrink: 0; /* new */
}
/* Make the image take its full width and height within the image container */
.flex-container img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
/* Make the text truncate with ellipsis when there's not enough space */
.flex-container p {
  /* flex: 1; */
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
<!-- language: lang-html -->
<div class="container">
  <div class="flex-container">
    <div class="image-container">
      <img src="https://picsum.photos/id/64/200" alt="Image">
    </div>
    <p>Your long text goes here and can keep going for a long time</p>
  </div>
  
  <hr />
  
  <div class="flex-container">
    <div class="image-container">
      <img src="https://picsum.photos/id/64/200" alt="Image">
    </div>
    <p>Short text</p>
  </div>
</div>
<!-- end snippet -->
You wrote:
> Some folks have suggested removing the flex: 1 on the
> .flex-container p but unfortunately I need that there in order to
> ensure that the image gets to take its full width.
A default setting on a flex container is flex-shrink: 1. This means that flex items will automatically shrink to avoid overflowing the container. To ensure that the image respects its defined width, just disable flex-shrink.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。





评论