Web前端开发6年了,详解16个CSS新特性(2024最新版-下,前端开发周末培训

  • MAX = 500px

**/

width: clamp(100px, 50vw, 500px);

}

就这个示例而言,clamp() 函数的计算会经历以下几个步骤:

.element {

width: clamp(100px, 50vw, 500px);

/* 50vw相当于视窗宽度的一半,如果视窗宽度是760px的话,那么50vw相当等于380px*/

width: clamp(100px, 380px, 500px);

/* 用min()和max()描述*/

width: max(100px, min(380px, 500px))

/min(380px, 500px)返回的值是380px/

width: max(100px, 380px)

/max(100px, 380px)返回的值是380px/

width: 380px;

}

示例效果如下:

Demo: https://codepen.io/airen/full/pojVpJv

简单地说,clamp() 、min() 和 max() 函数都可以随着浏览器视窗宽度的缩放对值进行调整,但它们的计算的值取决于上下文。

我们来看一个比较函数中 clamp() 的典型案例。假设我们需要在不同的屏幕(或者说终端场景)运用不同大小的 font-size :

e8b968a6cc9fb63788adb661fe76957d.png

在还没有 CSS 比较函数之前,使用了一个叫 CSS 锁(CSS Locks)的概念来实

现类似的效果:

6b5f88fcf24a01dc78be8887bf66f5a8.png

需要做一些数学计算:

5de3b6c359af8fdefa46756cebd17baf.png

Demo: https://codepen.io/airen/full/bGqdOma

使用 clamp() 之后,只需要一行代码就可以实现:

/** minf: 20px (min font-size)

  • maxf: 40px (max font-size)

  • current vw: 100vw

  • minw: 320px (min viewport’s width)

  • maxw: 960px (max viewport’s width)

*/

h1 {

font-size: clamp(20px, 1rem + 3vw, 40px);

}

使用这方面的技术,我们就可以轻易实现类似下图这样的效果:

2c1c1df70292e7f0739e3df219b91ede.png

注,上图来自《Use CSS Clamp to create a more flexible wrapper utility》一文。

CSS 内容可见性

CSS 内容可见性,说要是指 content-visibilit 和 contain-intrinsic-size 两个属性,目前隶属于 W3C 的 CSS Containment Module Level 2 模块,主要功能是可以用来提高页面的渲染性能。

一般来说,大多数Web应用都有复杂的UI元素,而且有的内容会在设备可视区域之外(内容超出了用户浏览器可视区域),比如下图中红色区域就在手机设备屏幕可视区域之外:

cac417161f9ed22b9d9268de660a1ada.png

在这种场合下,我们可以使用CSS的 content-visibility 来跳过屏幕外的内容渲染。也就是说,如果你有大量的离屏内容(Off-screen Content),这将会大幅减少页面渲染时间。

Google Chrome 团队有工程师对 content-visibility 做过相关的测试:

7e9971d81f360da2db094d722125c126.png

使用了 CSS 的 content-visibility 属性,浏览器的渲染过程就变得更加容易。本质上,这个属性 改变了一个元素的可见性,并管理其渲染状态。

而 contain-intrinsic-size 属性控制由 content-visibility 指定的元素的自然尺寸。它的意思是,content-visibility 会将分配给它的元素的高度(height)视为 0,浏览器在渲染之前会将这个元素的高度变为 0,从而使我们的页面高度和滚动变得混乱。但如果已经为元素或其子元素显式设置了高度,那这种行为就会被覆盖。如果你的元素中没显式设置高度,并且因为显式设置 height可能会带来一定的副作用而没设置,那么我们可以使用contain-intrinsic-size来确保元素的正确渲染,同时也保留延迟渲染的好处。

换句话说,contain-intrinsic-size 和 content-visibility 是一般是形影不离的出现:

section {

content-visibility: auto;

contain-intrinsic-size: 1000px;

}

CSS 内在尺寸

如果你使用浏览器开发者工具审查代码时,将鼠标放到一个 标签上,你会看到类似下图这样的:

0595ef07086428a8b17241ff486adec9.png

的 src 路径上浮出来的图片底下有一行对图像的尺寸的描述,即252 x 158 px (intrinsic: 800 x 533 px) ,其实现这表述图片尺寸中两个重要信息:

  • 外在尺寸:252 x 158 px ,开发者给 img 设置的尺寸

  • 内在尺寸:800 x 533 px ,图片原始尺寸

a63dfec6467be7507f62dbecf7ff4ec7.png

