呜啦!日常碎碎念,偶尔掉落优质前端博文推荐、学习资源等
网页:https://tg.cosine.ren
本频道的搜索Bot 来辣 👉 @cosSearchBot
私聊直接发消息就可以搜索啦~
🔖tags
#优质博文 #资源推荐 #博客更新 #碎碎念 #项目更新 #手工 #书摘 #阮一峰的科技周刊 #新动态

图频:Cosine 🎨 Gallery @CosineGallery
猫片: @cosine_cat
联系频道主:@cosine_yu
#书摘 #css #前端
《CSS 世界》流的破坏与保护——关于overflow
「此时,有人可能会惊呼:什么?设置 height:0 同时 overflow:hidden?那岂不是里面所有元素都被剪裁看不见啦?如果是普通元素确实会如此,但是对于 absolute 绝对定位以及 fixed 固定定位元素,规则要更复杂!」


1. overflow 对absolute 元素的剪裁规则用一句话表述就是:绝对定位元素不总是被父级overflow属性剪裁,尤其当overflow在绝对定位元素及其包含块之间的时候。
上面这句话是官方文档的直译,似乎还是有些拗口,我们再换一种方法表述就是:如果overflow 不是定位元素,同时绝对定位元素和 overflow 容器之间也没有定位元素,则overflow无法对absolute元素进行剪裁

最后,非常有必要补充一点,那就是由于 position:fixed 固定定位元素的包含块是根元素,因此,除非是窗体滚动,否则上面讨论的所有overflow剪裁规则对固定定位都不适用。这一点后面还会提及。

2. 在CSS 世界中,上面说的这些几乎都是完美无瑕的,但是,随着 CSS3 新世界到来的冲击,规则在不经意间发生了一些变化,其中最明显的就是transform属性对overflow剪裁规则的影响,CSS3新世界中transform属性似乎扮演了原本“定位元素”的角色,但是这种角色扮演并不完全。

可以看到 overflow 元素自身 transform 的时候,Chrome 和 Opera 浏览器下的overflow剪裁是无效的,这是唯一和有定位属性时的overflow剪裁不一样的地方,因此才有“角色扮演并不完全”的说法。

transform除了改变overflow属性原有规则,对层叠上下文以及position:fixed的渲染都有影响。

因此,当大家遇到 absolute 元素被剪裁或者 fixed 固定定位失效时,可以看看是不是transform属性在作祟。
#书摘 #css #前端
《CSS 世界》流的破坏与保护

1. absolute的包含块
包含块(containing block)这个概念实际上大家一直都有接触,就是元素用来计算和定位的一个框。比方说,width:50%,也就是宽度一半,那到底是哪个“元素”宽度的一半呢?实际上就是指的“包含块”。
普通元素的百分比宽度是相对于父元素的 content box 宽度计算的,而绝对定位元素的宽度是相对于第一个position不为static的祖先元素计算的。
实际上,大家已经和“包含块”打过交道了,对于这些计算规则,规范是有明确定义的,具体如下(剔除了不常用的部分内容)。
(1)根元素(很多场景下可以看成是 <html> )被称为“初始包含块”,其尺寸等同于浏览器可视窗口的大小。
(2)对于其他元素,如果该元素的 position 是 relative 或者 static,则“包含块”由其最近的块容器祖先盒的 content box 边界形成
(3)如果元素 position:fixed,则“包含块”是“初始包含块”。
(4)如果元素 position:absolute,则“包含块”由最近的 position 不为 static 的祖先元素建立,具体方式如下。
如果该祖先元素是纯 inline 元素,则规则略复杂:
- 假设给内联元素的前后各生成一个宽度为0的内联盒子(inline box),则这两个内联盒子的 padding box 外面的包围盒就是内联元素的“包含块”
- 如果该内联元素被跨行分割了,那么“包含块”是未定义的,也就是 CSS2.1 规范并没有明确定义,浏览器自行发挥。否则,“包含块”由该祖先的 padding box 边界形成。
(5)如果没有符合条件的祖先元素,则“包含块”是“初始包含块”。

2. 可以看到,和常规元素相比,absolute 绝对定位元素的“包含块”有以下3个明显差异:
(1)内联元素也可以作为“包含块”所在的元素
(2)“包含块”所在的元素不是父块级元素,而是最近的 position 不为 static 的祖先元素或根元素
(3)边界是 padding box 而不是 content box
#书摘 #css #前端
《CSS 世界》深入内联元素 —— vertical-align 书接上回

