CSS 良好的体验和漫长而令人沮丧的体验之间的区别,通常在于一些细微的差别。 CSS 的确很微妙。 我看到人们在布局方面经常遇到困难,这是最常见的问题之一。 我个人喜欢研究模式。 我注意到,我倾向于使用一小部分模式来解决大多数布局问题。 本文介绍了我用来解决布局挑战的 CSS 模式。 此外,无论使用哪种 CSS 方法,本文都探讨了如何采用无视方法,例如 SMACSS、BEM,甚至是 CSS-in-JS 的热门话题,因为它们都关注属性本身,而不是架构、组织或策略。
就当是娱乐,让我们先做个测试
我们将使用一个我创建的平台,名为 Questionable.io,我用它创建了一个测试,我们将在下面进行。 不用担心,不会收集任何个人数据,结果是匿名的,而且完全免费。
测试的目的是看看你是否能够在没有先学习材料的情况下,在上下文中识别出特定的 CSS 行为和问题。 我并不是故意要让测试变得困难,但 CSS 布局的细微差别往往比较复杂,尤其是没有太多接触的情况下。 请记住,这只是为了娱乐。 结果并不能说明你的能力,但希望你能够从中有所收获。
测试包含 10 道题,应该在 10 分钟或更短的时间内完成。
对测试感兴趣,但不想参加? 这里有一个链接,包含测试题及其正确答案。
已经做完了吗? 太棒了! 让我们逐题讲解,以便更好地理解测试中涵盖的布局模式。
问题 1:盒子模型
学习盒子模型应该是任何人的首要任务。 虽然 这篇 CSS-Tricks 盒子模型文章 可能有点旧了,但不要低估它对现代 CSS 的价值和相关性。 盒子模型是几乎所有与布局相关的 CSS 主题的先决条件。
这个问题正在测试如何获取盒子模型的 *计算* 宽度。 该盒子显然有 width: 100px;
,但事实证明,盒子模型的默认规则 将 width
属性应用于盒子的内容层。 计算宽度(在页面上渲染的宽度)是内容层、填充层和边框层的总和。 因此,答案是 112px
.box {
width: 100px; /* Take this */
height: 50px;
padding: 5px; /* Plus this x2 for left and right */
border: 1px solid red; /* Plus this x2 for left and right */
background-color: red;
/* = 112px of computed width */
}
如果你遇到过 UI 中最后一列或选项卡换行到下一行的情况,而你确信五个选项卡(都设置为 width: 20%;
)加起来是 100%,那么很可能这就是问题所在。 5 个选项卡的宽度为 20% 的确加起来是 100%,但如果涉及填充和/或边框,它们会增加宽度,因此最后一列无法容纳在同一行内。
在引入 CSS3 的同时,CSS 中出现了一个名为 box-sizing
的新工具。 它允许我们更改要应用 width
的盒子模型的层。 例如,我们可以使用 box-sizing: border-box;
,这意味着我们希望任何 width
规则都应用于边框层的外部,而不是内容层。 在这个问题中,如果应用了 box-sizing: border-box;
,则计算宽度将为 100px。
这对你们中的一些人来说已经是老生常谈了,但对于专业人士和新手来说都是一个很好的提醒。
关于盒子模型以及如何使用 box-sizing 作为重置,以便一次性将它应用于整个项目,有很多文章。 盒子大小 和 继承盒子大小可能是一个更好的最佳实践 是 CSS-Tricks 上的两个很好的文章,可以帮助你入门。
问题 2:边框很霸道
第二个测试问题几乎可以看作是第一个问题的“第二部分”。 请记住,阅读“盒子模型有多层,它们都对计算的宽度和高度有贡献”是一回事,能够在实际情况下识别盒子模型问题是另一回事。 这个问题对于那些做了一段时间 CSS 的人来说,算是一个经典问题。 它的根源在于边框占用空间,并且会推挤周围的东西,因为它们是盒子模型的一部分。 在状态转换(如 :hover
)期间引入边框,将意味着盒子会变大,从而向下推挤后续的盒子。 它还会导致 抖动体验
查看 CodePen 上的示例 CSS-Tricks:边框是维度,作者是 Brad Westfall (@bradwestfall)。
在所有可能的解决方案中,在初始“未悬停”状态下使用 border: 2px solid transparent
是唯一能解决问题的方案。 box-sizing
无法解决这个问题,因为我们没有明确设置高度。 如果我们设置了高度,那么边框将被计算在高度的内部,并且不会发生偏移 - 但事实并非如此。
还有一些其他解决方案没有被列为可能的答案。 一种是使用 box-shadow
创建伪边框,另一种是使用 outline
而不是 border
。 这两种方法都不会在状态更改期间导致偏移,因为它们不是盒子模型中的层。 这里还有另一篇 CSS-Tricks 文章 可以帮助你了解更多关于这些解决方案的信息
请记住,outline
不支持 border-radius
。
问题 3:绝对定位与固定定位
除了知道何时使用它们以及 它们在视觉行为上的差异 之外,了解每种定位方法如何使用其 top
、right
、bottom
或 left
属性附加到父元素也非常重要。
首先,让我们回顾一下 包含块。 简而言之,包含块通常是任何给定元素的父元素。 但是,绝对元素和固定元素的包含块规则不同
1. **对于绝对元素:** 包含块是最近的祖先父元素,其 static
属性不为 static
。 例如,当元素被绝对定位,并且包含 top
、right
、bottom
或 left
属性时,它将相对于任何具有 absolute
、relative
、fixed
或 sticky
位置的父元素进行定位。
2. **对于固定元素:** 包含块是视窗,无论任何父元素具有除 static
以外的 position 值。 此外,滚动行为与 absolute
不同,position: fixed;
元素在视窗滚动时保持“固定”到视窗,因此得名。
许多开发人员认为绝对定位的元素只会寻找最近的 position: relative;
父元素。 这是一个常见的误解,因为 position: relative
通常与 position: absolute;
配合使用,以创建包含块。 它被普遍使用的原因是 relative
保持父元素 在流中,这通常是理想的行为。 但是,有时绝对定位元素的包含块也是绝对定位的。 根据具体情况,这完全可以接受。 如果所有父元素都是静态的,那么绝对定位的元素将附加到视窗 - 但它会随着视窗一起滚动
查看 CodePen 上的示例 CSS-Tricks:绝对定位滚动,作者是 Brad Westfall (@bradwestfall)。
以上两条规则还有一个鲜为人知的注意事项:只要父元素具有 transform
属性(以及其他几个属性)且其值为 none
以外的值,那么该父元素将成为绝对定位元素和固定定位元素的包含块。 这可以在这个示例中观察到,其中通知的 position
为 fixed;
,而父元素具有 transform
,但只有在悬停时才生效
查看 CodePen 上的示例 CSS-Tricks:包含块,作者是 Brad Westfall (@bradwestfall)。
问题 4:父级和首尾子级合并边距
这是 CSS 细节中的一种,如果您不知道它的工作原理,它会真的让您头疼。CSS 中有一个名为合并边距的概念,许多人熟悉其中的一种形式,称为相邻兄弟合并边距。但是,它还有另一种形式,称为父级和首尾子级合并边距,它鲜为人知。以下是对这两种情况的演示
查看 CodePen:CSS-Tricks: 合并边距,作者:Brad Westfall (@bradwestfall),来自CodePen。
每个段落标签都具有浏览器提供的 1em 的顶部和底部边距。到目前为止,这部分很简单。但是为什么段落之间的间隙不是 2em(顶部和底部的总和)?这就是所谓的相邻兄弟合并边距。边距会重叠,因此两个边距中较大的那个将成为总间隙大小,因此在这种情况下,间隙为 1em。
还有一些其他的情况,看起来有点奇怪。您是否注意到第一个段落的顶部边距并没有在它和蓝色容器 div 之间产生间隙?它并没有产生间隙,而是像将边距“贡献”给了父级 div,就好像 div 具有顶部边距一样。这就是所谓的父级和首尾子级合并边距。如果父级具有以下任何内容,则这种形式的合并边距在某些情况下不会发生
- 任何大于 0 的顶部/底部填充值。
- 任何宽度大于 0 的顶部/底部边框。
- 块级格式化上下文,可以通过诸如
overflow: hidden;
和overflow: auto;
之类的操作来创建)。 display: flow-root
(支持性不佳)。
当我向人们解释这个 CSS 细节并使用填充或边框解决它时,他们的反应几乎总是“填充或边框为 0 怎么办?”,这行不通,因为值必须是正整数。
在前面的示例中,只需 1px 的填充就可以让我们在使用和阻止父/子级合并边距之间切换。第一个/最后一个段落和父级之间出现的间隙是 1px 的填充,但现在边距正在被纳入容器内部,因为填充层创建了一个阻止合并边距的屏障。
关于这个问题,我相信您能在这个 UI 中看到问题所在
查看 CodePen:CSS-Tricks: 父/子级合并边距,作者:Brad Westfall (@bradwestfall),来自CodePen。
第一个.comment
(没有.moderator
类)正在经历合并边距。即使不查看代码,我们也可以看到主持人评论有一个边框,而非主持人评论没有。在这个问题中,实际上有三个被认为是正确的答案。每个答案实际上已经在 Pen 的源代码中应用了,只是被注释掉了。
这种形式的合并边距不像其他形式那么广为人知的一个原因是,我们可以通过多种方式“意外地”避免它。Flexbox 和网格项目会创建一个块级格式化上下文,因此我们不会在那里看到这种形式的合并边距。如果我们的“评论”UI 是一个真正的项目,我们很有可能在所有四个坐标上都设置了填充,以在周围创建间距,这将为我们修复任何合并边距问题。尽管它可能很少见,但我不想让你为这个问题挠破头皮一整天,所以当你处理布局时,最好将它铭记于心。
以下是一些关于这个主题的 CSS-Tricks 文章
问题 5:百分比是相对于什么?
在使用百分比单位时,据说百分比是基于包含块的宽度或高度(通常与父级相关)。如前所述,具有transform
的元素将成为一个包含块,因此当元素使用transform
时,百分比单位(仅针对transform
)是基于它自身的大小,而不是父级。
在这个示例中,我们可以看到 50% 的含义取决于上下文。第一个红色块具有margin-left: 50%;
,第二个红色块使用transform: translateX(50%);
查看 CodePen:CSS-Tricks - 百分比和变换,作者:Brad Westfall (@bradwestfall),来自CodePen。
问题 6:盒子模型再次出现… 真让人头疼!
正当您以为我们已经结束讨论盒子模型的时候…
查看 CodePen:CSS-Tricks: 左:0 右:0,作者:Brad Westfall (@bradwestfall),来自CodePen。
让人头疼的原因在于我们正在对页脚使用width: 100%;
并添加填充。容器的宽度为 500px,这意味着页脚的内容层(为 100%)在应用到该层外部的填充之前为 500px 宽度。
可以通过以下两种常见技术之一解决这个问题
- 直接在页脚上使用
box-sizing
,或通过重置来使用,就像我们之前讨论的那样。 - 删除
width
,改为使用left: 0; right: 0;
。这是同时使用left
值和right
值的一个很好的用例。这样做可以避免盒子模型问题,因为当设置left: 0; right: 0;
时,width
将使用其默认值auto
来占用填充和边框之间的任何可用空间。
其中一个选项是“删除页脚的填充”。从技术上讲,这可以解决问题,因为内容层为 100% 不会有任何填充或边框将其扩展到容器的宽度之外。但我认为这种解决方案是错误的,因为我们不应该改变我们的 UI 来适应很容易避免的盒子模型问题。
对我来说,现实情况是我总是将box-sizing: border-box;
作为我重置的一部分。如果您也这样做,那么您可能不太常遇到这个问题。但无论如何,我仍然喜欢使用left: 0; right: 0;
技巧,因为随着时间的推移,它比处理width: 100%;
对定位元素引起的盒子模型问题更加稳定(至少在我的经验中是这样)。
问题 7:居中绝对定位和固定定位的元素
现在我们真正开始将上面所有的材料与绝对定位和固定定位元素的居中结合起来
查看 CodePen:CSS-Tricks: 模态框(灯箱)居中,作者:Brad Westfall (@bradwestfall),来自CodePen。
由于我们已经涵盖了本测试问题中大部分的材料,因此我只指出,水平和垂直居中可以通过使用负边距的“老方法”或使用变换的“有点老但是仍然有效”的方法来完成。以下是一个关于所有居中方面的CSS-Tricks 指南。
曾经有人说过,如果我们知道盒子的宽度和高度,那么我们应该使用负边距,因为它们比过渡更稳定,过渡是浏览器的新功能。现在过渡已经稳定,我几乎一直使用它们来完成这项任务,除非我需要避免包含块。
另外,请注意,我们不能为此使用任何margin: auto;
技巧,因为我们需要模态框“悬停”在内容之上,这就是为什么通常使用position
将它们从普通流中移出的原因。
说到这里,让我们继续下一个问题,它与使用普通流居中有关。
问题 8:使用普通流居中元素
Flexbox 为我们带来了许多解决困难布局问题的惊人工具。在它发布之前,人们都说垂直居中是 CSS 中最难做的事情之一。现在,这已经变得很轻松了
.parent { display: flex; }
.child { margin: auto; }
查看 CodePen:CSS-Tricks: Flexbox 居中(垂直和水平),作者:Brad Westfall (@bradwestfall),来自CodePen。
请注意,对于 flexbox 项目,margin: auto
被应用于顶部、右侧、底部和左侧,以实现垂直和水平居中。在过去,使用auto
进行垂直居中在块级元素上是无效的,这就是为什么使用margin: 0 auto
很常见的原因。
问题 9:计算混合单位
当我们需要混合两个无法直接加起来的单位或需要使分数更容易阅读时,使用calc()
是完美的选择。这个测试题要求我们根据 div 的宽度为 100px 的事实来计算calc(100% + 1em)
的结果。这有点棘手,因为 div 的宽度实际上并不重要。百分比是基于父元素的宽度,所以答案是 _包含块(父元素)宽度的 100% 加上 1em_。
我经常使用calc()
的几个关键地方。一个是在任何我想将某个元素偏移 100% 并添加固定数量的额外空间时。下拉菜单就是一个很好的例子
查看示例 CSS Tricks: 计算混合单位 by Brad Westfall (@bradwestfall) on CodePen.
这里的技巧是我们想创建一个“下拉系统”,下拉菜单可以使用不同的触发器大小(在本例中是两个不同大小的按钮)。我们不知道触发器的高度,但我们知道top: 100%;
会将菜单置于顶端,并位于触发器最底部。如果每个菜单都需要位于各自触发器的底部,加上 0.5em,那么就可以使用top: calc(100% + 0.5em);
来实现。当然,我们也可以使用top: 110%;
,但额外的 10% 将取决于触发器和容器的高度。
问题 10:负边距
与将元素推离其兄弟元素的正边距不同,负边距会将兄弟元素拉得更近,**而不会移动兄弟元素**。这个最后的测试题提供了两个技术上有效的解决方案来消除按钮组中的双重边框,但我更喜欢负边距技术,因为移除边框将使执行某些技巧(如悬停效果)变得更加困难。
查看示例 CSS Tricks: 按钮组的负边距 by Brad Westfall (@bradwestfall) on CodePen.
效果是“公共边框”在按钮之间显示。按钮实际上无法共享公共边框,所以我们需要这个负边距技巧让两个边框重叠。然后我使用z-index
来管理根据悬停状态想要置于顶部的边框。请注意,即使没有绝对定位,z-index
在这里也很有用,但我必须使用position: relative
。如果我使用了移除第二个按钮左侧边框的技术,这个效果将更难实现。
所有都加起来了!
还有一个演示我想向您展示,它使用了我们迄今为止讨论过的许多技巧。任务是创建 UI 图块,这些图块会扩展到容器的左右边缘,并带内边距。所谓“图块”,是指能够拥有一个块列表,当没有更多空间时会向下折行。悬停在图块上以查看完整效果
查看示例 CSS-Tricks: Flexbox 图块(边缘到边缘) by Brad Westfall (@bradwestfall) on CodePen.
这个任务的障碍是内边距。如果没有内边距,让图块接触容器的左右边缘将是微不足道的。问题是内边距将由边距创建,当我们在图块的四面都添加边距时,会产生两个问题。
- 使用三个
width: 33.33%;
的图块加上边距意味着三个图块无法在一行内容纳。虽然box-sizing
允许我们在.tile
上添加填充和边框,这些边框将包含在33.33%
内,但它不会帮助我们处理边距 - 这意味着三个图块的计算宽度将超过 100%,迫使最后一个图块向下折行。 - 最左边和最右边的图块将不再接触容器的边缘。
第一个问题可以使用calc((100% / 3) - 1em)
解决。这是 33.33% 减去每个图块的左右边距。相邻兄弟元素合并边距在这里不适用,因为在左右边距中不存在合并边距。因此,每个图块之间的水平距离是两个边距的总和(1em)。在本例中,它也不适用于上下边距,因为第一个图块和第四个图块在技术上不是相邻兄弟元素,即使它们在视觉上恰好彼此相邻。
使用calc()
技巧,三个图块能够在一行内容纳,但它们仍然没有扩展到容器的边缘。为此,我们可以在每个图块的左右边距的相同量级上使用负边距。示例中的绿色虚线是容器,我们将应用负边距以将图块拉伸以匹配周围内容的边缘。我们可以看到它如何扩展到其父元素的填充区域(main
元素)。这是可以的,因为负边距不会推动相邻元素移动。
最终结果是图块具有漂亮的内边距,这些内边距扩展到边缘,使其与图块外部的相邻段落标签对齐。
有很多方法可以解决图块问题(它们通常有各自的优缺点)。例如,有一个相当优雅的解决方案使用 CSS Grid,由 Heydon Pickering 讨论,使用模仿容器查询的技术(但使用 Grid 魔法)实现响应式布局。最终,他的 Grid 图块解决方案比我提供的 flexbox 解决方案好得多,但它也拥有较少的浏览器支持。尽管如此,flexbox 解决方案仍然是同时演示本文中所有技巧的好方法。
您可能已经熟悉 Heydon 的作品。他以创建像Lobotomized Owl 选择器这样的巧妙技巧而闻名。如果您不熟悉,它肯定值得了解,我有一个视频,我讨论了它。
总结
我在开头就说过,我倾向于在解决问题时寻找模式。这篇文章并不是关于上面提到的确切演示场景;它更多的是关于一组工具,这些工具可以用来解决这些问题以及我们都可能遇到的许多其他布局问题。我希望这些工具能帮助您走得更远,我期待在评论区听到您的意见。
顺便说一句,有一些优秀的资源详细介绍了盒模型,最著名的是 Rachel Andrews 和 Jen Simmons 的资源,这些资源绝对值得一看。Rachel 甚至有一个专门关注布局的新闻稿。
- 盒模型对齐速查表 – 有视觉效果的出色资源,突出了影响元素对齐方式的各种属性,无论是它们自身还是相对于其他元素。
- Jen Simmons Labs – 一系列使用现代布局方法的有用文章、演示和实验。
我认为问题 9 的答案不正确。
margin-left:100%
不会是 100px(div 宽度),它将是包含块的宽度(假设在本例中是视窗)。因此,答案应该是包含块的宽度加上 1em。除非我错了 :)
你说得对。我更新了问题和文章以反映这一点。感谢您的发现,Paul!
问卷调查 (https://app.questionable.io/test-review/527/pZnrnE6z) 网站在 Linux Mint 上的 Firefox 或 Chrome 中均不允许任何点击/选择答案。供您参考…
感谢 Vanderson,这是“测试审查”模式的链接。它不允许突出显示/复制代码。测试模式实际上也不允许。原因是 Questionable.io 通常用于招聘评估,因此这是为了阻止测试者通过复制/粘贴轻松查找答案。
我对问题 9 有点困惑。正确答案不应该应该是“元素容器的宽度加上 1em”,而不是“元素本身的宽度加上 1em”吗?这里有一个示例,其中具有给定样式的元素的边距结果与答案建议的不同:http://jsfiddle.net/kt9q3x5z/
是的,Paul 在上面指出了这一点。现在已修复。感谢 Ilya
Re: 问题 7,我认为 transform/translate 会导致边缘模糊和文本渲染不同(也许没有亚像素抗锯齿?)。所以它非常适合动画,在动画中不会注意到细微的模糊,但不适合像模态那样静态的元素。但是模态看起来很完美。我记错了吗?不再是问题了吗?
我认为在某些情况下确实如此,但并非所有情况。记不清了
#问题 6 误导性。
问题问“哪些解决方案可以解决悬停问题?” 并且“移除页脚的内边距” 绝对可以解决悬停问题,因此不应将其视为不正确的答案。
如果你要找一个不改变 UI 的答案,请在问题中明确说明 UI 不应改变。
我感谢你的反馈,Ian,真的!但我就是不同意。如果一个解决方案以一种极端负面的方式改变了 UI,那它就不是一个好的解决方案,尤其是当另一个如此简单的解决方案根本不改变 UI 时。另外,记住这只是为了娱乐,这些问题不是这里的重点,内容才是重点
另外,如果容器或内容有任何内边距,使用“left: 0; right: 0;” 仍然会导致页脚比其可见内容更大
我是不是没理解你在问题 7 中“使用 calc() 来测量以顶部和左侧为中心的尺寸”的含义?因为用 calc() 计算的 left/top 属性替换负边距也是解决这个问题的方案。
嗨,Jesse,抱歉,这令人困惑。现在想想,你说得对。我会想出一个更好的“错误”答案
我错了 1 个,而且没有意识到前面的一些问题允许多个答案。只有后面一个问题清楚地说明我可以选择多个答案。
不错的测试,12 道题答对了 9 道。
如果能用复选框而不是单选按钮显示多选题就好了,我想很多人会错过这一点。
我也被这个难住了。单选按钮强烈暗示只能选择一个答案。
感谢这篇文章和有趣的测试 :)
希望你不介意我提出一些改进测试的小建议 :)
首先
我无法理解问题 4;我想来想去,除了:你一定是犯错了 :D 以外,我想不出其他解释。
元素上的边距如何导致它自己的背景和边框扩展?
为什么它只发生在黄色中,而不是蓝色中?
笔支持我的说法,这让我松了一口气 :D https://codepen.io/katerlouis/pen/dwrxaQ – 如果你漏掉了什么,请告诉我。
问题 6 有点不公平,应该更具体地措辞。你从未说过页脚上的内边距是必需的,所以从技术上讲,移除内边距确实解决了悬停问题。但这并不是一个现实生活中的解决方案。当然,内边距是必需的,你理所当然地说这不是一个正确的答案。但在我看来,这个问题不允许这样做 :)
对于问题 7,我觉得令人困惑的是,两个有效的解决方案,答案 1(transform)和答案 3(calc())不能同时选择,就像你在其他一些问题中允许的那样。这可能会让用户感到不确定;但我很好奇这是故意的吗。
我知道这只是一次小测验和一个用来为文章做热身的小乐趣;但如果你想改进它,我建议考虑为“现实世界”示例添加设计交付物(例如问题 2 中的菜单项跳转和问题 6 中的页脚悬停)。
我认为菜单跳转的正确/最佳解决方案需要/由设计决定给出。
– 非悬停状态下透明边框会在项目之间添加额外的垂直空间
– 蓝色边框(与背景相同)会为按钮添加更多视觉内边距
– 悬停状态下边框样式为内嵌,会从按钮中去除视觉内边距
因此,虽然这无疑是一个代码问题,但它只能通过先问设计问题来回答。
这在某些人看来可能很吹毛求疵;但在我看来,这些细节至关重要
在我看来(幸运的是我的代理机构也这么认为),只有当所有各方尽可能地紧密合作时,才能取得好的结果。
嗨,René。
4. 这是正确的。在你的 codepen 中,转到设置并去掉你的 css 重置。不确定那是什么重置,但它可能默认情况下会去除 H1 的边距。
6. 我刚刚在别人的评论中回答了这个问题
7. 我昨晚本来打算修改这个,抱歉
无法访问测验,点击链接会将我带到一个 Questionable.io 错误页面,上面写着“抱歉,我们遇到了某些错误”。
我能够正确地回答所有问题,但在最后的“分数”中只显示 83% 和“1”分。
为什么会这样?
其中一个问题有几个正确答案,每个答案值几分之一
很棒的测试,有一些不错的小“陷阱”,特别是第二个问题,其中 box-sizing: border-box; 通常会起作用,但需要定义显式宽度
我不太了解我的 CSS 布局,我还在尝试弄清楚如何从我的页面中删除未使用的 CSS,因为谷歌页面速度告诉我它会减慢我的网站速度。
关于第二个问题,将边框移动到初始状态不会解决问题吗?我知道这会从视觉上改变初始状态,但它会解决跳跃问题,不是吗?
很棒的文章(和测试)。我目前正在准备面试,所以这真是太及时了。
干杯,我学到了很多!
是的。我什么都不知道。
这些都是 CSS 中比较难的部分。我相信你懂很多。关键是不断学习更多
我答对了 10 道题中的 8 道,并且还有很多时间。我真的不想回答第一个问题,因为盒子模型没有规定,所以我觉得有点束手无策,但我应该意识到这暗示的是默认盒子模型。哎哟!
第二个是使用 Flexbox + margin: auto 的垂直/水平定位。实际上,我并不知道这可能实现,所以学到了新东西!我以为使用 align-items 和 justify-content 是垂直居中的必要条件(我知道它对水平居中有效)。
感谢你发布这个!这很有趣。
不错。有点烦躁的是最后一个问题只给我半点。
移除这样的边框的另一个问题是,你不会得到一个漂亮的矩形——如果边框更厚或你的屏幕是高 dpi 的,则开放边框的边缘将呈角度/产生视觉伪影。
我喜欢这个测试,Brad!干得好!我认为 #5 的正确答案措辞有问题。答案选项说“红色框宽度的一半(50px)”,但框是 50×50,所以它宽度的一半是 25px。
已修复。谢谢
很棒的测试。
我认为问题 2 在最后部分的措辞有点误导。在我看来,“保持设计不变”意味着保持按钮大小不变。然而,添加边框会使它们高出几个像素。这导致我选择了错误的答案,尽管我知道这个问题可以通过添加边框来解决。
在这种情况下,添加固定高度并调整盒子大小将使设计“保持不变”。
只是在这里快速链接一下我几周前在推特上发布的愚蠢的小测验,因为它有点相关
不错的测试,但请永远不要再将复选框样式化为单选按钮。我以为我每道题只能选择一个答案。;-)
你做得很好,只是部分(不)正确。
关于使用具有多个正确答案的题目显示更像“复选框”的 UI 的问题已经发布。对于任何困惑,我们深表歉意。
从技术上讲,固定定位(关于问题 #3)将元素相对于视窗定位,除非祖先“设置了 transform、perspective 或 filter 属性为除 none 之外的其他值。”来源:https://mdn.org.cn/en-US/docs/Web/CSS/position#fixed
这比我想承认的要让我更头疼……