其实在 CSS 中给一个元素框设置大小时,有的是根据元素框内在的内容来决定,有的是根据上下文来决定的。根据该特性,CSS的尺寸也分为内部(内在)尺寸和外部(外在)尺寸。

  • 内部尺寸:指的是元素根据自身的内容(包括其后代元素)决定大小,而不需要考虑其上下文;而其中 min-content 、 max-content 和 fit-content 能根据元素内容来决定元素大小,因此它们统称为内部尺寸。

  • 外部尺寸:指的是元素不会考虑自身的内容,而是根据上下文来决定大小。最为典型的案例,就是 width 、min-width 、max-width 等属性使用了 % 单位的值。

通地一个简单的示例来向大家演示 CSS 内在尺寸的特性,即 min-content 、max-content 和 fit-content 的特性。

CSS is Awesome

先来看 h1 的 width 取值为 auto 和 min-content 的差异:

// 外在尺寸

h1 {

width: auto; // 根据容器变化

}

// 内在尺寸

h1 {

width: min-content; // 根据内容变化

}

0e89ac6e1c5dbde49cc7fad1db366573.png

Demo:https://codepen.io/airen/full/zYZvGrY

从上图中不难发现,width 取值为 min-content 时,h1 的宽度始终是单词“Awesome”长度(大约是144.52px)。它的宽度和容器宽度变化并无任何关系,但它受排版内相关的属性的影响,比如font-size、font-family 等。

再来看max-content :

83dea4a892102b510e3025183f998369.png

Demo: https://codepen.io/airen/full/zYZvGrY

当h1 的 width 取值为 max-content 时,它的宽度是h1 所在行所有内容的宽度。最后来看 fit-content :

c56ba9a238868a169d1a836c470f75e7.png

Demo:  https://codepen.io/airen/full/zYZvGrY

相对而言,fit-content 要比 min-content 和 max-content 复杂地多:

h1 {

width: fit-content;

}

// 等同于

h1 {

width: auto;

min-width: min-content;

max-width: max-content;

}

简单地说,fit-content 相当于 min-content 和 max-content,其 取值:

  • 如果元素的可用空间(Available)充足,fit-content 将使 用 max-content

  • 如果元素的可用空间(Available)不够充足,比 max-content 小点,那就是用可用空间的值,不会导致内容溢出

  • 如果元素的可用空间(Available)很小,比 min-content还小,那就使用 min-content

使用下图来描述它们之间的关系:

dc3591c93ea60bc1e008656faafce8a4.png

min-content、max-content 和 fit-content 被称之个内在尺寸,它可以运用于设置容器尺寸的属性上,比如width 、height 以及 inline-size 和 block-size 等。但有些属性上使用的话则会无效:

  • min-content、max-content 和 fit-content 用于 flex-basis 无效

  • fit-content 用于设置网格轨道尺寸的属性上无效

  • 网格项目或Flex项目上显式设置 width:fit-content也无效,因为它们的默认宽度是 min-content

  • 最好不要在 min-width 或 max-width 上使用 fit-content,易造成混乱,建议在 width 上使用 fit-content

在布局上使用 min-content 、max-content 或 fit-content 可以帮助我们设计内在布局,另外在构建一些自适应的布局也非常灵活。特别是和 CSS 的 Grid 和 Shapes 相关特性结合,还能构建一些具有创意的布局。

最后有一点需要特别声明,fit-content 和 fit-content()函数不是相同的两个东东,使用的时候需要区对待。

CSS 的display

display 对于大家而言并不陌生,主要用来格式化上下文,这里特别拿出来和大家说的是因为 display 也有一些变化。其中之一就是 display 未来可以支持多个值:

b639a9d20b0e204320df927aaf3f2174.png

据最新的消息,Sarafi 浏览器已经把display 设置两个值已进入实验性属性。display 取两个值的含义大致如下:

f85e61a1dbd1bcca8c0b230a4f7f0732.png

另外单独要说的是,display 新增了 contennts 属性值, W3C规范是这样描述的:

aaad0dee09045fa73d524894d98d6aea.png

大致意思是说:

设置了 display: contents 的元素自身将不会产生任何盒子,但是它的子元素能正常展示。

比如:

I’m, some content

I'm some inner content

上面这个简单地示例代码,你将看到的效果如下:

3d39930711081fcd07352a44ff433113.png

如果我们在.outer 元素上显式设置 display: contents ,该元素本身不会被渲染,但子元素能够正常渲染:

c762ad736a36c3b20b45eee7f0014a4c.png

Demo: https://codepen.io/airen/full/abJvyoj

在某些布局中,特别是不希望调整 HTML 的结构的时候,我们就可以使用该特性。比如在 Flexbox 或 Grid 中,希望把其他后代元素变成网格项目或 Flex项目,那就可以这样做:

