2024年你不应该错过的CSS新特性,前端开发0基础学习

}

text-decoration: wavy underline var(–neon-blue);

}

新增相对单位:cap、lh、rlh、vi和 vb


[CSS中单位和值(drafts.csswg.org/css-values-…) 中单位有:

但在 相对单位中并没有提到cap、lh、rlh、vi和vb这几个相对单位。

从上表的描述来看,其中cap、lh、rlh的计算都和元素的字体以及行高等有关系。我用下图来描述一个字体的Cap Height,Line Height等:

Web性能

=====

contain 和 content-visibility


这两个属性是属于 CSS容器模块 的,其最大的特点应该是可以帮助Web开发者提高Web页面的性能:

当容器的内容发生变化时,浏览器考虑到其他元素可能也会发生变化,于是就会去检查页面中所有的元素。一直以来浏览器都是这么做的,大家都习以为常了。但从另一方面来说,开发者很清楚当前修改的元素是否独立、是否影响其他元素。因此如果开发者能把这个信息通过CSS告诉浏览器,那么浏览器就不需要再去考虑其他元素了,这就是非常完美的事情。而CSS容器模块中的contain属性就为我们提供了这种能力。

们来看@Manuel Rego Casasnovas在《An introduction to CSS Containment》文章中提供的一个示例:

假设一个页面有很多个元素,在这个示例中,我们有10000个这样的元素:

Lorem ipsum...

使用JavaScript的textContent这个API来动态更改div.item > div的内容:

const NUM_ITEMS = 10000;

const NUM_REPETITIONS = 10;

function log(text) {

let log = document.getElementById(“log”);

log.textContent += text;

}

function changeTargetContent() {

log(“Change “targetInner” content…”);

// Force layout.

document.body.offsetLeft;

let start = window.performance.now();

let targetInner = document.getElementById(“targetInner”);

targetInner.textContent = targetInner.textContent == “Hello World!” ? “BYE” : “Hello World!”;

// Force layout.

document.body.offsetLeft;

let end = window.performance.now();

let time = window.performance.now() - start; log(" Time (ms): " + time + “n”);

return time;

}

function setup() {

for (let i = 0; i < NUM_ITEMS; i++) {

let item = document.createElement(“div”);

item.classList.add(“item”);

let inner = document.createElement(“div”);

inner.style.backgroundColor = “#” + Math.random().toString(16).slice(-6);

inner.textContent = “Lorem ipsum…”;

item.appendChild(inner);

wrapper.appendChild(item);

}

}

如果不使用contain,即使更改是在单个元素上,浏览器在布局上的渲染也会花费大量的时间,因为它会遍历整个DOM树(在本例中,DOM树很大,因为它有10000个DOM元素):

在本例中,div的大小是固定的,我们在内部div中更改的内容不会溢出它。因此,我们可以将contain: strict应用到项目上,这样当项目内部发生变化时,浏览器就不需要访问其他节点,它可以停止检查该元素上的内容,并避免到外部去。

CSS容器模块中的content-visibility属性会显著影响第一次下载和第一次渲染的速度。此外,你可以立即与新渲染的内容交互,而无需等待内容的其余部分加载。该属性强制用户代理跳过不在屏幕上的标记和绘制元素。实际上,它的工作方式类似于延迟加载,只是不加载资源,而是渲染资源。

简单地说,CSS的content-visibility属性 可跳过不在屏幕上的内容渲染,包括布局(Layout)和渲染(Paint),直到真正需要布局渲染的时候为止。所以利用它可以使用初始用户加载速度更快,还能与屏幕上的内容进行更快的交互。

上图来自于@Una Kravets和@Vladimir Levin的《content-visibility: the new CSS property that boosts your rendering performance(web.dev/content-vis…%E3%80%8B%E4%B8%80%E6%96%87%E3%80%82%E4%BB%8E%E5%9B%BE%E4%B8%AD%E6%88%91%E4%BB%AC%E5%8F%AF%E4%BB%A5%E8%8E%B7%E7%9F%A5%EF%BC%8C%E4%BD%BF%E7%94%A8content-visibility): auto属性可使分块的内容区域的初始加载性能提高7倍。

有关于这方面的介绍,还可以阅读:

  • CSS Containment in Chrome 52

  • Helping Browsers Optimize With The CSS Contain Property

  • An introduction to CSS Containment

  • Let’s Take a Deep Dive Into the CSS Contain Property

  • [CSS Containment]((developer.mozilla.org/zh-CN/docs/…)

  • content-visibility: the new CSS property that boosts your rendering performance

  • Short note on content-visibility: hidden

  • Using content-visibility: hidden

  • Using content-visibility: auto

数据服务


数据服务指的是 Data Saver。啥意思呢?不做解释,直接用一段代码来描述:

@media (prefers-reduced-data: reduce) {

header {

background-image: url(/grunge.avif);

}

}

我想大家对于@media (prefers-reduced-data: reduce)应该不会陌生吧。是的,它就是我们所说的CSS媒体查询。只不过稍有不同的是,这个媒体查询是根据用户在设备上的设置喜好来做条件判断。比如上面示例代码,当用户在设备上开启了“Low Data Mode”(低数据模式),会加载grunge.avif图像,可以帮助iPhone上的应用程序减少网络数据的使用:

到目前为止,CSS媒体查询提供了多个媒体特性,可以以用户在设备上的喜好设置做为判断,比如iOS13+开始,iPhone提供的DarkMode模式(prefers-color-scheme):

比如,使用prefers-reduced-motion媒体查询用于检测用户的系统是否被开启了动画减弱功能:

上面提到的这些媒体查询条件都是在 CSS Media Queries Level 5(www.w3.org/TR/mediaque…) 模块中新增的。

除了上面提到的之外,还有一些我们平时很少见的媒体查询条件,比如:

@media (hover: hoveer) {}

@media (hover: none) and (pointer: coarse) {}

@media (hover: none) and (pointer: fine) {}

@media print and (min-resolution: 300dpi) {}

@media (scan: interlace) {}

@media (update) {}

@media(environment-blending: additive){}

@media (color) {}

变量字体


变量字体是一个非常有意思的CSS特性,它也常被称为“可变字体”,先给大家展示一个Demo:

变量字体的目标是让网站性能更好,同时给用户提供了更多选择和扩展。变量字体是类似矢量图形,允许为各种字体轴定义不同的值。变量字体设计中一般有五个注册轴,包括字体、字宽、斜体和光学尺寸。每个注册轴都有一个对应的四个字母的标记,可以映射到现有的CSS属性:

除了注册轴之外,字体设计器还可以包含自定义轴。自定义轴让可变字体变得更具创造性,因为不限制自定义轴的范围、定义或数量。与注册轴类似,自定义轴具有相应的四个字母标记。但是,自定义轴的字母标记必须是大写的。例如,你定义了一个注册轴是grade,其对应的字母标记是 GRAD。

比如上面示例效果对应的代码:

.text {

font-weight: 800;

font-style: italic;

font-variation-settings: “SSTR” 183, “INLN” 648, “TSHR” 460, “TRSB” 312, “TWRM” 638, “SINL” 557, “TOIL” 333, “TINL” 526, “WORM” 523;

transition: font-variation-settings .28s ease;

}

.text:hover {

font-weight: 400;

font-style: normal;

font-variation-settings: “SSTR” 283, “INLN” 248, “TSHR” 160, “TRSB” 112, “TWRM” 338, “SINL” 257, “TOIL” 133, “TINL” 426, “WORM” 223;

}

在Firefox浏览器中,我们还可以通过开发者工具中“字体”选项提供的相关可变字体注册轴的值调整:

调整完之后,可以获得新代码:

p {

font-size: 60px;

line-height: 37px;

letter-spacing: 0.113em;

font-variation-settings: “SSTR” 450, “INLN” 741, “TSHR” 292, “TRSB” 497, “TWRM” 173, “SINL” 557, “TOIL” 728, “TINL” 526, “WORM” 523, “TFLR” 362, “TRND” 516, “SWRM” 536, “TSLB” 509;

font-weight: 491;

}

对应效果如下:

Web可访问性

=======

:focus-visible 和 :focus-within


一直以来我很容易把:focus-within和:focus-visible混淆。其实:focus-within和:focus-visible都是CSS选择器 Level 4中用户操作类伪类选择器。早前在《初探CSS 选择器Level 4》中聊过:focus-within,但没有聊过:focus-visible。

另外,在《CSS :focus-within》教程中就提到过, :focus-within能非常方便处理获取焦点状态。当元素本身或其后代元素获得焦点时,:focus-within伪类的元素就会有效 。:focus-within伪类选择器的行为本质上是一种父选择器行为,子元素的状态会影响父元素的样式。由于这种“父选择器”行为需要借助用户的行为触发,属于“后渲染”,不会与现有的渲染机制相互冲突。

如果上面的介绍让你感到困惑的话,可以看下面这个Demo。你会发现,当

的后代元素得到焦点时,会有一个放大的效果:

实现上图的效果代码非常的简单:

form:focus-within {

box-shadow: 0px 0.2em 2.5em #c4c4c4;

transform: scale(1.025);

}

对于:focus-visible伪类来说,当元素匹配:focus伪类并且客户端(UA)的启发式引擎决定焦点应当可见时就会生效。这个选择器可以有效地根据用户的输入方式(鼠标 vs 键盘)展示不同形式的焦点。

简单点说,按键盘tab键和鼠标点击得到的焦点效果不同。比如:

/* 链接得到焦点时的样式 */

a:focus {

}

/*

* 1. 如果链接有焦点,但是浏览器通常不会显示默认的焦点样式,会覆盖上面的焦点样式

* 2. 不是按键盘tab键让链接得到的焦点,比如说鼠标点击链接

*/

a:focus:not(:focus-visible) {

}

/* 按键盘tab键让链接得到焦点的样式 */

a:focus-visible {

}

来看一个具体的案例。这个示例中分别用鼠标点击链链和按键盘tab键让链接得到焦点,它的样式是不一样的:

Web美化

=====

Color Level 4 和 Level 5


CSS Color Level 4 和 Level 5两个模块主要是为我们推出了一些颜色使用的新属性,比如:

  • <hwb()> :HWB(白色-白色-黑色的缩写)是另一种指定颜色的方法,类似于HSL,它描述了一开始的色调,然后是一定程度的白色和黑色混合到基本色调

  • <lab()>和<lch()> :Lab是由一个亮度通道和两个颜色通道组成的。在Lab颜色空间中,每个颜色用L(亮度)、a(从绿色到红色的分量)和b(从蓝色到黄色的分量)三个数字表示。而Lch分别表示了颜色的亮度、饱和度和色调

  • <gray()> :灰色是完全去饱和的颜色,gray()函数表示法简化了对这组常见颜色的指定,因此只需要一个数值参数,用来指定颜色的灰度

  • <color()> :该函数允许在特定的颜色空间中指定颜色

  • <device-cmyk()> :该函数是以CMYK(青色、品红、黄色和黑色)组合,在该设备上生成特定的颜色

  • :根据用户操作系统来匹配颜色

  • color-mix() :该函数接受两个规范,并在给定的颜色空间中以指定的数量返回它们混合的结果

  • color-contrast() :该函数首先使用一种颜色(通常是背景色),然后使用两种或两种以上颜色的列表,它从该列表中选择亮度对比度最高的颜色到单一颜色

  • color-adjust() :该函数接受一个规范,并通过指定的转换函数在给定的颜色空间中返回调整该颜色的结果 颜色扩展:根据现有的颜色(在这称为“原始颜色”)在函数的目标颜色空间中生成颜色,它是<rgb()>、<rgba()>、<hsl()>、<hsla()>、<hwb()>、<lab()>和<lch()>的扩展颜色

对于Web开发者来说,最大的感受是语法规则有较大的变化:

来看两个示例:

// Color Level 4

.colour {

–fn-notation: hsl(2rad 50% 50% / 80%);

–neon-pink: color(display-p3 1 0 1);

–gray: lch(50% 0 0);

–fallback: color(lab 25 25 25, display-p3 1 0 1, #ccc);

}

// Color Level 5

.colour {

–pink: color-mix(red, white);

–halfpink: color(var(–pink) / 50%);

–halfred: rgb(from #f00 / 50%);

–darkred: hsl(from red h s calc(l * .25));

}

这里再特意提一下display-p3颜色,我们可以配合CSS的媒体查询@media (dynamic-range: high)一起使用:

@media (dynamic-range: high) {

.neon-red {

–neon-glow: color(display-p3 1 0 0);

}

.neon-pink {

–neon-glow: color(display-p3 1 0 1);

}

.neon-purple {

–neon-glow: color(display-p3 0 0 1);

}

.neon-blue {

–neon-glow: color(display-p3 0 1 1);

}

.neon-green {

–neon-glow: color(display-p3 0 1 0);

}

.neon-yellow {

–neon-glow: color(display-p3 1 1 0);

}

.neon-white {

–neon-glow: color(display-p3 1 1 1);

}

}

注意,Display-P3颜色空间颜色要比sRGB颜色空间中的颜色更鲜艳:

也可以说,Display-P3是sRGB的一个超集,大约要大35%:

Safari 97预览版本可以查看到display-p3的效果:

同样的,在color()函数中使用display-p3指定颜色空间时,也可以和sRGB颜色空间相互转换,如下图所示:

下面是@Adam Argyle 在Codepen提供的一个有关于display-p3的示例:

::marker


::marker也是CSS的伪元素,现在被纳入到CSS Lists Module Level 3规范中。在该规范中涵盖了列表和计算数器相关的属性,比如我们熟悉的list-style-type、list-style-position、list-style、list-item、counter-increment、counter-reset、counter()和counters()等属性。

在CSS中display设置list-item值之后就会生成一个Markers标记以及控制标记位置和样式的几个属性,而且还定义了计数器(计数器是一种特殊的数值对象),而且该计数器通常用于生成标记(Markers)的默认内容。

一时之间,估计大家对于Markers标记并不熟悉,但对于一个列表所涉及到的相关属性应该较为熟悉,对于一个CSS List,它可以涵盖了下图所涉及到的相关属性:

事实上,CSS的::marker和伪元素::before(或::after)类似,也可以通过content和attr()一起来控制Marker标记的效果。需要记住,生成个性化Marker标记内容需要做到几下几点:

非列表项li元素需要显式的设置display:list-item (内联列表项需要使用display: inline list-item)

需要显式设置list-style-type为none

使用content添加内容(也可以通过attr()配合data-*来添加内容)

比如下面这个小示例:

另外,::marker还没有得到浏览器支持之前,一般都是使用CSS的计数器来实现一些带有个性化的有顺序列表,比如下面这样的效果:

是不是很有意思,有关于::marker伪元素更详细的介绍,还可以阅读:《 Custom bullets with CSS ::marker》一文。

text-emphasis


先上张图:

上图的效果就是使用CSS的text-emphasis实现的。在以往我们要给文本添加一些装饰效果,除了加粗(font-weight)、倾斜(font-style)、阴影(text-shadow),文本上面或下面添加线条(text-decoration)等之外也没有别的了(当然,还可以使用其他的CSS实现一些特殊效果)。但要实现上图的效果还是有一定难度的。不过text-emphasis的出现,这一切变得要简单地多。

text-emphasis是属于 CSS Text Decoration Module 规范中的一个特性,在 Level 3中和text-emphasis有关的属性还有text-emphasis-style和text-emphasis-color,而且text-emphasis是这两个属性的简写属性。另外还有一个用来指定标记符位置的属性text-emphasis-position:

.emphasis {

text-emphasis: triangle rebeccapurple;

text-emphasis-position: under;

}

在 Level 4的规范中还新增了text-emphasis-skip属性。

具体的效果如下:

color-scheme


color-scheme属性来自于 CSS Color Adjustment Module Level 1。如果你在自己的项目中实现过iOS的DarkMode的效果,你肯定使用过CSS的媒体查询prefers-color-scheme。

:root {

–color: #fff;

–color-bg: #000;

}

@media (prefers-color-scheme: dark) {

–color: #000;

–color-bg: #fff;

}

body {

color: var(–color);

background-color: var(–color-bg)

}

虽然说,这可以让用户根据自己喜好来选择自己喜欢的皮肤,但这并不能覆盖所有的。这个时候可以使用color-scheme属性来做一定的补充。该属性允许用户通过用户代理控制自动调整色彩模式,比如暗色模式,对比度调整或特定所需的配色方案。这些值与用户的首选项进行协商,从而产生影响用户界面(UI)内容的所选颜色方案,例如表单控制和滚动条的默认颜色,以及CSS系统颜色的使用值。

color-scheme有两种用法,先来看第一种:

:root {

color-scheme: dark light;

}

在:root元素上,使用color-scheme颜色方案进行渲染,会影响画布的表面颜色(即全局背景颜色),color属性的初始值和系统颜色的使用值,还应该影响视窗滚动条颜色。

另外一种使用方式是在标签上:

要遵守color-scheme CSS属性,需要先下载CSS(如果它是通过引用的)并进行解析。为了帮助用户代理立即用所需的颜色方案渲染页面背景,还可以在元素中提供一个颜色方案值。

由于meta标记和CSS属性(如果应用到:root)最终都会导致相同的行为,所以我更建议通过meta标记指定颜色方案,这样浏览器可以更快地采用首选方案。

最后给大家提供@tomayac提供的一个关于color-scheme的Demo,下图是dark和light下相应的效果:

这里仅仅是简单的说了一下color-scheme属性,如果想深入的了解还是需要阅读一些相关的教程:

CSS Color Adjustment Module Level 1: color-scheme

Improved dark mode default styling with the color-scheme CSS property and the corresponding meta tag

Don’t Forget the color-scheme Property

其他

==

& > 和 @nest


很多同学应该使用过像Sass、LESS之类的CSS处理器,这些处理器中有一个特大的特性就是选择器的嵌套,比如Sass中:

.parent {

& > .child {

color: red;

}

}

.child {

.parent & {

color: blue;

}

}

编译之后的CSS:

.parent > .child {

color: red;

}

.parent .child {

color: blue;

}

以往只能在CSS处理器中使用这样的特性,但将来在CSS中也可以使用这方面的特性,因为现在CSS中新增了一个嵌套模块,即 CSS Nesting Module。有点类似于CSS自定义属性(变量)特性一样,最早也是出现在CSS处理器中,现在原生CSS也支持了这方面的特性。

也就是说,在不久的将来(如果在你的工程构建中配置了postcss-preset-env,现在就可以使用):

article, p {

&  p {

color: blue;

}

}

相当于:

:is(article, p) p {

color: blue;

}

也就是:

article p,

p p {

color: blue

}

还可以是& >结合起来使用:

article, p {

& > p {

color: blue;

}

}

相当于:

article > p,

p > p{

color: blue;

}

再来看另外几种有效的嵌套方式:

.foo {

color: blue;

& > .bar {

color: red;

}

}

/* 等同于 */

.foo {

color: blue;

}

.foo > .bar {

color: red;

}

.foo {

color: blue;

&.bar {

color: red;

}

}

/* 等同于 */

.foo {

color: blue;

}

.foo.bar {

color: red;

}

.foo, .bar {

color: blue;

& + .baz, &.qux {

color: red;

}

}

/* 等同于 */

.foo, .bar {

color: blue;

}

:is(.foo, .bar) + .baz,

:is(.foo, .bar).qux {

color: red;

}

但是下面这几种写法将是 无效的:

/* 无效,因为没有嵌套选择器 */

.foo {

color: red;

.bar {

color: blue;

}

}

/* 无效,因为&不在第一个复合选择器中 */

.foo {

color: red;

.bar & {

color:blue;

}

}

/* 无效,因为列表中的第二个选择器不包含嵌套选择器 */

.foo {

color: red;

&.bar, .baz {

color: blue;

}

}

还可以结合 @nest 使用。下面这几种嵌套方式都是有效的:

.foo {

color: red;

@nest & > .bar {

color: blue;

}

}

/* 等同于 */

.foo {

color: red;

}

.foo > .bar {

color: blue;

}

.foo {

color: red;

@nest .parent & {

color: blue;

}

}

/* 等同于 */

.foo {

color: red;

}

.parent .foo {

color: blue;

}

.foo {

color: red;

@nest :not(&) {

color: blue;

}

}

/* 等同于 */

.foo {

color: red;

}

:not(.foo) {

color: blue;

}

但像下面这样嵌套则是无效的:

/* 无效,因为没有嵌套选择器 */

.foo {

color: red;

@nest .bar {

color: blue;

}

}

/* 无效,因为不是列表中的所有选择器都包含嵌套选择器 */

.foo {

color: red;

@nest & .bar, .baz {

color: blue;

}

}

注意,如果使用@nest时记得要和&结合在一起使用才有效。

@property


在CSS Houdini中,最令人兴奋的是给CSS自定义属性和值的API。这个API通过赋予CSS自定义属性(通常也称为CSS变量)语义意义(由语法定义)甚至回退值来增强CSS自定义属性。

简单地说,可以使用CSS Houdini的CSS自定义属性和值的CSS.registerProperty()来注册一个自定义属性:

CSS.registerProperty({

name: ‘–colorPrimary’,

syntax: ‘’,

initialValue: ‘magenta’,

inherits: false

});

这样一来就可以使用已注册好的–colorPrimary自定义属性:

.card {

background-color: var(–colorPrimary); /* magenta */

}

.highlight-card {

–colorPrimary: yellow;

background-color: var(–colorPrimary); /* yellow */

}

.another-card {

–colorPrimary: 23;

background-color: var(–colorPrimary); /* magenta */

}

现在或者将来,我们可以直接使用CSS的@property来注册一个自定义属性:

@property --gradient-start {

syntax: “”;

initial-value: white;

inherits: false;

}

在CSS中就可以直接像下面这样使用:

.el {

–gradient-start: white;

background: linear-gradient(var(–gradient-start), black);

transition: --gradient-start 1s;

}

.el:hover {

–gradient-start: red;

}

比如下面这个示例(请使用Chrome 85+查看):

在CSS的世界中,还有另外一套规范是和CSS自定义属性有关的,那就是 CSS Custom Properties for Cascading Variables Module Level 1。使用–在选择器块中声明自定义属性,然后使用var()函数引用已声明的自定义属性,将其当作CSS属性的值:

:root {

–color: #f09

}

body {

color: var(–color)

}

到目前为止,CSS自定义属性(也有同学称为CSS变量)已经得到了主流浏览器的使用,而且在一些大型Web应用中可以看到其身影。另外CSS自定义属性被运用的场景也很多,比如说@Adam Argyle就用CSS自定义属性模拟了一套缓动函数,我们可以用于CSS Animation中:

:root {

–ease-in-quad: cubic-bezier(0.55, 0.085, 0.68, 0.53);

–ease-in-cubic: cubic-bezier(0.55, 0.055, 0.675, 0.19);

–ease-in-quart: cubic-bezier(0.895, 0.03, 0.685, 0.22);

–ease-in-quint: cubic-bezier(0.755, 0.05, 0.855, 0.06);

–ease-in-expo: cubic-bezier(0.95, 0.05, 0.795, 0.035);

–ease-in-circ: cubic-bezier(0.6, 0.04, 0.98, 0.335);

–ease-out-quad: cubic-bezier(0.25, 0.46, 0.45, 0.94);

–ease-out-cubic: cubic-bezier(0.215, 0.61, 0.355, 1);

–ease-out-quart: cubic-bezier(0.165, 0.84, 0.44, 1);

–ease-out-quint: cubic-bezier(0.23, 1, 0.32, 1);

–ease-out-expo: cubic-bezier(0.19, 1, 0.22, 1);

–ease-out-circ: cubic-bezier(0.075, 0.82, 0.165, 1);

–ease-in-out-quad: cubic-bezier(0.455, 0.03, 0.515, 0.955);

–ease-in-out-cubic: cubic-bezier(0.645, 0.045, 0.355, 1);

–ease-in-out-quart: cubic-bezier(0.77, 0, 0.175, 1);

–ease-in-out-quint: cubic-bezier(0.86, 0, 0.07, 1);

–ease-in-out-expo: cubic-bezier(1, 0, 0, 1);

–ease-in-out-circ: cubic-bezier(0.785, 0.135, 0.15, 0.86);

–easing: var(–ease-in-quad);

}

.animation__target {

animation: ani 5s var(–easing) alternate infinite;

}

// JavaScript

const handlerElement = document.getElementById(“easing”);

handlerElement.addEventListener(“change”, function (e) {

document.documentElement.style.setProperty(“–easing”, e.target.value);

});

点击这里查看效果:

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

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img
img
img
img

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

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
img

跳槽是每个人的职业生涯中都要经历的过程,不论你是搜索到的这篇文章还是无意中浏览到的这篇文章,希望你没有白白浪费停留在这里的时间,能给你接下来或者以后的笔试面试带来一些帮助。

也许是互联网未来10年中最好的一年。WINTER IS COMING。但是如果你不真正的自己去尝试尝试,你永远不知道市面上的行情如何。这次找工作下来,我自身感觉市场并没有那么可怕,也拿到了几个大厂的offer。在此进行一个总结,给自己,也希望能帮助到需要的同学。

面试准备

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

面试准备根据每个人掌握的知识不同,准备的时间也不一样。现在对于前端岗位,以前也许不是很重视算法这块,但是现在很多公司也都会考。建议大家平时有空的时候多刷刷leetcode。算法的准备时间比较长,是一个长期的过程。需要在掌握了大部分前端基础知识的情况下,再有针对性的去复习算法。面试的时候算法能做出来肯定加分,但做不出来也不会一票否决,面试官也会给你提供一些思路。
0.515, 0.955);

–ease-in-out-cubic: cubic-bezier(0.645, 0.045, 0.355, 1);

–ease-in-out-quart: cubic-bezier(0.77, 0, 0.175, 1);

–ease-in-out-quint: cubic-bezier(0.86, 0, 0.07, 1);

–ease-in-out-expo: cubic-bezier(1, 0, 0, 1);

–ease-in-out-circ: cubic-bezier(0.785, 0.135, 0.15, 0.86);

–easing: var(–ease-in-quad);

}

.animation__target {

animation: ani 5s var(–easing) alternate infinite;

}

// JavaScript

const handlerElement = document.getElementById(“easing”);

handlerElement.addEventListener(“change”, function (e) {

document.documentElement.style.setProperty(“–easing”, e.target.value);

});

点击这里查看效果:

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

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-Sz7tdJLE-1710583571427)]
[外链图片转存中…(img-3M79fniN-1710583571428)]
[外链图片转存中…(img-J8MKnwka-1710583571428)]
[外链图片转存中…(img-2fCYOZUc-1710583571429)]

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

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
[外链图片转存中…(img-rk7J7SK5-1710583571429)]

跳槽是每个人的职业生涯中都要经历的过程,不论你是搜索到的这篇文章还是无意中浏览到的这篇文章,希望你没有白白浪费停留在这里的时间,能给你接下来或者以后的笔试面试带来一些帮助。

也许是互联网未来10年中最好的一年。WINTER IS COMING。但是如果你不真正的自己去尝试尝试,你永远不知道市面上的行情如何。这次找工作下来,我自身感觉市场并没有那么可怕,也拿到了几个大厂的offer。在此进行一个总结,给自己,也希望能帮助到需要的同学。

面试准备

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

面试准备根据每个人掌握的知识不同,准备的时间也不一样。现在对于前端岗位,以前也许不是很重视算法这块,但是现在很多公司也都会考。建议大家平时有空的时候多刷刷leetcode。算法的准备时间比较长,是一个长期的过程。需要在掌握了大部分前端基础知识的情况下,再有针对性的去复习算法。面试的时候算法能做出来肯定加分,但做不出来也不会一票否决,面试官也会给你提供一些思路。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值