【发布时间】:2021-02-10 23:33:04
【问题描述】:
我有一组标签,我想在客户端显示。但是,有时您可能有太多标签,并且您希望仅显示一行标签最大化到您的身体宽度,而不设置固定数量的列数或项目宽度,并在标签列表末尾添加一个显示更多按钮与标签相同的样式。
我在我的 Angular 项目中使用 Javascript 实现了这一点,方法是:
- 在我的内容容器上使用 ViewChild 动态找出标签容器的宽度:
let contentWidth = this.contentContainer.nativeElement.clientWidth;
- 计算查看更多按钮的文本宽度,并用它计算新的内容宽度减去查看更多按钮宽度:
计算文本函数执行以下操作:
const canvas = document.createElement('canvas'); // create a canvas
const context = canvas.getContext('2d'); // get the context
context.font = '12px avertastd-bold'; // set up your font and size
并计算文字宽度:
const seeMoreButtonWidth = context.measureText(seeMoreButtonText).width;
- 创建一个新的数组变量“previewTags”,该变量将保存标签主体处于折叠状态时可见的标签,并通过计算每个标签的宽度以及您从API 通过检查下一个标签及其填充(静态值)是否适合宽度。
(此处不可运行)
for (const tag of this.data.tags) {
const width = context.measureText(tag).width;
if (contentWidth - (width + this.tagsPadding) > 0) {
previewTags.push({text: tag});
contentWidth -= (width + this.tagsPadding);
} else {
break;
}
}
- 点击
previewTags列表末尾的查看更多按钮:
previewTags.push({text: seeMoreButtonText, isButton: true});
它在 html 中看起来像这样:
<ng-container *ngFor="let tag of previewTags">
<div class="tag" [ngClass]="{'see-more-button': tag.isButton}">{{tag.text}}</div>
</ng-container>
输出:
调整大小:
如您所见,现在标签是灵活的(此代码不包括显示更多功能)。
在向您介绍了这些背景并了解了我的工作之后,我想问一下这是否可以通过 css 或更少的 JavaScript 干预来实现?
【问题讨论】:
-
只有 CSS 的解决方案是让标签容器在标签超过容器宽度时水平滚动。
标签: javascript css angular