06e0ac4ae2e03030b5b52e49e2b69c07.png

Demo: https://codepen.io/airen/full/zYZvdJb

display: contents 在规范讨论阶段和 display: subgrid 的讨论中是非常的激烈,最终是 display:contents 获胜了。你现在在Grid的布局中,也没有单独的display: subgrid ,而是将subgrid 移入到 grid-template-columns 和 grid-template-rows 中。

另外还有一个比较大的争执就是 display: contents 和 Web 可访问性方面的。有关于这方面的讨论,你要是感兴趣的话,可以阅读:

  • More accessible markup with display: contents

  • Display: Contents Is Not a CSS Reset

CSS 的 @规则

CSS 中的 @ 规则有很多种,但大家比较熟悉的应该是 @import 、@media 和 @supports 之类的。今天给大家简单的提几个不常见的,比如:

  • 用于嵌套的 @nest 和 @apply

  • 用于注册自定义属性的 @property

  • 最近讨论比较多的容器查询 @container

  • @argyleink 在新分享的PPT提到的 @scope 和 @layer

  CSS 的嵌套

使用过 CSS 处理器的同学,应该用过嵌套来组织自己的代码,比如 SCSS:

// SCSS

foo {

color: red;

& bar {

color: green;

}

}

上面的代码经过编译之后:

// CSS

foo {

color: red;

}

foo bar {

color: green;

}

庆幸的是,W3C 也在讨论和定义CSS中的嵌套规则。目前两种规则:

foo {

color: red;

@nest bar {

color: green;

}

}

// 或者

foo {

color: red;

& bar {

color: green;

}

}

// 都等同于

foo {

color: red;

}

foo bar {

color: green;

}

也可以和媒体查询 @media 相互嵌套:

article {

color: darkgray;

& > a {

color: var(–link-color);

}

}

code > pre {

@media (hover) {

&:hover {

color: hotpink;

}

}

}

code > pre {

@media (hover) {

@nest &:hover {

color: hotpink;

}

}

}

article {

@nest section:focus-within > & {

color: hotpink;

}

}

main {

padding: var(–space-sm);

@media (width >= 540px) { & {

padding: var(–space-lg);

}}

}

除了 @nest 之外还有 @apply 。你可能在一些前端的框架或构建器中看到过 @apply:

20ab715cd0e14f281f5f0586a4e3ba64.png

如果你在 Chrome  Canary 浏览器“实验性属性” 就可以直接体验 @apply :

f673202d529e25e8969f7d3053e1393c.png

简单地说,它有点类似于 SCSS 中的混合宏 @mixin 和 @extend :

:root {

–brand-color: red;

–heading-style: {

color: var(–brand-color);

font-family: cursive;

font-weight: 700;

}

}

h1 {

–brand-color: green;

@apply --heading-style;

}

  CSS Houdini 变量 @property

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取(备注前端)
img

最后

在面试前我花了三个月时间刷了很多大厂面试题,最近做了一个整理并分类,主要内容包括html,css,JavaScript,ES6,计算机网络,浏览器,工程化,模块化,Node.js,框架,数据结构,性能优化,项目等等。

包含了腾讯、字节跳动、小米、阿里、滴滴、美团、58、拼多多、360、新浪、搜狐等一线互联网公司面试被问到的题目,涵盖了初中级前端技术点。

  • HTML5新特性,语义化

  • 浏览器的标准模式和怪异模式

  • xhtml和html的区别

  • 使用data-的好处

  • meta标签

  • canvas

  • HTML废弃的标签

  • IE6 bug,和一些定位写法

  • css js放置位置和原因

  • 什么是渐进式渲染

  • html模板语言

  • meta viewport原理

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

最后

在面试前我花了三个月时间刷了很多大厂面试题,最近做了一个整理并分类,主要内容包括html,css,JavaScript,ES6,计算机网络,浏览器,工程化,模块化,Node.js,框架,数据结构,性能优化,项目等等。

包含了腾讯、字节跳动、小米、阿里、滴滴、美团、58、拼多多、360、新浪、搜狐等一线互联网公司面试被问到的题目,涵盖了初中级前端技术点。

  • HTML5新特性,语义化

  • 浏览器的标准模式和怪异模式

  • xhtml和html的区别

  • 使用data-的好处

  • meta标签

  • canvas

  • HTML废弃的标签

  • IE6 bug,和一些定位写法

  • css js放置位置和原因

  • 什么是渐进式渲染

  • html模板语言

  • meta viewport原理

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 28
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值