如何为元素组实现类似text-overflow:ellipsis的CSS溢出省略效果?
实现自适应进度标题栏(带省略号与展开按钮)
HTML 结构
<div class="progress-titles-wrapper"> <div class="titles-container"> <a href="#" class="progress-title">Earned</a> <a href="#" class="progress-title">Sick</a> <a href="#" class="progress-title">Annual</a> <a href="#" class="progress-title">Earned</a> <a href="#" class="progress-title">Sick</a> <a href="#" class="progress-title">Annual</a> <a href="#" class="progress-title">Earned</a> <a href="#" class="progress-title">Sick</a> <a href="#" class="progress-title">Annual</a> <a href="#" class="progress-title">Earned</a> <a href="#" class="progress-title">Sick</a> <a href="#" class="progress-title">Annual</a> </div> <div class="seeMore d-flex align-items-center"> <a href="#">See More</a> </div> </div>
需求说明
需要实现以下效果:
- 根据屏幕宽度自动显示部分
.progress-title元素,超出容器宽度的元素隐藏,并在末尾显示省略号(...) - 始终保留最后的「See More」按钮,点击该按钮可展开显示全部标题元素
当前使用的 CSS 无法实现预期效果,以下是完整解决方案:
解决方案
1. CSS 布局与截断样式
.progress-titles-wrapper { display: flex; align-items: center; width: calc(100% - 200px); gap: 10px; /* 标题与按钮的间距 */ } .titles-container { display: flex; flex-wrap: nowrap; overflow: hidden; position: relative; flex: 1; min-width: 0; /* 确保容器能随父元素收缩 */ } /* 省略号样式 */ .titles-container.truncate::after { content: "..."; position: absolute; right: 0; top: 0; bottom: 0; display: flex; align-items: center; padding-left: 10px; background-color: #fff; /* 用背景色覆盖后方被截断的标题 */ } .progress-title { white-space: nowrap; margin-right: 10px; text-decoration: none; color: #333; } .seeMore { white-space: nowrap; cursor: pointer; } /* 展开状态样式 */ .progress-titles-wrapper.expanded .titles-container { overflow: visible; flex-wrap: wrap; } .progress-titles-wrapper.expanded .titles-container::after { display: none; }
2. JavaScript 交互逻辑
const wrapper = document.querySelector('.progress-titles-wrapper'); const seeMoreBtn = wrapper.querySelector('.seeMore a'); const titlesContainer = wrapper.querySelector('.titles-container'); // 判断是否需要显示省略号 function checkTruncate() { const isOverflow = titlesContainer.scrollWidth > titlesContainer.clientWidth; titlesContainer.classList.toggle('truncate', isOverflow); seeMoreBtn.textContent = isOverflow ? 'See More' : 'See Less'; } // 切换展开/收起状态 seeMoreBtn.addEventListener('click', (e) => { e.preventDefault(); wrapper.classList.toggle('expanded'); seeMoreBtn.textContent = wrapper.classList.contains('expanded') ? 'See Less' : 'See More'; }); // 窗口 resize 时重新判断截断状态 window.addEventListener('resize', checkTruncate); // 初始化检查 checkTruncate();
效果说明
- 页面加载和窗口尺寸变化时,自动检测标题容器是否溢出,溢出则显示省略号
- 点击「See More」按钮,标题容器会展开并换行显示所有元素,按钮文字变为「See Less」
- 点击「See Less」按钮,容器恢复截断状态,重新显示省略号
内容的提问来源于stack exchange,提问作者Yousef Salama
相关产品推荐
相关产品推荐

