You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Streamlabs聊天框组件Flex元素布局问题求助

解决Streamlabs聊天框布局与文本溢出问题

问题描述

第一次给Streamlabs聊天框编写CSS时遇到了两难问题:

  • 用Flex实现心形装饰和分隔线始终靠左后,长单词会溢出消息容器
  • 添加word-break: break-word控制溢出,又会导致短单词(如"hey")被强制拆分,仅3个单词就出现不必要的换行

错误表现:

  • 未使用word-break: break-word:长单词直接超出消息框边界
  • 使用word-break: break-word:短单词被拆分,文本布局混乱

解决方案

通过调整Flex结构和文本换行规则,同时保留装饰元素的靠左定位,以下是关键修改:

1. 重构消息容器的Flex布局

将.message的Flex方向改为反向排列,让心形装饰固定在左侧,文本内容自动占据剩余空间:

#log .message {
  display: flex;
  flex-direction: row-reverse; /* 反向排列,心形在左,文本在右 */
  justify-content: flex-end; /* 文本靠左对齐 */
  background: #FFF2F2; 
  width: 100%; /* 确保容器占满可用空间 */
  min-width: 40%;
  max-width: 90%;
  padding: 20px;
  border: 5px solid #FF4E6B;
  outline: 2px solid #FF4E6B;
  outline-offset: 5.5px;
  border-radius: 25px;
  margin-bottom: 15px;
  color: #FF4E6B;
  font-size: 20px;
  text-align: left; /* 替换justify,避免文本两端对齐导致的空隙 */
}

2. 优化文本换行规则

移除word-break: break-word,改用更智能的换行属性,仅在单词过长时拆分:

#log .message {
  /* 替换原word-break */
  overflow-wrap: break-word; /* 仅当单词超出容器时拆分 */
  hyphens: auto; /* 自动添加连字符,优化长单词换行(需浏览器支持) */
}

3. 调整容器与分隔线的Flex属性

修正.message-container和.separator的属性,避免容器被过度压缩:

.message-container {
  z-index: 0;
  display: flex;
  flex: 1; /* 自适应剩余空间,替代固定width:90% */
}

.separator {
  flex: 1; /* 填充文本与心形之间的空隙 */
  background: blue;
}

4. 修正心形装饰的定位

把绝对定位改为相对定位,配合Flex反向排列确保位置正确:

.divisor {
  display: flex;
  flex: 0 0 40px;
  background: green;
  border-left: 5px dotted #FF7F95;
  align-items: center;
  justify-content: center;
  position: relative;
  margin-left: -10px; /* 微调对齐分隔线 */
}

.heart01{
  position: relative;
  margin: 0;
}

.heart02{
  position: relative;
  margin: 0;
}

修改后的完整CSS代码

/* GLOBAL BOX */

@import url('https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap');

*{
  box-sizing: border-box;
}

html, body {
  height: 100%;
  overflow: hidden;
}

/* BODY */

body {
  font-family: 'Montserrat';
  font-weight: 700;
  line-height: 1.5em;
}

/* MESSAGE CONTAIN */

#log>div {
  animation: fadeInUp 0.4s ease-in-out forwards, fadeOut 0.25s ease {message_hide_delay};
  -webkit-animation: fadeInUp 0.4s ease-in-out forwards, fadeOut 0.25s ease {message_hide_delay};
  padding-bottom: 10px;
}

.colon {
  display: none;
}

#log{
  display: table;
  position: absolute;
  table-layout: fixed;
    bottom: 0;
    left: 0;
    padding: 0 10px 10px;
  width: 100%;
}

#log>div{
  display: block;
}

#log>div .deleted{
  visibility: hidden;
}

/* EMOTES PROPERTIES */

#log .emote {
  position: relative;
  background-size: contain;
  background-position: center;
  background-repeat: no-repeat;
  background: #F0F0F0;
  padding: 0.4em 0.2em;
}

#log .emote img {
   display: inline-block;
   height: 1em;
   opacity: 0;
}

/* MESSAGE PROPERTIES */

#log .meta,#log .message {
  display: block;
}

.badge {
  display: none;
}

#log .meta {
  z-index: 1;
  position: relative;
  background: #FF4E6B;
  width: fit-content;
  border-radius: 15px;
  font-size: 20px;
  text-transform: uppercase;
  text-align: center;
  padding: 10px 20px;
  margin-top: -2px;
}

#log .name{
  color: #FFFFFF;
}

.container{
  display: flex;
  width: 100%;
  column-gap: 20px;
  margin: -20px 0px 0px 20px;
}

.thread {
  border: none;
  border-left: 7.5px dotted #FF4E6B;
  margin-top: 2.5px;
}

.message-container {
  z-index: 0;
  display: flex;
  flex: 1;
}

#log .message {
  display: flex;
  flex-direction: row-reverse;
  justify-content: flex-end;
  background: #FFF2F2; 
  width: 100%;
  min-width: 40%;
  max-width: 90%;
  padding: 20px;
  border: 5px solid #FF4E6B;
  outline: 2px solid #FF4E6B;
  outline-offset: 5.5px;
  border-radius: 25px;
  margin-bottom: 15px;
  color: #FF4E6B;
  font-size: 20px;
  text-align: left;
  overflow-wrap: break-word;
  hyphens: auto;
 }

.separator {
  flex: 1;
  background: blue;
}

.divisor {
  display: flex;
  flex: 0 0 40px;
  background: green;
  border-left: 5px dotted #FF7F95;
  align-items: center;
  justify-content: center;  
  position: relative;
  margin-left: -10px;
}

.heart01{
  position: relative;
  margin: 0;
}

.heart01::before, .heart01::after {
  position: absolute;
  content: "";
  background: #FF7F95;
  height: 20px;
  width: 12.5px;
  border-radius: 20px 20px 0px 0px;
}

.heart01::before {
  transform: rotate(-45deg);
  transform-origin: 0 100%;
}

.heart01::after {
  transform: rotate(45deg);
  transform-origin: 100% 100%;
  margin-left: -12px;
}

.heart02{
  position: relative;
  margin: 0;
}

.heart02::before, .heart02::after {
  position: absolute;
  content: "";
  background: #FFF2F2;
  height: 14px;
  width: 6.5px;
  border-radius: 20px 20px 0px 0px;
}

.heart02::before {
  transform: rotate(-45deg);
  transform-origin: 0 100%;
}

.heart02::after {
  transform: rotate(45deg);
  transform-origin: 100% 100%;
  margin-left: -5.5px;
}

HTML代码无需修改,保持原结构即可。

内容的提问来源于stack exchange,提问作者Ryo Assandri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 22:47:31