背景
Web 前端发展至今,每年都有海量的新东西出来,不管是前沿的技术方向,还是各大浏览器厂商新支持的特性,又或是 ECMA 每年的新标准,内容之多,迭代速度之快,每个人并不能完全了解所有的东西,写这篇文章的动机就是我在学习的过程中,发现很多有意思的,或者从来没听说的特性,一看才发现,原来这玩意已经出来很多年了,它就静静的躺在那里,静静的等你发现,这也是标题为什么的 “新” 要加引号的原因。
我们在业务中埋头苦干的同时,也可以偶尔抬头看一看,说不定每当我们焦头烂额不知道怎么更好的实现手里的需求时,已经有很成熟,优雅的解决方案了
这篇文章就大致讲一下我觉得提有意思的点,不深入代码细节
Grid 布局 Chrome: 57+
flex 布局已经基本普及,不管是 PC 还是 Mobile 都有很广的应用
grid 网格布局 是一个更强大的布局语法,具体语法请查看 MDN, 直接上一个案例
- 一列显示两个
- 两端对齐
- 数值和同环比默认在一行显示,同环比超过两个单独换行展示
- 上下间距 8px, 左右间距 16px
数值单独一行展示
1 | grid-column: span 2; |
使用 flex 局部实现改需求,最大的问题就是由于是两端对齐,当是奇数个指标时,尾元素会跑到如图箭头所示的位置,使用 grid 能更优雅的实现
1 | display: grid; |
同时,我们希望在手机横屏的时候,能放开 一列两个
的限制,也就是根据手机屏幕自适应,竟可能的展示更多,我们只需要修改一行代码
1 | - grid-template-columns: repeat(2, 1fr); |
1 | @supports (display: grid) { |
Media Session Chrome: 73+
有一次,在家看斗鱼直播的时候,发现地址栏旁边有一个音乐的 icon, 点击会有一个小卡片,可以开启画中画,暂停播放等
一查,好家伙,原来这是 Chorme 73 就支持的特性 Media Session, 可以实现像原生 APP 一样,在播放音乐或视频时,在地址栏有一个小卡片,很精致
于是,我将这个很酷的功能,接入到我自己的 音乐播放器 (查看示例)
1 | updateMediaSessionMetadata = () => { |
Visual Viewport Chrome: 61+
这个东西又是做什么的呢?在实际业务开发中,mac 电脑的触控板可以使用双指缩放对浏览器视窗进行缩小放大
如果网页上包含 Canvas 会让其模糊,首先我们尝试了监听 window 的 resize 事件,发现无效,百般搜索,发现了 Visual Viewport 这个东西,可以对屏幕大小发生改变,或缩放做监听,同时还可以用做移动端的双指缩放,我们借助这个功能,优化了 Canvas 模糊的问题 ([查看具体介绍](https://yuque.antfin.com/docs/share/d3c34ad9-b7db-46ef-be60-6c4e2f4b86ff?# 《✍ VisualViewport 实现浏览器窗口的缩放检测》))
1 | visualViewport?.visualViewport?.addEventListener( |
Place-Content Chrome: 59+
这是一个 Chorme 59 就支持的 css 的属性,同时支持 Grid 和 Flex 布局,我是看 web.dev 的文章才知道的,惭愧。.. 它可以干什么呢?其实就是对 我们熟悉的 align-content
和 justify-content
两个属性简写。比如垂直水平居中,我们都是这样写
1 | .center { |
可以简写成
1 | .center { |
EventListener Once Chrome: 55+
众所周知,addEventListener
在远古时期第三个函数就从 Boolean
值 变成了 Object
, 原因是要支持 更多的功能
1 | + addEventListener(type, listener, options) |
我们监听一个事件,比如点击,通常会这样写
1 | button.addEventListener('click', () => {}) |
如果只想让它监听一次呢?在这前有很多奇奇怪怪的处理方式,我们可以这样改写,使用 options.once
优雅的实现
1 | button.addEventListener('click', () => {}, { once: true }) |
这样就优雅的实现了事件只触发一次,这个知道的人不知道多不多,现在都是三大框架,屏蔽了底层,估计也用不到这个东西吧。
AbortController Chrome: 66+
AbortController 用于终止网络请求,Chorme 66 开始支持,在 Node.js 中也有相应实现
原生的 fetch
请求有一个弊端就是无法中断,那么可以配置 AbortController
解决这个问题
使用方式类似于 axios 的 CancelToken
, 比如想中断视频下载 (查看示例)
1 | const controller = new AbortController(); |
PWA Chrome: 39+
PWA 全称 Progressive web apps, 17 年的时候特别火,谷歌主推的亲儿子,国内由于小程序以及科学上网的原因,一直半死不活,国内我印象中比较早用的是饿了么 HTML5 版本
简单来说就是把一个网页包装,让其看起来像一个原生 APP, 就和现在大家把一个网页,让其像小程序一样
:::info
PS: 个人观点,小程序就像一个万维网的对立,努力的把互联网变成局域网,个人很讨厌
:::
PWA 通过 service worker
将资源缓存,使其可以离线访问,支持 web push, 也可以添加到桌面,像一个 app 一样使用
1 | { |
1 | //通过 serviceWorker.register 注册了这个 js |
Web Component Chrome: 90+
浏览器可以识别自定义标签,比如 <ljk></ljk>
, 没有任何默认样式和状态
同时,默认提供了 <button/>
<input/>
等内置组件,Web Component
就可以让我自定义代码,封装出类似的组件,使其可以在网页中复用,有两个很重要的关键点
- Shadow DOM
- HTML template
如图,我们有一个 <input type="range"/>
控件,审查元素,我们发现只有一个光秃秃的 input
标签,别无其他,那其 range
的 ui 在哪里呢?
我们打开 Preferences
的 Show user agent shadow DOM
综上所述,<input type ="range"/>
就是一个内置的 Web Component
, 其对应的 UI, 藏在了 shadow-root
中
具体怎么自定义,请查看 官方例子
1 |
|
1 | customElements.define( |
HTML
忘记在哪里看到的段子
:::info
Q: 请问有什么同时支持 Angular, React, Vue 的 UI 组件库吗?
A: HTML
:::
文章的最后,想以 HTML
这个 “新” 东西结尾,想必大家学习前端,都是从 HTML
超文本标记语言这个 简单
的东西入门,前端发展至今,HTML 也变化了很多,丰富的控件能力,丰富的特性
光是 input
就有这么多种
推荐网站
MDN: 不多说,web 百科全书
web.dev: Google 官网的 web 学习网站,干货很多
张鑫旭博客: 不局限与 CSS , 虽然文风很尬,干货很多