1. 「vertical-align 上标下标类属性值指的就是 sub 和super 两个值,分别表示下标和上标。在HTML代码中,有两个标签语义就是下标和上标,分别是上标 <sup> 和下标` <sub>`,因为这两个HTML标签长得很类似,所以很多人经常记不清到底哪个是上标哪个是下标。我告诉大家一个记忆方法,就是看p和b两个字母的圈圈位置,如果圈圈在上面,就是“上标”,如果圈圈在下面,就是“下标”」确实好记
2. 「最后,HTML标签 <sup> <sup> 的vertical-align属性也和super和sub有着非同一般的关系,那就是 <sup> 标签默认的vertical-align属性值就是super,`<sub>` 标签默认的vertical-align属性值就是sub。上标常用作标注,下标在数学公式、化学表达式中用得比较多,基本上,vertical-align 上标下标类属性值的实际应用价值也就上面这点儿了,设计本意之外的使用价值几乎就是零。」
3. 基于vertical-align属性的纯css定位的水平垂直居中弹框(p3-p5)可了解,现在自己应该是不会用这种方法的:https://demo.cssworld.cn/5/3-10.php
cosine - 前端人の日常频道
#书摘 #css #前端 《CSS 世界》margin无效情形解析 「因为 margin 属性的诸多特异性,所以,我们在实际开发的时候,经常会遇到设置的margin无效的情形,这里我罗列一下,希望大家遇到类似的问题知道原因以及如何对症下药。」 1. display 计算值为 inline 的非替换元素的垂直 margin 是无效的,虽然规范提到有渲染,但浏览器表现却未寻得一点踪迹,这和padding是有明显区别的。对于内联替换元素,垂直margin有效,并且没有margin合并的问题,所以图片永远不会发生margin合并。…
#书摘 #css #前端
《CSS 世界》深入内联元素 —— vertical-align

1. 说到这里,我就忍不住多说两句。很多即使工作很多年的前端开发人员,也可能不知道 vertical-align的属性值支持数值,更不知道支持负值,这着实让我很意外。如果实用性差那还好理解,关键是vertical-align的数值属性值在实际开发的时候实用性非常强。一是其兼容性非常好,二是其可以精确控制内联元素的垂直对齐位置。http://demo.cssworld.cn/5/3-3.php
2. vertical-align 起作用是有前提条件的,这个前提条件就是:只能应用于内联元素以及display值为table-cell的元素。换句话说,vertical-align 属性只能作用在 display 计算值为 inline、inline- block,inline-table或table-cell的元素上,而浮动和绝对定位会让元素块状化,
3. 填坑来了:「在4.3.5节最后提到了一个“内联特性导致的margin无效”的案例,代码如下:

<div class="box">
<img src="mm1.jpg">
</div>
.box > img {
height: 96px;
margin-top: -200px;
}

此时,按照理解,-200px 远远超过图片的高度,图片应该完全跑到容器的外面,但是,图片依然有部分在.box 元素中,而且就算 margin-top 设置成 -99999px,图片也不会继续往上移动,完全失效。其原理和上面图片底部留有间隙实际上是一样的,图片的前面有个“幽灵空白节点”,而在 CSS 世界中,非主动触发位移的内联元素是不可能跑到计算容器外面的,导致图片的位置被“幽灵空白节点”的vertical-align:baseline给限死了。我们不妨把看不见的“幽灵空白节点”使用字符x代替,原因就一目了然了」(p4-5)

其实这就是为什么很多重置css会把图片重置为块级元素的原因,比如tailwind
#书摘 #css #前端
《CSS 世界》深入内联元素之行高 建议通读

1. 对于非替换元素的纯内联元素,其可视高度完全由 line-height 决定。注意这里的措辞—“完全”,什么padding、border 属性对可视高度是没有任何影响的
2. 因此,对于文本这样的纯内联元素,line-height 就是高度计算的基石,用专业说法就是指定了用来计算行框盒子高度的基础高度。比方说,line-height 设为16px,则一行文字高度是16px,两行就是32px,三行就是 48px,所有浏览器渲染解析都是这个值,1像素都不差。
3. 那如果是替换元素,又或者是块级元素,line-height在其中又扮演什么角色呢?上面推荐的文章里有提到
「行距顾名思义就是两行之间的距离,那么很显然,行高就等于字高加上行距。由于行高可以小于字号,因此行距可以是负值。那么为什么要引出半行距的概念呢?因为在网页上,行距不是完全加在字的上方或下方的,而是均匀分布在字的上下,而半行距就是行距的一半,因此在追求严格的显示效果的场景应当尽量使得行高减去字号的值为偶数,这样它才能作为行距被平分,如果为奇数不能平分,则可能在不同的浏览器中多出来的1px的位置会不同(不一定是在上方或下方)。」
4. 可能是由于CSS开发人员不够专注细致,外加规范设计本身的原因,设计师往往会对各个元素间的距离间隙标注得很清晰。但是,设计师并不是开发人员,他们并没有把网页中无处不在行间距考虑在内,所有与文字相关的间距都是从文字的上边缘和下边缘开始标注的。除非我们全局行高设置为line-height:1,否则这些标注的距离和我们使用的margin间距都是不一致的。
举个例子,假设line-height是1.5,font-size大小是14px,那么我们的半行距大小就是:(14px * 1.5 - 14px) / 2 = 14px * 0.25 = 3.5px。border 以及 line-height 等传统 CSS 属性并没有小数像素的概念,因此,这里的 3.5px 需要取整处理,如果标注的是文字上边距,则向下取整;如果是文字下边距,则向上取整,因为绝大多数的字体在内容区域中都是偏下的。所以,假设设计师标注了文字字形上边缘到图片下边缘间距 20px,则我们实际的margin-top值应该是17px,因为3.5px向下取整是3px。——严谨!
Back to Top