关于前端:精读不再需要-JS-做的-5-件事

3次阅读

共计 2873 个字符,预计需要花费 8 分钟才能阅读完成。

关注 JS 太久,会养成任何性能都用 JS 实现的习惯,而遗记了 HTML 与 CSS 也具备肯定的性能特色。其实有些性能用 JS 实现吃力不讨好,咱们要综合应用技术工具,而不是只依赖 JS。

5 things you don’t need Javascript for 这篇文章就从 5 个例子登程,通知咱们哪些性能不肯定非要用 JS 做。

概述

应用 css 管制 svg 动画

原文绘制了一个放烟花的 例子,实质上是用 css 管制 svg 产生动画成果,外围代码:

.trail {
  stroke-width: 2;
  stroke-dasharray: 1 10 5 10 10 5 30 150;
  animation-name: trail;
  animation-timing-function: ease-out;
}

@keyframes trail {
  from,
  20% {
    stroke-width: 3;
    stroke-dashoffset: 80;
  }
  100%,
  to {
    stroke-width: 0.5;
    stroke-dashoffset: -150;
  }
}

能够看到,次要应用 stroke-dasharray 管制线条实虚线的款式,再利用动画成果对 stroke-dashoffset 产生变动,从而实现对线条起始点进行位移,实现线条“绘图”的成果,且该 css 款式对 svg 绘制的门路是失效的。

sidebar

能够齐全应用 css 实现 hover 时才呈现的侧边栏:

nav {
  position: 'absolute';
  right: 100%;
  transition: 0.2s transform;
}

nav:hover,
nav:focus-within {transform: translateX(100%);
}

外围在于 hover 时设置 transform 属性能够让元素偏移,且 translateX(100%) 能够位移以后元素宽度的身位。

另一个有意思的是,如果应用 TABS 按键聚焦到 sidebar 内元素也要让 sidebar 进去,能够间接用 :focus-within 实现。如果须要 hover 后提早展现能够应用 transition-delay 属性。

sticky position

应用 position: sticky 来黏住一个元素:

.square {
  position: sticky;
  top: 2em;
}

这样该元素会始终展现在其父容器内,但一旦其呈现在视窗时,当 top 超过 2em 后就会变为 fixed 定位并放弃原位。

应用 JS 判断还是挺简单的,你得设法监听父元素滚动,并且在定位切换时可能产生一些抖动,因为 JS 的执行与 CSS 之间是异步关系。但当咱们只用 CSS 形容这个行为时,浏览器就有方法解决转换时的抖动问题。

手风琴菜单

应用 <details> 标签能够实现相似一个繁难的折叠手风琴成果:

<details>
  <summary>title</summary>
  <p>1</p>
  <p>2</p>
</details>

<details> 标签内的 <summary> 标签内容总是会展现,且点击后会切换 <details> 内其余元素的显暗藏。尽管这做不了非凡动画成果,但如果只为了做一个一般的开展折叠性能,用 HTML 标签就够了。

暗色主题

尽管直觉上暗色主题如同是一种定制业务逻辑,但其实因为暗色主题太过于广泛,以至于操作系统和浏览器都内置实现了,而 CSS 也实现了对应的办法判断以后零碎的主题到底是亮色还是暗色:prefers-color-scheme。

所以如果零碎要实现暗色系主题,最好能够和操作系统设置保持一致,这样用户体验也会更好:

@media (prefers-color-scheme: light) {/** ... */}
@media (prefers-color-scheme: dark) {/** ... */}
@media (prefers-color-scheme: no-preference) {/** ... */}

如果应用 Checkbox 勾选是否开启暗色主题,也能够仅用 CSS 变量判断,外围代码是:

#checkboxId:checked ~ .container {background-color: black;}

~ 这个符号示意,selector1 ~ selector2 时,为选择器 selector1 之后满足 selector2 条件的兄弟节点设置款式。

精读

除了下面例子外,笔者再追加几个例子。

幻灯片滚动

幻灯片滚动即每次滚动有固定的步长,把子元素残缺的展现在可视区域,不可能呈现高低或者左右两个子元素各呈现一部分的“割裂”状况。

该场景除了用浏览器实现幻灯片外,在许多网站首页也被频繁应用,比方将首页切割为 5 个纵向滚动的区块,每个区块展现一个产品个性,此时滚动不再是间断的,而是从一个区块到另一个区块的残缺切换。

其实这种成果无需 JS 实现:

html {scroll-snap-type: y mandatory;}
.child {scroll-snap-align: start;}

这样便将页面设置为精准捕获子元素滚动地位,在滚轮触发、鼠标点击滚动条松手或者键盘高低按键时,scroll-snap-type: y mandatory 能够精准捕获这一垂直滚动行为,并将子元素齐全滚动到可视区域。

色彩选择器

应用 HTML 原生就能实现色彩选择器:

<input type="color" value="#000000">

该选择器的益处是性能、可维护性都十分十分的好,甚至能够捕获桌面的色彩,不好的中央是无奈对拾色器进行定制。

总结

对于 CSS 能够实现哪些本来须要 JS 做的事,有很多很好的文章,比方:

  • youmightnotneedjs。
  • You-Dont-Need-JavaScript。
  • 以及本文简介里介绍的 5 things you don’t need Javascript for。

但并不是读了这些文章,咱们就要尽量用 CSS 实现所有能做的事,那样也没有必要。CSS 因为是描述性语言,它能够准确管制款式,但却难以准确管制交互过程,对于规范交互行为比方幻灯片滑动、动画能够应用 CSS,对于非标准交互行为,比方自定义地位弹出 Modal、用 svg 绘制齐全自定义门路动画尽量还是用 JS。

另外对于交互过程中的状态,如果须要传递给其余元素响应,还是尽量应用 JS 实现。尽管 CSS 伪类能够帮咱们实现大部分这种能力,但如果咱们要监听状态变动发一个申请什么的,CSS 就无能为力了,或者咱们须要十分 trick 的利用 CSS 实现,这也违反了 CSS 技术选型的初衷。

最初,是否在适合的场景抉择 CSS 计划,也是技术选型能力的一种,不要忘了 CSS 实用的畛域,不要什么性能都用 JS 实现。

探讨地址是:精读《不再须要 JS 做的 5 件事》· Issue #413 · dt-fe/weekly

如果你想参加探讨,请 点击这里,每周都有新的主题,周末或周一公布。前端精读 – 帮你筛选靠谱的内容。

关注 前端精读微信公众号

<img width=200 src=”https://img.alicdn.com/tfs/TB165W0MCzqK1RjSZFLXXcn2XXa-258-258.jpg”>

版权申明:自在转载 - 非商用 - 非衍生 - 放弃署名(创意共享 3.0 许可证)

正文完
 0