这篇文章发布于 2018年10月21日,星期日,21:22,归类于 CSS相关。 阅读 52587 次, 今日 5 次 20 条评论
by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=8097
本文可全文转载,无需授权,只要保留原作者、出处以及文中链接即可。
一、有人考了我一道CSS题目
前段时间@快叫我韩大人私信我考了我下面这个题目:
截图中的字略小,我重新整理了下:
题目要求:
P标签的最大宽度不可以大于H2标签文字宽度的10%这里应该是P标签的最大宽度由前面的匿名内联元素宽度(就是大字号文字宽度)决定,可参见最后期望效果GIF示意。
- H2标签不能失去高度(h2 文字高度+p 标签高度 = h2 标签高度)
HTML结构(不允许修改)
<h2> IPHONE XR<br> IS THE FUCKING<br> BEST EVER MADE <p>iPhone XR has not been authorized as required by the rules of the Federal Communications Commission. iPhone XR is not, and may not be, offered for sale or lease, or sold or leased, until authorization is obtained.</p> </h2>基础CSS样式
h2{ font-size: 52px; font-weight: bold; color: #000; } p{ font-size: 12px; color: #333; }初始效果
期望效果
请问在座的各位有没有实现思路,可以将对应CSS代码写在这个在线demo页面的(Chrome浏览器打开)“你的CSS”区域,可以看到实时效果:
大家现在可以开动脑筋想想怎么实现了……
·
·
·
·
·
·
如果没有思路,或者想看看别人的实现,可以接续往下看。
二、几个布局实现方法
先展示下我的实现:
h2 { width: min-content; white-space: nowrap; } p { white-space: normal; }
您可以狠狠地点击这里:min-content下的布局实现demo
效果如下截图:
width:min-content
表示宽度收缩到最小,如果是默认状态,宽度应该是最窄单词的宽度,由于设置了white-space:nowrap
,因此,宽度就是最长的那一行字符宽度(如果不太理解,可以买本《CSS世界》,内有深入讲解),由于P标签设置了white-space:normal
,因此,最终宽度就是大字号标题的最长的那一行的宽度,最终实现预期效果。如果对min-content
还不太了解,可以参见“理解CSS3 max/min-content及fit-content等width值”这篇文章。
下面这个是出题人的实现:
h2 { display: table; } p { display: table-caption; caption-side: bottom; }
您可以狠狠地点击这里:min-content下的布局实现demo
效果如下截图:
这个方法要更好,兼容性更强(IE8+)。
display:table-caption
表示元素的display水平表现为表格标题,自动自适应于外部表格容器宽度,caption-side:bottom
可以设置表格标题在底部,而display:table
元素的宽度为auto
的时候表现为“包裹性”(“shrink-to-fit”),因此,达到符合预期的效果。
三、欢迎补充你的实现方法
CSS各种属性就像构成世界的基本元素,要实现某一种效果,往往会有多种组合方式,各有优劣,相信这里的布局实现也会有其他方法的,欢迎补充,不吝赐教。
当然,如果你有自认为不错的CSS技巧,也欢迎和我交流,出题考我也是可以的!
本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。
本文地址:https://www.zhangxinxu.com/wordpress/?p=8097
(本篇完)
- 去除inline-block元素间间距的N种方法 (0.535)
- border-collapse与table td边框opacity透明度诡异解析 (0.535)
- 理解CSS3 max/min-content及fit-content等width值 (0.229)
- 深入理解CSS的width:auto (0.229)
- CSS minmax()函数简介 (0.229)
- CSS repeat()函数详细介绍 (0.229)
- Oh My God,CSS flex-basis原来有这么多细节 (0.229)
- 这啥?CSS calc-size和interpolate-size,真学不动了 (0.229)
- word-break:break-all和word-wrap:break-word的区别 (0.178)
- SVG <foreignObject>简介与截图等应用 (0.178)
- 基于vw等viewport视区单位配合rem响应式排版和布局 (RANDOM - 0.057)
请教一下,我试了换行的时候white-space:pre 和pre-wrap 表现一样。但官网说pre应该no-wrap的,是为什么?https://developer.mozilla.org/en-US/docs/Web/CSS/white-space
哦我知道了,是容器宽度不够的时候no wrap
我对第一个要求理解为:p标签长度比h2文本长度长10%以内,故在张哥代码基础上加一句margin-right: -10%,以达成图中效果
h2 {
width: min-content;
white-space: nowrap;
}
p {
white-space: normal;
margin-right: -10%;
}
不知道有没有什么例外
h2 {
display: grid;
grid-template-columns: 1fr 9fr;
white-space: nowrap;
}
p{
white-space: normal;
grid-column-start: 1;
}
css 世界的封面鲸鱼竟然不是用css写的, 差评。/滑稽
标签被替换掉了,重发一次
1. 第一种方法我也想到了。因为我看过你的《CSS世界》(还没看完)
2. 如果允许改动p的html结构就有其它的方法,p中加一个span,把“iPhone XR…”放到span中
就在这里向张大师提个问题吧:
已知div,宽>高(但都未知,且不可固定),div中包含1个span,如何只使用CSS让这个span与div等高,且span的宽高比为1:1,即正方形?
改变容器writing-mode然后span padding:50%。这个最兼容。
张大师,按您的说法,试了下,可以实现span为正方形,但是好像超出父容器高度了,将padding改为25%就满足题意了,这里想问下,这里面实现的原理是什么?或者单独写个博客让大伙明白一下
其实不难理解的,哈哈,如果你买本《css世界》立马就懂,这儿padding是相对于父容器的宽度计算的,同时,如果改变了writing-mode(元素渲染顺序,默认是从左往右,改变之后就变成上往下了),这儿padding就是相对于父容器高度计算了
h2 {
display:table-caption;white-space:nowrap;
}
p {
display: table-cell; white-space:normal;
}
厉害
h2{
display: inline-block;
position: relative;
}
p{
width: 90%;
position: absolute;
}
这样高度没了哟,不符合第2个要求了~
我想这个题目想考察的应该就是相对于父级的单位em, 英文按照单词换行,其他的好像没有什么必要纠结.
h2 {
width: 9em;
}
p {
}
想到用em来设置宽度 误打误撞居然成了
貌似字数最多的一行与设定的值不匹配(14个字符,9em) 请张大大解释下呢
H2文字内容是不固定的哟~
出题者语死早
语死早:语文老师s的早?受教了
不超出10%,我觉得应该解读为p最大宽度为h2的110%,直接解读为不超出h2似乎不妥当。