编写 CSS 时,有时我们会忘记设计中的一些边缘情况。例如,当内容比我们预期的长,而我们没有考虑这种可能性时,我们的设计可能会被破坏。我们无法保证我们的 CSS 始终按预期工作,但至少可以通过测试不同类型的内容来减少这种情况。
当你编写 CSS 时,你是在编写抽象规则,用来处理未知内容并在未知媒介中组织它。– Keith J. Grant
在本文中,我们将浏览来自真实网站的不同 UI 问题,以便我们从一开始就能考虑到它们。准备好了吗?让我们开始吧!
带有在右侧/左侧放置的图标的按钮

这是一个手风琴的切换按钮。右侧有一个图标来强调它是可点击的。但是,当区域不够大时,文本会与图标重叠。当我们没有考虑长内容时,可能会发生这种情况。
解决方案是在右侧添加足够的填充以适应图标的大小
.button {
padding-right: 50px;
}
请注意,增加填充如何为图标创建安全区域。现在我们可以确保如果文本变长,它不会被破坏。

查看 CodePen 上 Ahmad Shadeed (@shadeed) 编写的 带有图标的按钮。
输入占位符
为我们的表单应用 浮动标签模式 时,尤其是在右侧有按钮的情况下。我们应该彻底测试这一点,以避免标签过长时出现任何问题。

解决方案是为按钮添加position: relative
。这会将其移动到标签上方。
查看 CodePen 上 Ahmad Shadeed (@shadeed) 编写的 长占位符。
长名称

在此设计中,图像浮动到左侧,我们在右侧有作者姓名。如果名称比预期长会发生什么?UI 会被破坏。
问题在于我们只将图像浮动到左侧。这可能会导致作者姓名移动到它旁边。但是,只有在名称不长的情况下,这才能正常工作。
为了使其更健壮,我们应该将作者图像float
,并向作者姓名包装器添加overflow: hidden
。这样,我们将获得块级格式化上下文的好处(感谢 Thierry Koblentz 在评论中指出了 这一点)。或者,另一种解决方案是使用 flexbox,因为它适合该小型组件。
查看 CodePen 上 Ahmad Shadeed (@shadeed) 编写的 长的人名。
文章正文中的长链接/单词

有时文章中会出现长链接或单词。对于非常宽的视口,这可能不会导致问题。但是对于较小的尺寸,例如手机或平板电脑,这会导致水平滚动,并且会很烦人。
对于此类问题,我们有两个解决方案
1) 使用 CSS word-break
.article-body p {
word-break: break-all;
}
使用word-break
时请务必进行良好的测试,因为它在不同浏览器之间存在一些差异。我们建议您阅读这篇关于该主题的 文章。
2) 向包装器元素添加溢出,并向链接添加文本溢出
.article-body p {
overflow: hidden;
text-overflow: ellipsis;
}
此解决方案对于链接更安全且更好。但对于单词,我将使用word-break
。

查看 CodePen 上 Ahmad Shadeed (@shadeed) 编写的 长链接/单词。
长文章标签

当我们将文章标签放在卡片上时,我们应该只添加填充以进行间距。确定宽度和高度可能会在标签内容过长时导致 UI 被破坏。
如果你想为标签设置最小宽度,那很好。我们可以使用min-width
以及标签内容周围的填充。这样,宽度将是动态的,问题将得到解决。
查看 CodePen 上 CSS-Tricks (@css-tricks) 编写的 长文章标签。
带有链接的章节标题

在此示例中,我们有一个章节标题以及右侧的“查看更多”链接。在 CSS 中有不同的方法可以编写此代码,其中一种是使用链接的绝对定位。
如果标题过长,这会导致问题。更好的解决方案可能是使用 flexbox。这样,当没有足够的空间时,它会自动将链接推到新的一行。

.header-2 {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
}
上述技术称为“对齐偏移换行”。两年前,我从 这篇文章中学到了它。
查看 CodePen 上 Ahmad Shadeed (@shadeed) 编写的 带有链接的章节标题。
结论
我以艰难的方式了解到,使用虚拟内容或简单地随机添加内容是不够的。我们应该向我们的布局中添加所有类型的内容,直到某些内容被破坏。我喜欢使用 Heydon Pickering 的 forceFeed.js 来随机向特定组件添加内容。
非常有趣的帖子,谢谢 :)
对于浮动图像,您也可以使用 CSS 表格布局,它非常健壮且简单。
我经常看到的另一个例子是使用多列的带有图标的长列表,当内容过长时:文本出现在图标下方,这并不美观。
不错。
我正在寻找解决方案,
如何使弹出框浮动,当网页内容大于窗口大小时。
当背景内容可滚动且弹出窗口经常超出 Windows 预览区域视野时。在这种情况下,用户不幸地必须滚动到弹出框位置进行交互。
我不确定我是否理解,但是你不能使用
position: fixed; top: 0;
吗?给弹出框设置
fixed
定位!“长名称”部分展示了一个“媒体对象”,但没有给出“正确的解决方案”。
为两个元素都设置
width
会创建约束(使用百分比或知道父元素的宽度),而使用flexbox
则没有最佳的浏览器支持。更健壮的方法是将元素旁边的浮动样式化为块级格式化上下文 (BFC)。这具有在所有浏览器(包括 IE6(通过“hasLayout”))中都能正常工作的优点。本文似乎缺少“浮动和 BFC”的功能,因为它主要建议由绝对定位元素触发的错误,而绝对定位元素本身就是一个坏主意。我认为建议
flexbox
是一个简单的解决方案错失了学习良好的旧布局技巧的机会。嗨,Thierry,非常感谢你的评论。
我完全同意你关于使用浮动的观点。我展示了使用
position: absolute
的错误的原因是,我在一些网站上看到了它们,只是想展示一下。例如,如果我想构建类似媒体对象的东西,我会使用浮动,并在需要时用 Flexbox 增强它。
你可能不希望使用
word-break
;它是为了将其他字母整合到 CJK 页面中而设计的,它根据东方的排版规则而不是西方的规则断行。word-wrap
几乎总是更可取的。感谢你的评论,Taylor。
是的,我在我正在开发的一个网站上看到了这种情况。但我的问题是,如何在不使用
word-break
的情况下处理段落中的长单词?我很乐意听听你的想法。word-wrap: break-word;
不能满足你的需求吗?是的!谢谢:)
不错的文章,Ahmad,但根据我的经验,这不是(指的是你的开头)一个“边缘情况”。这是一个非常现实的、令人沮丧的且频繁出现的情况。
如果你添加了一个 Twitter 嵌入式时间线,并且在手机上它太宽了,因为我必须在大视图中设置长度,你会怎么做?它在一个包装器中调整宽度。我似乎无法影响其中一个而不破坏另一个。这是在小型或大型查询上。是否有更好的方法使用 JavaScript?任何参考链接都将很棒。
根据[url=https://dev.twitter.com/web/embedded-timelines]dev.twitter 上的嵌入式时间线代码[/url],嵌入似乎是响应式的。当我缩小浏览器窗口时,嵌入会相应调整。
也许你的嵌入代码过时了?
对于 .card .author,你可以添加 overflow:hiddean 而不是 float:left。重要的是 author 必须是一个块级元素。
我想你是指块级格式化上下文。我同意,这是设置“媒体块”的正确方法。
这确实指出了我面临的痛点!很高兴看到你给出的这些解决方案。
我认为本文最重要的是强调了测试、测试、测试的重要性。
虽然拥有解决这些问题的方案非常有用,但开发人员/设计师也应该注意这些边缘情况。
如果你没有看到任何错误,你就不会看到任何需要修复的东西。