aoray 发布的文章

本文仅为防止内容丢失而做的转载记录,内容转自微信公众号 前端充电宝 ,原文排版清晰简洁,若有需要建议前往原文浏览

随着技术的不断进步,CSS 已经从简单的样式表发展成为拥有众多内置函数的强大工具。这些函数不仅增强了开发者的设计能力,还使得样式应用更加动态、灵活和响应式。本文将深入探讨 CSS 常见的 66 个函数,逐一剖析它们的功能和用法,一起进入这个充满魔力的 CSS 函数世界!

640.png

基础

attr()

attr() 函数用于获取被选中元素的某个 HTML 属性值,并在样式文件中使用该值。这个函数也可以应用于伪类元素,此时它获取的是伪元素所依附的原始元素的属性值。

下面来看一个简单的例子:

 div {    background-color: attr(data-color);  }

在这个例子中,如果有一个 <div> 元素带有 data-color 属性(如 <div data-color="red">),那么该元素的背景色将被设置为红色。

注意,attr() 函数总是返回一个字符串,因此在使用它时需要确保所获取的属性值能够正确地被解析和应用到样式中。此外,不是所有的 CSS 属性都支持 attr() 函数,它通常用于那些可以接受字符串值的属性。

counter()、counters()

counter()counters()函数用于获取和操作计数器的值。CSS计数器是一种可以存储和递增/递减的数字值,通常与列表项、标题、页脚等元素的编号和排序相关。

counter()函数用于获取指定计数器的当前值。它接受一个参数,即计数器的名称。这个函数的返回值是计数器的当前数值。

 selector::before {    content: counter(counter-name);  }

其中,selector是想要添加计数器值的元素的选择器,counter-name是之前使用counter-resetcounter-increment定义的计数器的名称。

counters()函数用于获取多个嵌套计数器的值,并将它们连接成一个字符串。它接受两个或三个参数:计数器名称、分隔符字符串(可选),以及计数器样式(可选)。

 selector::before {    content: counters(counter-name, separator);    /* 或者 */    content: counters(counter-name, separator, style);  }
  • counter-name:计数器的名称。
  • separator:一个字符串,用于分隔不同计数器的值。
  • style:一个可选参数,指定计数器的显示样式,如decimal(十进制)、upper-roman(大写罗马数字)等。如果省略,将使用默认的十进制样式。

假设有一个嵌套列表,想要显示每个列表项的编号,包括所有嵌套的级别。我们可以使用counters()函数来实现这一点。

 /* 重置计数器 */  ol {    counter-reset: item;  }    /* 递增计数器 */  li::before {    counter-increment: item;    content: counters(item, " "); /* 使用空格作为分隔符 */  }

在这个例子中,每当遇到一个<li>元素时,item计数器就会递增。counters(item, " ")函数会将所有嵌套级别的计数器值连接起来,并使用空格分隔它们。因此,对于一个三级嵌套的列表项,它的内容将类似于“1 2 3”。

注意,为了使计数器工作,还需要使用counter-resetcounter-increment属性来初始化和递增计数器。同时,counter()counters()函数通常与::before::after伪元素一起使用,以便在元素的内容之前或之后插入计数器的值。

url()

url() 函数用于引用或包含外部资源,如图像、字体或其他媒体文件。这个函数通常与各种CSS属性一起使用,以指定这些属性所需的资源的位置。

url()函数的语法如下:

 url( [ <string> | <uri> ] )

其中<string><uri>参数表示资源的URL。这个URL可以是绝对路径(指向完整的互联网地址),也可以是相对路径(相对于当前CSS文件或HTML文件的位置)。

以下是一些url()函数在CSS中的使用例子:

  1. 背景图像:
 body {    background-image: url('images/background.jpg');  }
  1. 字体文件:
 @font-face {    font-family: 'MyCustomFont';    src: url('fonts/MyCustomFont.woff2') format('woff2'),         url('fonts/MyCustomFont.woff') format('woff');  }
  1. 列表样式图像:
 ul li {    list-style-image: url('images/list-bullet.png');  }
  1. 光标:
 body {    cursor: url('images/custom-cursor.cur'), auto;  }
  1. 边框图像:
 div {    border-image: url('images/border.png') 30% round;  }

在使用url()函数时,需要注意:

  • URL必须被引号包围,可以是单引号或双引号。
  • 如果资源位于同一服务器上,可以使用相对路径。如果资源位于不同的服务器或互联网上,需要使用完整的URL。
  • 浏览器会尝试下载并缓存url()函数中指定的资源,以便在需要时快速访问。
  • 如果资源无法加载(例如,由于404错误或跨域问题),则相关的CSS属性可能不会按预期工作。

var()

var() 函数用于访问CSS自定义属性(CSS变量)的值。CSS 自定义属性允许定义可在整个文档或特定元素范围内重复使用的值。通过使用 var() 函数,可以在样式表中引用这些值,从而实现更灵活和可维护的样式。

CSS 变量的声明以两个连字符(--)开头,后面跟着变量名和值。

 :root {    --main-color: blue;    --secondary-color: #333;  }

在这个例子中,在 :root 选择器中定义了两个变量 --main-color 和 --secondary-color:root 选择器指向文档的根元素,这意味着这些变量在整个文档中都是可用的。

然后,可以使用 var() 函数来引用这些变量的值。

 body {    background-color: var(--main-color);    color: var(--secondary-color);  }

在这个例子中,var(--main-color) 会被替换为 bluevar(--secondary-color) 会被替换为 #333

var() 函数也可以接受一个可选的第二个参数,作为变量未定义时的回退值。

 body {    background-color: var(--unknown-variable, red);  }

如果 --unknown-variable 没有被定义,background-color 将会设置为 red

CSS 变量非常有用,因为它们允许:

  • 在一个地方定义颜色、尺寸、字体等,然后在整个样式表中重复使用。
  • 动态地改变样式,通过JavaScript更改变量的值。
  • 实现更高级的样式逻辑和主题切换。

注意,CSS变量的作用域是它们被定义的位置。如果在元素的选择器中定义了变量,那么该变量只会在那个元素及其子元素中可用。如果在 :root 或其他更高级别的选择器(如 html)中定义了变量,那么它们将在整个文档中可用。

element()

element() 函数是 CSS3 中引入的一个背景函数,它能够将网站上的某部分元素作为背景图像来使用。换句话说,它可以将指定的 HTML 元素渲染为 CSS 背景图像。

element() 函数的基本语法是 element(id),其中 id 是必需参数,表示要作为背景图像使用的元素的 ID。

假设有一个带有 ID myElement 的元素,可以这样使用 element() 函数:

 #someOtherElement {    background-image: element(#myElement);  }

这里,#someOtherElement 的背景图像会被设置为 #myElement 的内容。

image-set()

image-set() 函数允许为不同的设备像素比提供不同的图像资源,从而确保图像在各种设备上都能以适当的分辨率显示。这对于响应式设计和确保图像在不同设备上的清晰度非常有用。

image-set()的基本语法如下:

 image-set(    <image-candidate> [<resolution> [, <image-candidate> [<resolution>]]*  )

其中,<image-candidate>是图像的 URL,<resolution>是该图像适用的设备像素比。可以指定多个图像候选项,每个都带有其适用的分辨率。浏览器将选择最适合当前设备像素比的图像。

 .img-responsive {    background-image: image-set(      url('image-320w.jpg') 1x,      url('image-640w.jpg') 2x    );  }

在这个例子中,如果设备像素比为 1(标准的非高清设备),浏览器将使用image-320w.jpg。如果设备像素比为 2(如 Retina 屏幕),浏览器将使用image-640w.jpg,这是一个更高分辨率的图像,可以确保在高清设备上显示的清晰度。

虽然image-set()主要用于背景图像,但也可以用于<img>标签的srcset属性,以实现类似的功能,并允许更复杂的图像选择逻辑,包括基于视口宽度和像素密度的选择。

颜色

rgb()、rgba()

rgb()rgba() 是 CSS 中用于定义颜色的函数。

rgb() 函数用于定义一个颜色,它由三个参数组成:红色(R)、绿色(G)和蓝色(B)。每个参数的值范围都是 0 到 255,代表颜色的强度。

 color: rgb(255, 0, 0); /* 红色 */  background-color: rgb(0, 255, 0); /* 绿色 */

rgba() 函数与 rgb() 类似,但它多了一个参数:透明度(Alpha)。Alpha 参数的范围是 0 到 1,其中 0 表示完全透明,1 表示完全不透明。

 color: rgba(255, 0, 0, 0.5); /* 半透明的红色 */  background-color: rgba(0, 255, 0, 0.3); /* 30% 不透明的绿色 */

使用 rgba() 可以实现带有透明度的颜色效果,这在设计需要渐变、阴影或其他视觉效果时非常有用。

hsl()、hsla()

hsl()hsla() 是 CSS 中另外两个用于定义颜色的函数,它们基于色相、饱和度、亮度模型,并可选地包含透明度(Alpha)信息。

hsl() 函数通过三个参数定义颜色:色相(Hue)、饱和度(Saturation)和亮度(Lightness)。

  • 色相(Hue):表示颜色的基本属性,取值范围是 0 到 360 度,代表色轮上的角度。
  • 饱和度(Saturation):表示颜色的纯度,取值范围是 0% 到 100%,其中 0% 表示灰色,100% 表示完全饱和。
  • 亮度(Lightness):表示颜色的明亮程度,取值范围也是 0% 到 100%,其中 0% 表示黑色,100% 表示白色。
 color: hsl(0, 100%, 50%); /* 红色 */  background-color: hsl(120, 100%, 25%); /* 深绿色 */

hsla() 函数与 hsl() 类似,但它多了一个参数:透明度(Alpha)。Alpha 参数的范围是 0 到 1,其中 0 表示完全透明,1 表示完全不透明。

 color: hsla(0, 100%, 50%, 0.5); /* 半透明的红色 */  background-color: hsla(120, 100%, 25%, 0.7); /* 70% 不透明的深绿色 */

使用 hsla() 可以实现带有透明度的 HSL 颜色效果,这在需要创建复杂的视觉效果或渐变时特别有用。

hwb()

HWB() 是一个颜色函数,它基于 HWB(Hue, Whiteness, Blackness)颜色模型来定义颜色。HWB 模型是 RGB 模型的一个变种,它使用色调(Hue)、白度(Whiteness)和黑度(Blackness)三个参数来定义颜色。

  • 色调(Hue):与 HSL 和 HSV 模型中的色调相同,表示颜色的基本属性,取值范围是 0 到 360 度。
  • 白度(Whiteness):表示颜色中白色的成分,取值范围是 0% 到 100%。增加白度会使颜色变得更亮。
  • 黑度(Blackness):表示颜色中黑色的成分,取值范围也是 0% 到 100%。增加黑度会使颜色变得更暗。

HWB 颜色模型的一个优点是它更符合人类的直观认知,因为可以直接通过调整白度和黑度来控制颜色的亮度和暗度,而不需要像在 RGB 模型中那样同时调整三个分量。

例如,hwb(0, 0%, 30%) 表示红色的色调,没有加入白色成分,但加入了 30% 的黑色成分,因此最终的颜色是偏深一点的红色。

hwb() 函数在 CSS 中的使用类似于其他颜色函数:

 color: hwb(0, 0%, 30%); /* 偏深一点的红色 */  background-color: hwb(120, 50%, 10%); /* 一种绿色调,带有一定的白色和黑色成分 */

lab()

lab() 是一个基于 CIELAB 色彩空间的颜色函数。CIELAB 是一种颜色空间,旨在更贴近人眼对颜色的感知。LAB 色彩空间由三个分量组成:L(亮度)、a(从绿色到红色的分量)、b(从蓝色到黄色的分量)。

  • L(亮度):表示颜色的亮度,取值范围是 0% 到 100%。0% 代表黑色,100% 代表白色。
  • a:表示颜色在绿色和红色之间的位置。正值表示偏向红色,负值表示偏向绿色。
  • b:表示颜色在蓝色和黄色之间的位置。正值表示偏向黄色,负值表示偏向蓝色。

lab() 函数在 CSS 中的使用如下:

 color: lab(50% -10 20); /* 一个具体的 LAB 颜色值 */  background-color: lab(90% 0 0); /* 高亮度、无 a 和 b 分量的颜色 */

与 RGB、HSL 等色彩空间相比,LAB 色彩空间更接近人眼对颜色的视觉感知,因此在某些情况下,使用 LAB 可能会更准确地匹配颜色。然而,lab() 函数在 CSS 中的支持度相对较低,可能不是所有浏览器都支持这个函数。

lch()

lch() 是一个基于 CIELCH 色彩空间的颜色函数。CIELCH 色彩空间是 CIELAB 色彩空间的扩展,其中 L 表示亮度,C 表示色度(即色彩的饱和度),H 表示色调(色相)。LCH 色彩空间提供了与 CIELAB 类似的颜色表示,但使用色度(Chroma)代替 a 和 b 分量,这通常更直观且易于理解。

  • L(亮度):表示颜色的亮度,取值范围是 0% 到 100%。0% 代表黑色,100% 代表白色。
  • C(色度):表示颜色的饱和度,即色彩的鲜艳程度。C 的值越大,颜色越鲜艳;C 的值越小,颜色越接近灰度。
  • H(色调):表示颜色的色相,即色彩在色轮上的角度。H 的取值范围是 0 到 360 度,其中 0 度代表红色,120 度代表绿色,240 度代表蓝色等。

lch() 函数在 CSS 中的使用如下:

 color: lch(50% 60 120deg); /* 一个具体的 LCH 颜色值 */  background-color: lch(90% 0 0deg); /* 高亮度、无色度(即灰色)的颜色 */

lch() 函数提供了在 CSS 中定义颜色的另一种方式,特别是对于那些需要直接控制亮度和色度而不是红、绿、蓝分量的场景。

device-cmyk()

device-cmyk() 用于表示印刷四分色模式(CMYK)的颜色。CMYK 是由青色(Cyan)、品红色(Magenta)、黄色(Yellow)和黑色(Black)四种颜色混合而成的减色混色模型。与 RGB 的加色混色模型不同,CMYK 中颜色混合时,亮度会降低。

device-cmyk() 函数中,每个颜色分量的取值范围都是 0 到 1,或者可以表示为百分比形式,从 0% 到 100%。这四个参数分别对应 C(青色)、M(品红色)、Y(黄色)和 K(黑色)。

例如,如果想表示一个由 50% 青色、75% 品红色、25% 黄色和 10% 黑色组成的颜色,可以这样写:

 color: device-cmyk(0.5, 0.75, 0.25, 0.1);

或者

 color: device-cmyk(50%, 75%, 25%, 10%);

color-mix()

color-mix() 是 CSS Color Module Level 5 提案中引入的一个实验性功能,用于混合两种颜色。该函数允许指定颜色空间(如 srgb、lch、lab 等)以及每种颜色混合的比例。**color-mix() 的语法如下:

 color-mix(in <color-space>, <color-percentage>, <color>);
  • :指定颜色空间,如 srgb、lch、lab 等。
  • :指定第一种颜色的混合比例,范围通常是 0% 到 100%。
  • :指定第二种颜色。

例如,如果想要混合红色(red)和蓝色(blue),并且红色占 70%,蓝色占 30%,可以这样写:

 div {    background-color: color-mix(in srgb, 70%, blue);  }

这将会产生一个偏向于红色的混合色。

oklab()

oklab() 是 CSS Color Module Level 4 中引入的一个实验性颜色函数,用于在 OKLab 色彩空间中定义颜色。OKLab 是一种颜色空间,旨在提供一个更均匀的颜色感知空间,同时保持与 CIELAB 相似的简单性和计算效率。

oklab() 函数中,颜色由三个分量表示:L(亮度)、O(橙色分量)和 K(黄色分量)。这些分量的取值范围通常是 0 到 1,或者可以转换为百分比形式。

oklab() 函数的语法如下:

 oklab(<number> <number> <number>)

其中,每个 <number> 分别代表 L、O 和 K 的值。

例如,要定义一个 OKLab 颜色值,可以这样:

 color: oklab(0.5 0.3 0.2);

滤镜

blur()

blur() 用于给图像或元素添加模糊效果。它属于 CSS 滤镜功能的一部分,可以在不影响布局的情况下应用各种视觉效果。

blur() 函数的语法很简单,它接受一个长度值作为参数,这个值表示模糊的程度。这个长度值可以是像素(px)、百分比(%)或者是 rem 单位。

 .blurred-element {    filter: blur(5px);  }

在这个例子中,.blurred-element 类选择器应用于一个 HTML 元素,blur(5px) 表示这个元素将应用 5 像素的模糊效果。

注意,blur() 滤镜效果在性能上可能有一定的开销,特别是在移动设备上或当应用于大型图像或元素时。因此,在使用时应谨慎考虑其对页面性能的影响,并尽量避免在不必要的场合使用。

另外,由于 CSS 滤镜在一些较旧的浏览器中可能不受支持,因此在使用 blur() 函数时,可能需要添加浏览器前缀(如 -webkit-)以确保兼容性,并检查目标浏览器的支持情况。

 .blurred-element {    -webkit-filter: blur(5px); /* Chrome, Safari, Opera */    filter: blur(5px);  }

最后,blur() 函数可以与其他 CSS 滤镜函数结合使用,以创建更复杂的效果,如亮度(brightness())、对比度(contrast())和灰度(grayscale())等。

 .complex-effect {    filter: blur(5px) brightness(50%) contrast(200%) grayscale(50%);  }

在这个例子中,complex-effect 类将同时应用模糊、亮度、对比度和灰度滤镜效果。

brightness()

brightness() 是一个滤镜函数,用于调整图像或元素的亮度。这个函数允许增加或减少图像或元素的整体亮度,使其看起来更亮或更暗。

brightness() 函数接受一个介于 0 和 1 之间的数字作为参数。这个数字表示相对于原始亮度的乘数因子。例如,如果参数是 0.5,那么亮度将降低到原始亮度的一半;如果参数是 1,那么亮度将保持不变;如果参数是 2,那么亮度将增加到原始亮度的两倍。

 img {    filter: brightness(0.7);  }

在这个例子中,所有<img>元素的亮度被降低到原始亮度的 70%。

注意,brightness() 函数的效果是线性的,这意味着它不会考虑图像中颜色的感知亮度。因此,在某些情况下,增加或减少亮度可能会导致颜色看起来不自然。

contrast()

contrast() 是一个滤镜函数,用于调整图像或元素的对比度。对比度是指图像中最亮和最暗部分之间的差异程度。通过增加或减少对比度,可以改变图像的色彩鲜明度和清晰度。

contrast() 函数接受一个数值作为参数,这个数值表示对比度的调整量。这个数值通常大于 0,其中 1 表示原始对比度(即不进行任何调整)。数值小于 1 会减少对比度,使图像看起来更加柔和或褪色;数值大于 1 会增加对比度,使图像看起来更加鲜明和清晰。

 img {    filter: contrast(1.5);  }

在这个例子中,所有<img>元素的对比度被增加到原始对比度的 1.5 倍,这通常会使图像看起来更加鲜明。

注意,contrast()函数的效果取决于图像本身的色彩和亮度分布。在某些情况下,增加对比度可能会导致图像细节丢失或色彩失真。因此,在使用contrast()函数时,应该谨慎调整参数值,以达到最佳效果。

saturate()

saturate() 是一个滤镜函数,用于调整图像或颜色的饱和度。饱和度是指颜色的强度和纯度,即颜色中包含的灰色成分的多少。saturate() 函数允许增加或减少颜色的饱和度,从而使颜色更加鲜艳或更加暗淡。

saturate() 函数接受一个数值作为参数,这个数值表示饱和度的调整量。这个数值通常大于 0,其中 1 表示不进行任何调整,保持原始饱和度。数值小于 1 会减少饱和度,使颜色看起来更加不饱和或灰色;数值大于 1 会增加饱和度,使颜色看起来更加鲜艳。

 div {    filter: saturate(2);  }

在这个例子中,所有 <div> 元素的颜色饱和度被增加到原始饱和度的 2 倍,这通常会使颜色看起来更加鲜艳。

注意,saturate() 函数的效果取决于原始颜色的饱和度。对于已经接近完全饱和的颜色,增加饱和度可能不会有显著的效果。同时,过度增加饱和度可能会导致颜色看起来过于鲜艳或不自然。

sepia()

sepia()是一个滤镜函数,用于将图像或元素的颜色转换为棕褐色(或称为“褐色”)效果,模仿老照片或复古风格。这个函数接受一个参数,通常是一个百分比值,用于指定转换的强度。

sepia()函数的参数范围是 0% 到 100%。当参数为 0% 时,图像或元素保持原样,不进行任何棕褐色转换。随着参数值的增加,图像或元素的颜色逐渐变为棕褐色,直到参数值达到 100% 时,完全转换为棕褐色。

 img {    filter: sepia(75%);  }

在这个例子中,所有<img>元素的颜色被转换为 75% 的棕褐色效果。

sepia()函数的效果是在不改变图像亮度或对比度的情况下,调整颜色的色调和饱和度,使其呈现出棕褐色的外观。这种效果在网页设计中常用于营造复古或怀旧的感觉。

invert()

invert() 是一个滤镜函数,用于反转图像或元素的颜色。具体来说,它会将图像或元素中的每个颜色值取反,从而得到相应的反色。在数字图像处理中,这个操作也被称为“取反”或“负片”效果。

使用 invert() 函数时,不需要指定任何参数,因为它会自动计算颜色值的反色。当应用 invert() 滤镜到一个元素上时,该元素中的所有颜色都会被反转。

 img {    filter: invert(1);  }

在这个例子中,所有 <img> 元素的颜色被反转。注意,invert() 函数的效果取决于图像或元素的原始颜色。对于彩色图像,invert() 会将每种颜色分量(红色、绿色和蓝色)取反,从而得到反色图像。

grayscale()

grayscale() 是一个滤镜函数,用于将图像或元素转换为灰度图像。这个函数接受一个参数,通常是一个百分比值,用于指定转换的强度。

grayscale()函数的参数范围是 0% 到 100%。当参数为 0% 时,图像或元素保持原样,不进行任何灰度转换。随着参数值的增加,图像或元素的颜色逐渐变为灰度,直到参数值达到 100% 时,完全转换为黑白灰度图像。

 img {    filter: grayscale(50%);  }

在这个例子中,所有<img>元素的颜色被转换为 50% 的灰度效果,即半灰度半彩色。

grayscale()函数的效果是通过减少图像中每个颜色分量的饱和度来实现的,从而得到灰度图像。这种效果在网页设计中常用于创建简约、低调或复古风格的视觉效果。

drop-shadow()

drop-shadow() 是一个滤镜函数,用于给图像或元素添加阴影效果。它可以接受多个参数来定义阴影的偏移量、模糊半径、扩展半径和颜色。

drop-shadow() 函数的语法如下:

 drop-shadow(offset-x offset-y blur-radius spread-radius color)
  • offset-x: 阴影的水平偏移量。正值会向右偏移,负值会向左偏移。
  • offset-y: 阴影的垂直偏移量。正值会向下偏移,负值会向上偏移。
  • blur-radius: 阴影的模糊半径。这个参数是可选的,如果不指定,阴影将不会有模糊效果。
  • spread-radius: 阴影的扩展半径。这个参数也是可选的,它定义了阴影的大小。正值会增加阴影的大小,负值会缩小阴影。
  • color: 阴影的颜色。
 div {    filter: drop-shadow(2px 2px 4px rgba(0, 0, 0, 0.5));  }

在这个例子中,所有 <div> 元素将会有一个向右下方偏移 2px,模糊半径为 4px,颜色为半透明黑色的阴影。

注意,drop-shadow() 函数与 box-shadow 属性有些相似,但它们在表现和行为上有一些差异。box-shadow 是在元素的边框外添加阴影,而 drop-shadow() 则是通过滤镜在图像或元素上直接创建阴影效果。

hue-rotate()

hue-rotate() 是一个滤镜函数,用于调整图像或元素的色调。它接受一个角度值作为参数,该角度值表示色调旋转的角度。正值会增加色调,而负值会减少色调。

hue-rotate()函数的语法如下:

 hue-rotate(angle)

其中angle是一个表示旋转角度的值,可以是正数或负数。角度值是以度(deg)为单位的,但不需要指定单位,因为 CSS 会自动解析它。

 img {    filter: hue-rotate(90deg);  }

在这个例子中,所有<img>元素的色调将被旋转 90 度。这意味着图像中的颜色将按照色相环的方向旋转 90 度,从而实现色调的调整。

渐变

linear-gradient()、repeating-linear-gradient()

linear-gradient()repeating-linear-gradient() 用于创建线性渐变效果。它们都可以用来在两个或多个颜色之间创建平滑的过渡。

linear-gradient()函数用于生成线性渐变背景。它接受至少两种颜色作为参数,并且可以根据需要接受更多的参数来定义渐变的方向、颜色停止点等。其语法如下:

 linear-gradient(angle | to direction, color-stop1, color-stop2, ...);
  • angle:定义渐变线的角度。
  • to direction:使用关键词定义渐变的方向(如 to top, to right 等)。
  • color-stop:定义渐变中的颜色停止点。
 background: linear-gradient(to right, red, yellow);

这将创建一个从左到右的红色到黄色的线性渐变背景。

repeating-linear-gradient()函数与 linear-gradient() 类似,但是它创建的渐变会无限地重复。这意味着渐变模式会在容器内重复填充,直到填满整个容器。参数与 linear-gradient() 相同,但效果是重复的。

 background: repeating-linear-gradient(to right, red, yellow 10px);

这将创建一个从左到右的重复线性渐变,其中红色和黄色之间的过渡每10像素重复一次。

radial-gradient()、repeating-radial-gradient()

radial-gradient()repeating-radial-gradient() 用于创建径向渐变(也称为圆形渐变或镜像渐变)效果。这些渐变从一个中心点开始,向外扩散或重复。

radial-gradient() 函数用于生成径向渐变背景。它至少需要两种颜色作为参数,并可以指定渐变的中心、形状(圆形或椭圆形)以及大小。其语法如下:

 radial-gradient(shape size at position, color-stop1, color-stop2, ...);
  • shape:可以是 circle(圆形)或 ellipse(椭圆形)。
  • size:定义渐变的大小,如 closest-side, farthest-side, closest-corner, farthest-corner,或者使用具体的长度值。
  • at position:定义渐变中心的位置。
  • color-stop:定义渐变中的颜色停止点。
 background: radial-gradient(circle, red, yellow);

这将创建一个从中心开始的红色到黄色的圆形径向渐变背景。

repeating-radial-gradient() 函数与 radial-gradient() 类似,但它创建的渐变会无限地重复。这意味着渐变模式会在容器内重复填充,直到填满整个容器。其语法与 radial-gradient() 相同,但效果是重复的。

 background: repeating-radial-gradient(circle, red, yellow 10%);

这将创建一个从中心开始的重复径向渐变,其中红色和黄色之间的过渡每10%的径向距离重复一次。

conic-gradient()、repeating-conical-gradient()

conic-gradient()repeating-conic-gradient() 用于创建锥形渐变和重复的锥形渐变效果。这些渐变从一个中心点开始,沿着辐射状的线条向外扩散。

conic-gradient() 函数用于生成锥形渐变背景。它接受多个颜色停止点作为参数,每个颜色停止点由一个颜色值和一个可选的角度(或百分比)组成,表示渐变中颜色变化的位置。其语法如下:

 conic-gradient(color-stop1 angle1, color-stop2 angle2, ...);
  • color-stop:定义渐变中的颜色停止点。
  • angle:定义颜色停止点的位置,可以是度数(0到360之间)或百分比(0%到100%之间)。
 background: conic-gradient(red 0%, yellow 100%);

这将创建一个从红色渐变到黄色的锥形渐变背景,其中红色位于渐变的起点(0度或0%),黄色位于渐变的终点(360度或100%)。

repeating-conic-gradient() 函数与 conic-gradient() 类似,但是它创建的渐变会无限地重复。这意味着锥形渐变模式会在容器内重复填充,直到填满整个容器。语法与 conic-gradient() 类似,但渐变会重复。

 background: repeating-conic-gradient(red 0% 25%, yellow 25% 50%);

这将创建一个重复的锥形渐变,其中红色和黄色之间的过渡从0%到25%,然后从25%到50%重复这个过渡。

数学

calc()

calc() 用于在 CSS 表达式中进行计算的功能,允许在 CSS 的属性值中使用基本的数学运算。

calc() 函数的主要用途是动态计算长度值。这意味着可以使用加、减、乘、除等运算符来组合不同的单位,并得出一个结果作为 CSS 属性的值。这在需要根据其他属性值或视口大小(如 vw、vh、vmin、vmax 等)动态调整元素尺寸时特别有用。

例如,如果想设置一个元素的宽度为其父元素宽度的一半减去 50px,可以这样写:

 .element {    width: calc(50% - 50px);  }

calc() 函数也可以和其他 CSS 函数一起使用,例如 min(), max()clamp()。这些函数允许设置一个值的范围或限制,calc() 可以在这个范围内进行计算。

例如,使用 min()max() 来确保元素的高度始终在 100px 和 200px 之间:

 .element {    height: calc(min(max(100px, 20vw), 200px));  }

在这个例子中,20vw 会根据视口的宽度变化,但使用 min()max() 函数可以确保计算出来的高度值始终在 100px200px 之间。

注意,calc() 函数中的运算符两边必须有空格,否则它将不会被正确解析。例如,calc(50% - 50px) 是正确的,而 calc(50%-50px) 则是错误的。

min()、max()

min()max() 函数用于限制一个值的最小和最大值。它们通常与 calc() 函数结合使用,以确保计算出的结果落在指定的范围内。

min() 函数接受两个或更多参数,并返回其中的最小值。如果参数是数值,它会返回最小的数值;如果参数是长度值,它会返回最短的长度。

 .element {    width: calc(min(50%, 300px));  }

在这个例子中,元素的宽度将被设置为 50% 和 300px 中的较小值。如果容器的宽度小于 600px,元素的宽度将是容器宽度的一半;如果容器的宽度大于或等于 600px,元素的宽度将是 300px。

max() 函数与 min() 函数类似,但它返回的是参数中的最大值。

 .element {    height: calc(max(100px, 10vh));  }

在这个例子中,元素的高度将被设置为 100px 和 10% 视口高度中的较大值。如果视口的高度小于 1000px,元素的高度将是 100px;如果视口的高度大于或等于 1000px,元素的高度将是视口高度的 10%。

注意,min()max() 函数接受的参数类型必须一致(即都是数值或都是长度值),否则它们将无法正确工作。此外,min()max() 函数也可以用在其他接受数值或长度值作为参数的 CSS 属性中,不仅仅是 widthheightfont-size 等属性。

clamp()

clamp() 用于将一个值限制在一个特定的范围内。这个函数接受三个参数:最小值(MIN)、首选值(VAL)和最大值(MAX)。

  • 如果首选值(VAL)在最小值(MIN)和最大值(MAX)之间,那么 clamp() 函数将返回首选值。
  • 如果首选值(VAL)小于最小值(MIN),那么函数将返回最小值。
  • 如果首选值(VAL)大于最大值(MAX),那么函数将返回最大值。

这个函数的语法是 clamp(MIN, VAL, MAX)。它特别有用在需要根据不同条件动态调整 CSS 属性的值,同时确保这个值始终在一个可接受的范围内。

例如,假设有一个元素的字体大小需要根据视口宽度进行调整,但希望字体大小始终在 12px 和 24px 之间。可以这样使用 clamp() 函数:

 h1 {    font-size: clamp(12px, 2vw, 24px);  }

在这个例子中,2vw 是首选值,它根据视口的宽度变化。如果视口宽度很小,导致 2vw 计算出来的值小于 12px,clamp() 函数将返回 12px。如果视口宽度很大,导致 2vw 计算出来的值大于 24px,clamp() 函数将返回 24px。如果 2vw 计算出来的值在 12px 和 24px 之间,那么 clamp() 函数将直接返回这个计算值。

这个函数为响应式设计和动态布局提供了很大的灵活性,因为它允许开发者定义一个值的范围,而不是固定一个具体的值。

图形

circle()

circle() 函数用于定义一个圆形区域,并可以用于多种 CSS 属性中,如shape-outsideclip-path。这个函数允许指定一个圆形的半径和位置,以创建特定的布局或剪裁效果。

  • 在shape-outside属性中,circle()函数定义了一个围绕元素内容的圆形路径,使得文本或其他内容可以环绕在这个圆形的外部流动。这对于创建独特的文本布局和视觉效果非常有用。
  • 在clip-path属性中,circle()函数则用于剪裁元素的内容,只显示圆形区域内的部分。这可以用于创建圆形头像、圆形图标等效果。

circle()函数的语法如下:

 circle( [ <length> | <percentage> ]? [ at <position> ]? )
  • 参数定义了圆形的半径。如果省略,浏览器会提供一个默认值。
  • at 参数是可选的,用于指定圆形的位置。如果省略,圆形将居中于元素。

例如,可以使用以下代码来创建一个半径为100px,位置在(50px, 50px)的圆形:

 shape-outside: circle(100px at 50px 50px);

或者,如果想要创建一个半径为50%的圆形,使其始终与元素的大小相匹配,可以这样写:

 clip-path: circle(50%);

ellipse()

ellipse() 函数用于定义一个椭圆形区域。与circle()函数类似,ellipse()函数也可以用于多种CSS属性中,如shape-outsideclip-path,以创建特定的布局或剪裁效果。

  • 在shape-outside属性中,ellipse()函数定义了一个围绕元素内容的椭圆形路径,使得文本或其他内容可以环绕在这个椭圆形的外部流动。这对于创建独特的文本布局和视觉效果非常有用,特别是在需要文本环绕非圆形区域时。
  • 在clip-path属性中,ellipse()函数则用于剪裁元素的内容,只显示椭圆形区域内的部分。这可以用于创建椭圆形头像、椭圆形图像裁剪等效果。

ellipse()函数的语法通常如下:

 ellipse( [ <length> | <percentage> ]{2} [ at <position> ]? )
  • 参数定义了椭圆的水平和垂直半径。可以提供两个值来分别指定椭圆的宽度和高度。
  • at 参数是可选的,用于指定椭圆形的位置。如果省略,椭圆形将居中于元素。

例如,以下代码创建了一个水平半径为100px,垂直半径为50px,位置在(50px, 50px)的椭圆形:

 shape-outside: ellipse(100px 50px at 50px 50px);

或者,如果想要创建一个与元素大小成比例的椭圆形,可以使用百分比值:

 clip-path: ellipse(50% 75%);

这将创建一个宽度为元素宽度50%,高度为元素高度75%的椭圆形剪裁。

inset()

inset() 函数用于定义图形剪裁区域的函数,主要在clip-path属性中使用。它允许创建一个矩形或带有圆角的矩形剪裁区域,该区域定义了元素内容应该显示的部分。

inset()函数的语法如下:

 inset( [ <length> | <percentage> ]{1,4} [ round <border-radius> ]? )
  • [ | ]{1,4}:这个参数指定了矩形边框的偏移量。可以提供1到4个值,分别代表上、右、下、左四个方向的偏移。如果只给出一个值,则所有四个方向都将使用这个值。如果给出两个值,第一个值将用于上下偏移,第二个值将用于左右偏移。如果给出三个值,它们将分别用于上、左右、下的偏移。如果给出四个值,它们将分别用于上、右、下、左的偏移。这些值可以是长度单位(如px、em等)或百分比。
  • round :这是一个可选参数,用于指定矩形的圆角半径。可以提供一个或多个值来定义不同角的圆角大小。这些值遵循与CSS的border-radius属性相同的语法和规则。
 /* 创建一个从边框向内偏移10px的矩形剪裁区域 */  clip-path: inset(10px);    /* 创建一个从顶部边框向内偏移20px,从右侧和左侧边框向内偏移30px,从底部边框向内偏移40px的矩形剪裁区域 */  clip-path: inset(20px 30px 40px);    /* 创建一个从顶部边框向内偏移10%,从右侧和左侧边框向内偏移20%,从底部边框向内偏移30%,并带有50px圆角的矩形剪裁区域 */  clip-path: inset(10% 20% 30% round 50px);    /* 创建一个带有四个不同圆角的矩形剪裁区域 */  clip-path: inset(20px round 10px 20px 30px 40px);

注意,inset()函数在clip-path属性中使用时,将创建一个内部剪裁效果,只显示矩形区域内的内容,而矩形外部的内容将被剪裁掉。

polygon()

polygon() 函数用于定义一个由直线段组成的多边形剪裁区域。这个函数通常在clip-path属性中使用,以剪裁图像或文本,只显示多边形区域内的部分。

polygon()函数的语法如下:

 polygon( [ <fill-rule> || <length-percentage>{2,n} ] )
  • :可选参数,用于定义当路径自相交时如何填充多边形。它可以是nonzero(默认值)或evenodd。
  • {2,n}:这个参数是必需的,它定义了多边形的每个顶点的坐标。每个顶点由两个值表示,分别是X和Y坐标。可以提供至少两个顶点来定义一个简单的多边形,每个顶点对由空格分隔。

以下是一些使用polygon()函数的例子:

 /* 定义一个三角形剪裁区域 */  clip-path: polygon(50% 0%, 0% 100%, 100% 100%);    /* 定义一个四边形(矩形)剪裁区域 */  clip-path: polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%);    /* 定义一个五边形剪裁区域 */  clip-path: polygon(0% 0%, 25% 100%, 50% 0%, 75% 100%, 100% 0%);    /* 使用 fill-rule */  clip-path: polygon(nonzero, 50% 0%, 0% 100%, 100% 100%);

这里,每个多边形的顶点坐标都是相对于元素自身的宽度和高度的百分比。可以使用绝对长度单位(如px, em等)代替百分比,但这通常不常见。

注意,polygon()函数定义的顶点顺序很重要,它决定了多边形的形状和方向。

path()

path()函数与clip-path属性结合使用,用于定义图形剪裁区域。该函数允许指定一个SVG路径来定义剪裁的形状。通过path()函数,可以使用SVG路径语法来创建复杂的剪裁区域,从而实现更精确的图像或文本剪裁效果。

path()函数的语法如下:

 clip-path: path(<svg-path-data>);

其中<svg-path-data>是一个SVG路径数据字符串,它描述了剪裁区域的形状。这个字符串可以使用SVG路径命令和参数来定义,例如M(moveto)L(lineto)C(curveto)等。

以下是一个使用path()函数剪裁图像的例子:

 .clipped-image {    clip-path: path('M0,0 L1,0 L1,1 L0,1 Z');  }

这里,path('M0,0 L1,0 L1,1 L0,1 Z')定义了一个矩形剪裁区域。这个路径从点(0,0)开始,沿直线到(1,0),然后到(1,1),再到(0,1),最后关闭路径(Z表示回到起始点)。

变换

scale()、scaleX()、scaleY()、scaleZ()、scale3d()

scale()scaleX()scaleY()scale3d() 是 CSS3 中的缩放函数,用于调整元素的大小。这些函数可以单独或组合使用,以实现元素在二维或三维空间中的缩放效果。

scale() 函数用于同时调整元素在水平和垂直方向上的大小。它接受两个参数,第一个参数表示水平缩放比例,第二个参数表示垂直缩放比例。如果只提供一个参数,那么第二个参数默认与第一个参数相同,实现等比例缩放。

 transform: scale(2); /* 元素在水平和垂直方向上放大两倍 */  transform: scale(1.5, 0.5); /* 元素在水平方向上放大1.5倍,垂直方向上缩小到一半 */

scaleX() 函数仅用于调整元素在 X 轴上的大小。它接受一个参数,表示水平缩放比例。

 transform: scaleX(2); /* 元素在水平方向上放大两倍 */

scaleY() 函数仅用于调整元素在 Y 轴上的大小。它接受一个参数,表示垂直缩放比例。

 transform: scaleY(0.5); /* 元素在垂直方向上缩小到一半 */

scaleZ() 函数仅用于调整元素在 Z 轴上的大小。它接受一个参数,表示在 Z 轴缩放比例。

 transform: scaleZ(0.5); /* 元素在Z轴上缩小到一半 */

scale3d() 函数用于在三维空间中调整元素的大小。它接受三个参数,分别表示在X轴、Y轴和Z轴上的缩放比例。

 transform: scale3d(1, 2, 0.5); /* 元素在X轴上不变,Y轴上放大两倍,Z轴上缩小到一半 */

注意:当使用多个变换函数时,它们应该通过空格分隔,并按特定的顺序应用(例如,先应用 scale(),然后是 rotate() 等)。

rotate()、rotateX()、rotateY()、rotateZ()、rotate3d()

rotate()rotateX()rotateY()rotateZ()rotate3d() 是 CSS3 中的旋转函数,用于调整元素在二维或三维空间中的旋转角度。这些函数可以作为 transform 属性的值来使用,以实现元素的旋转效果。

rotate() 函数用于在二维空间中旋转元素。它接受一个参数,表示旋转的角度(以度或弧度为单位)。旋转是相对于元素的中心点进行的,并且按照顺时针方向进行。

 transform: rotate(45deg); /* 元素顺时针旋转 45 度 */

rotateX() 函数用于在三维空间中绕 X 轴旋转元素。它接受一个参数,表示旋转的角度。正值表示元素按照顺时针方向旋转,负值表示逆时针方向旋转。

 transform: rotateX(90deg); /* 元素绕 X 轴顺时针旋转 90 度 */

rotateY() 函数用于在三维空间中绕 Y 轴旋转元素。它的参数和用法与 rotateX() 相同,只是旋转轴是 Y 轴。

 transform: rotateY(-45deg); /* 元素绕 Y 轴逆时针旋转 45 度 */

rotateZ() 函数用于在三维空间中绕 Z 轴旋转元素。它的参数和用法与 rotateX()rotateY() 相同,只是旋转轴是 Z 轴。在二维空间中,rotateZ()的效果与 rotate() 相同。

 transform: rotateZ(180deg); /* 元素绕 Z 轴旋转 180 度 */

rotate3d() 函数用于在三维空间中沿任意向量旋转元素。它接受四个参数,分别表示旋转向量的 X、Y、Z 分量以及旋转的角度。通过指定不同的向量分量,可以实现沿任意方向的旋转。

 transform: rotate3d(1, 0, 0, 60deg); /* 元素沿 X 轴方向旋转 60 度 */

translate()、translatex()、translatey()、translateZ()、translate3d()

translate()translatex()translatey()translateZ()translate3d() 是 CSS3 中的平移函数,用于在二维或三维空间中移动元素的位置。这些函数可以作为 transform 属性的值来使用,以实现元素的平移效果。

translate() 函数用于在二维空间中移动元素。它接受两个参数,第一个参数表示在 X 轴上的移动距离,第二个参数表示在 Y 轴上的移动距离。如果只提供一个参数,那么第二个参数默认值为 0,表示只在 X 轴上移动。

 transform: translate(50px, 100px); /* 元素在 X 轴上移动 50px,在 Y 轴上移动 100px */

translateX() 函数仅用于在水平方向(X轴)上移动元素。它接受一个参数,表示在 X 轴上的移动距离。

 transform: translateX(30px); /* 元素在 X 轴上移动 30px */

translateY() 函数仅用于在垂直方向(Y轴)上移动元素。它接受一个参数,表示在 Y 轴上的移动距离。

 transform: translateY(-50px); /* 元素在 Y 轴上向上移动 50px */

translateZ() 函数用于在三维空间的 Z 轴上移动元素。它接受一个参数,表示在 Z 轴上的移动距离。在二维渲染中,translateZ() 通常不会产生可见的效果,但它可以影响 3D 变换和其他 3D CSS 属性。

 transform: translateZ(20px); /* 元素在 Z 轴上移动 20px(在 2D 渲染中通常不可见) */

translate3d() 函数用于在三维空间中同时移动元素在 X、Y 和 Z 轴上的位置。它接受三个参数,分别表示在 X、Y、Z 轴上的移动距离。

 transform: translate3d(10px, 20px, 30px); /* 元素在 X 轴上移动 10px,Y 轴上移动 20px,Z 轴上移动 30px */

注意:在进行 3D 变换时,translateZ()translate3d() 会影响元素的层叠上下文,可能会改变元素的层叠顺序。

skew()、skewX()、skewY()

skew()skewX()skewY() 是 CSS3 中的倾斜函数,用于在二维空间中对元素进行倾斜变换。这些函数可以作为 trans\`\`form 属性的值来使用,以实现元素的倾斜效果。

skew() 函数允许在一个声明中同时指定 X 轴和 Y 轴的倾斜角度。它接受两个参数,第一个参数对应 X 轴的倾斜角度,第二个参数对应 Y 轴的倾斜角度。如果第二个参数未提供,则默认值为 0。

 transform: skew(30deg, 20deg); /* 元素在 X 轴上倾斜 30 度,在 Y 轴上倾斜 20 度 */

skewX() 函数仅用于在水平方向(X 轴)上倾斜元素。它接受一个参数,表示元素在 X 轴上的倾斜角度。

 transform: skewX(45deg); /* 元素在 X 轴上倾斜 45 度 */

skewY() 函数仅用于在垂直方向(Y 轴)上倾斜元素。它接受一个参数,表示元素在 Y 轴上的倾斜角度。

 transform: skewY(-30deg); /* 元素在 Y 轴上倾斜 -30 度(即向上倾斜) */

perspective()

perspective() 用于设置 3D 变换元素的透视效果。perspective() 函数必须与 transform 属性一起使用,以在元素上创建一种视觉上的深度感。

perspective() 函数接受一个长度值作为参数,这个值表示观察者与 z=0 平面之间的距离。这个距离定义了 3D 变换的透视效果。

 .element {    transform: perspective(500px) rotateX(45deg);  }

在这个例子中,.element 将被应用一个透视效果,观察者似乎位于距离 z=0 平面 500px 的地方,并且元素还绕 X 轴旋转了 45 度。

透视效果让元素在 z 轴上的变换看起来更加自然。离观察者较近的元素会显得更大,而离观察者较远的元素则会显得更小。这模仿了我们在现实世界中观察物体时的透视效果。

注意:在处理多个 3D 变换元素时,需要谨慎使用 perspective() 函数,因为每个元素上的透视效果是独立的。如果需要在一个容器内对多个元素应用透视效果,通常最佳做法是在容器元素上设置透视效果,而不是在每个子元素上分别设置。

matrix()、matrix3d()

matrix()matrix3d() 是 CSS3 中 transform 属性的两个函数值,它们允许通过矩阵来定义元素的 2D 和 3D 变换。

matrix() 函数用于定义 2D 变换矩阵。它接受六个参数,这些参数表示一个 3x3 的变换矩阵(但实际上只用到了六个值,因为最后一行总是 [0, 0, 1])。这个矩阵用于计算元素的最终位置。

matrix(n1, n2, n3, n4, n5, n6) 中的参数意义如下:

  • n1 和 n4 控制缩放和倾斜(scaleX 和 scaleY)。
  • n2 和 n3 控制倾斜(skewX 和 skewY)。
  • n5 和 n6 控制平移(translateX 和 translateY)。

实际上,这个矩阵可以看作是以下形式的简写:

 | n1 n2 0 |  | n3 n4 0 |  | n5 n6 1 |

matrix3d() 函数用于定义 3D 变换矩阵。它接受 16 个参数,这些参数表示一个 4x4 的变换矩阵。这个矩阵用于计算元素在三维空间中的最终位置和方向。

matrix3d(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13, n14, n15, n16) 中的参数意义较为复杂,但大致可以划分为以下几类:

  • 前四个参数(n1-n4)通常与 X 轴相关。
  • 接下来的四个参数(n5-n8)通常与 Y 轴相关。
  • 再接下来的四个参数(n9-n12)通常与 Z 轴相关(包括透视效果)。
  • 最后四个参数(n13-n16)控制平移(translateX, translateY, translateZ)和透视因子。

实际上,这个矩阵可以看作是以下形式的简写:

 | n1  n2  n3  n4 |  | n5  n6  n7  n8 |  | n9 n10 n11 n12 |  |n13 n14 n15 n16 |

其中,最后一列(n13, n14, n15, n16)主要用于平移变换和透视效果。

注意:

  • matrix() 和 matrix3d() 允许更精细的控制元素变换,但它们也比较复杂,不容易直观地理解。
  • 这两个函数通常用于高级的动画效果和复杂的布局情况。
  • 当使用 matrix() 或 matrix3d() 时,需要确保你提供的参数能正确地形成一个有效的变换矩阵。
  • 与其他 transform 函数值一样,matrix() 和 matrix3d() 的效果不会触发页面的重新布局,也不会影响其他元素(除了被变换的元素本身及其子元素)。

如果只是想进行简单的 2D 或 3D 变换,使用更高级的 translate(), rotate(), scale(), skew() 等函数可能更容易理解和实现。但是,对于复杂的变换或组合变换,matrix()matrix3d() 提供了更强大的功能。

布局

fit-content()

fit-content() 用于根据内容自动调整元素的尺寸。它接受一个参数,该参数可以是一个长度值(如 px、%、em 等)或百分比值,用于定义元素的最小或最大尺寸。当元素的内容超过指定尺寸时,fit-content() 函数可以确保元素的大小适应内容,但不会超过其最大限制。

在 CSS Grid 布局中,fit-content() 函数特别有用,因为它允许网格项根据内容动态调整大小。例如,可以使用 fit-content() 函数来设置网格项的宽度,以便它们根据内容自动伸缩,同时保持一定的最小或最大宽度。

 .grid-container {    display: grid;    grid-template-columns: repeat(auto-fit, minmax(200px, fit-content(100%)));    grid-gap: 20px;  }    .grid-item {    background-color: #f2f2f2;    padding: 20px;  }

在这个例子中,创建了一个名为 .grid-container 的网格容器,并使用 grid-template-columns 属性定义了网格列的宽度。通过使用 repeat(auto-fit, minmax(200px, fit-content(100%))),告诉浏览器根据可用空间自动适应网格项的数量,并确保每个网格项的最小宽度为 200px,最大宽度为其内容的宽度(但不超过父容器的宽度)。这样,当内容较长时,网格项会自动扩展宽度以适应内容;而当内容较短时,网格项会收缩至最小宽度。

minmax()

minmax()是 CSS Grid 布局中的一个函数,它用于定义一个长度范围,表示网格容器中的网格项可以使用的最小和最大尺寸。minmax() 函数接受两个参数:最小值和最大值。

grid-template-columnsgrid-template-rows 属性中,可以使用 minmax() 来为网格项设置列或行的最小和最大尺寸。这允许网格项在需要时扩展或收缩,但不会超过指定的最大或最小尺寸。

minmax() 函数的语法如下:

 minmax(min-length, max-length)

其中:

  • min-length 是网格项可以使用的最小尺寸。
  • max-length 是网格项可以使用的最大尺寸。

这两个参数都可以是任何有效的 CSS 长度单位,如 px、em、% 等。如果省略 max-length,则默认值为 auto,表示网格项可以扩展到占据所有可用空间。

 .grid-container {    display: grid;    grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));    grid-gap: 10px;  }    .grid-item {    background-color: #f2f2f2;    padding: 20px;  }

在这个例子中,.grid-container 是一个网格容器,使用 grid-template-columns 属性来定义网格的列。repeat(auto-fill, minmax(100px, 1fr)) 表示浏览器应该尝试填充尽可能多的列,每列的最小宽度为 100px,最大宽度为 1fr(即网格容器可用空间的一个等份)。如果容器宽度允许,所有列都将尝试扩展到相同的宽度(即 1fr),但如果容器宽度有限,列宽将不会小于 100px。

使用 minmax()函数可以创建更加灵活和响应式的网格布局,其中网格项可以根据可用空间自动调整大小,同时保持一定的尺寸限制。

repeat()

repeat() 是 CSS Grid 布局和 Flexbox 布局中的一个函数,用于重复一个或多个值指定的次数。在 Grid 布局中,它通常与 grid-template-columnsgrid-template-rows 属性一起使用,以定义重复的网格轨道。在 Flexbox 布局中,它可以与 flex 属性一起使用,以定义重复的 flex 项。

在 Grid 布局中,repeat() 函数的语法如下:

 repeat(count, value)
  • count 是一个正整数,表示要重复的值的次数。
  • value 是要重复的值,可以是一个长度、百分比、fr 单位等。

repeat() 函数会根据指定的次数重复给定的值,从而简化代码并创建更加灵活的网格布局。

 .grid-container {    display: grid;    grid-template-columns: repeat(3, 100px);    grid-gap: 10px;  }

在这个例子中,.grid-container 是一个网格容器,使用 grid-template-columns 属性定义了网格的列。repeat(3, 100px) 表示我们要创建三列,每列的宽度都是 100px。因此,总宽度将是 3 * 100px = 300px。

此外,repeat() 函数还可以与 auto-fillauto-fit 关键字一起使用,以根据可用空间自动调整列或行的数量。例如:

 .grid-container {    display: grid;    grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));    grid-gap: 10px;  }

在这个例子中,repeat(auto-fill, minmax(100px, 1fr)) 表示浏览器应该尝试填充尽可能多的列,每列的最小宽度为 100px,最大宽度为 1fr。auto-fill 关键字告诉浏览器根据容器宽度自动计算需要多少列。

通过使用 repeat() 函数,可以更加轻松地创建复杂且灵活的网格布局,而无需手动指定每个网格轨道的尺寸。

动画

cubic-bezier()

cubic-bezier() 用于定义自定义的缓动曲线,让动画或过渡效果可以具有非线性的速度变化。这个函数基于贝塞尔曲线来工作,允许通过指定四个点(两个端点和两个控制点)来定义动画的速度曲线。

cubic-bezier() 函数的语法如下:

 cubic-bezier(n,n,n,n)

这里的 n 是 0 到 1 之间的数值,它们分别代表两个控制点的 x 和 y 坐标。端点始终是 (0,0) 和 (1,1),所以不需要指定。

使用 cubic-bezier() 函数时,需要提供这四个数值作为参数,它们定义了贝塞尔曲线的形状。这些数值会影响动画的速度和加速度,从而创造出各种各样的动画效果。

下面是一些常用的预定义cubic-bezier() 值,以及它们所代表的效果:

  • cubic-bezier(0.25, 0.1, 0.25, 1.0):慢到快然后慢的缓动(与 ease-in-out 类似)。
  • cubic-bezier(0.42, 0, 1, 1):先慢后快的缓动(与 ease-out 类似)。
  • cubic-bezier(0, 0, 0.58, 1):先快后慢的缓动(与 ease-in 类似)。
  • cubic-bezier(0, 0, 0, 1):线性缓动(与 linear 类似)。

要在 CSS 中使用 cubic-bezier() 函数,可以将它应用于 transition-timing-functionanimation-timing-function 属性。例如:

 /* 使用自定义的 cubic-bezier 缓动函数 */  div {    transition: width 2s cubic-bezier(0.25, 0.1, 0.25, 1.0);  }    /* 或者在关键帧动画中使用 */  @keyframes example {    0% { background-color: red; }    100% { background-color: blue; }  }    div {    animation: example 3s cubic-bezier(0.42, 0, 1, 1);  }

在这个例子中,div 元素的宽度过渡和背景颜色动画都将使用自定义的 cubic-bezier() 缓动函数。可以通过调整四个数值来创建出适合动画需求的缓动曲线。

steps()

steps() 用于在动画或过渡中创建一种阶跃式(步进式)的变化效果,而不是平滑的过渡。当使用 steps() 函数时,属性会在指定的段数内突然改变,而不是在两个状态之间平滑地过渡。

steps() 函数的语法如下:

 steps(number, [start | end])
  • number 是一个正整数,表示动画或过渡应该被分割成多少个阶跃。
  • start 或 end 是一个可选参数,用于指定阶跃变化发生的时刻。如果省略或设置为 end,则每个阶跃会在每个间隔的结束时刻发生。如果设置为 start,则每个阶跃会在每个间隔的开始时刻发生。

例如,如果希望一个元素在 2 秒内从其原始位置跳到 100px 的位置,并且希望这个跳跃发生在 1 秒和 2 秒的时刻,可以使用 steps(2, end)。

 div {    width: 100px;    height: 100px;    background-color: red;    animation: jump 2s steps(2, end) infinite;  }    @keyframes jump {    0% { transform: translateX(0); }    100% { transform: translateX(100px); }  }

在这个例子中,div 元素会无限次地在 2 秒内从其原始位置跳跃到 100px 的位置。由于使用了 steps(2, end),跳跃会在动画的第 1 秒和第 2 秒结束时发生。

steps() 函数通常用于创建一种机械或数字化的动画效果,因为它允许属性在特定的时间点突然改变,而不是平滑地过渡。这种效果在模拟数字时钟、步进式进度条或某些类型的用户界面动画时特别有用。

1.Anime.js

地址:https://animejs.com/

7B4B78D3-F551-46C2-B144-F4EEE29ACD98 2.gif

Anime.js 在 GitHub 上有超过 4.3 万颗星,是最受欢迎的动画库之一。
它是一个轻量级 JavaScript 动画库,具有简单的 API,可用于为 CSS 属性、SVG、DOM 属性和 JavaScript 对象制作动画。使用 Anime.js,我们可以播放、暂停、重启或反转动画。该库还提供了惊人的功能,可通过跟进和重叠动作为多个元素制作动画。该库还包含各种与动画相关的事件,我们可以使用回调和承诺来监听这些事件。

2. Lottie

地址:https://airbnb.io/lottie/

7C8CA4F1-A999-4FB0-8B40-015EB7CF9AF7.gif

Lottie 是一个库,可以解析使用 Bodymovin 插件以 JSON 格式导出的 Adobe After Effects 动画,并在移动和网络应用程序上进行原生渲染。这样,用户就无需手动重新制作由专业设计师在 After Effects 中创建的高级动画。仅网络版在 GitHub 上就有超过 27k 个星。

3. Velocity

地址:http://velocityjs.org/

使用Velocity,你可以创建颜色动画、变换、循环、缓和、SVG动画等。它使用的 API 与 jQuery 库中的 $.animate() 方法相同,如果 jQuery 可用,它还可以与之集成。该库提供渐变、滚动和滑动效果。除了能控制动画的持续时间和延迟外,还能在动画完成后的某个时间反转动画,或在动画进行时完全停止。该库在 GitHub 上有 17k 多颗星,是 Anime.js 的理想替代品。

4. Rough Notation

地址:https://roughnotation.com/

E711C1D5-7AD4-4A66-97A5-CAF8F68DE4C5.gif

Rough Notation 是一个 JavaScript 库,用于在网页上创建彩色注释并制作动画。它使用 RoughJS 创建手绘的外观和感觉。您可以创建多种注释样式,包括下划线、方框、圆圈、高亮、删除线等,还可以控制每种注释样式的持续时间和颜色。

5. Popmotion

地址:https://popmotion.io/

CF3C90A0-7793-4BC4-9053-02718E8A445A.gif

Popmotion 是一个功能强大的库,用于创建引人注目的动画。它为何与众不同?- Popmotion 不假定您打算制作动画的对象属性,而是提供可在任何 JavaScript 环境中使用的简单、可组合的函数。
该库支持数字、颜色和复杂字符串的关键帧、弹簧和惯性动画。该库测试良好,维护积极,在 GitHub 上拥有 19k 多颗星。

6. Vivus

地址:https://maxwellito.github.io/vivus/

1B0F14F6-A2F3-456B-9BA0-8102F8B9F360.gif

Vivus 是一个 JavaScript 库,可让你为 SVGs 制作动画,使其看起来就像正在绘制一样。它速度快、重量轻,完全不依赖任何工具,并提供三种不同的 SVG 动画制作方法:它提供三种不同的 SVG 动画制作方法:延迟、同步和逐一。还可以使用自定义脚本,以自己喜欢的方式绘制 SVG。
Vivus 还允许您自定义持续时间、延迟、定时功能和其他动画设置。查看 Vivus Instant,了解现场实际操作示例。

7.绿袜动画平台(GSAP

地址:https://greensock.com/

EAC59BAC-69AE-4B0E-A4C3-AB6572ACFA61.gif

GreenSock Animation Platform (GSAP) 是一个库,可让我们创建适用于所有主流浏览器的精彩动画。可以在 React、Vue、WebGL 和 HTML 画布中使用它来制作颜色、字符串、运动路径等动画。它还附带了一个 ScrollTrigger 插件,让您只需少量代码就能创建令人印象深刻的基于滚动的动画。
GSAP已在1100多万个网站中使用,在GitHub上有超过15K个 "星",是一个通用而受欢迎的工具。您可以使用 GreenSock 的 GSDevTools 来轻松调试使用 GSAP 创建的动画。

8. Three.js

地址:https://threejs.org/

Three.js 是一个轻量级库,用于显示复杂的 3D 物体和动画。它利用 WebGL、SVG 和 CSS3D 渲染器来创建引人入胜的三维体验,可在各种浏览器和设备上运行。它是 JavaScript 社区的知名库,在 GitHub 上拥有超过 85k 个星级。

9. ScrollReveal

地址:https://scrollrevealjs.org/

F8520855-05AC-4788-93A2-D2117ED052D1.gif

通过 ScrollReveal 库,您可以轻松地为进入或离开浏览器视口的 DOM 元素制作动画。它提供各种类型的优雅特效,可在多个浏览器中滚动时显示或隐藏元素。ScrollReveal 库也非常易于使用,在 GitHub 上的依赖性为零,拥有超过 2100 个星级用户。

10. Barba.js

地址:https://barba.js.org/

957B1641-7F1C-4C9C-8938-2911C7F3BC9A.gif

让网站出类拔萃的一种创造性方法是,在用户浏览网页时,在网页之间添加生动的过渡效果。这比简单地显示新网页或重新加载浏览器能带来更好的用户体验。
这就是 Barba.js 为何如此有用的原因;该库可让网站像单页面应用程序(SPA)一样运行,从而创建令人愉悦的页面转换。它能减少页面之间的延迟,最大限度地减少浏览器的 HTTP 请求次数。它在 GitHub 上获得了将近 11k颗星。

11. Mo.js

地址:https://barba.js.org/

2DEDCE95-3BEE-4D56-B220-419759DCFB4F.gif

它提供了简单的声明式 API,可轻松创建流畅的动画和特效,在各种屏幕尺寸的设备上都能呈现出完美的效果。您可以移动 HTML 或 SVG DOM 元素,也可以创建一个特殊的 Mo.js 对象,该对象具有一系列独特的功能。它是一个可靠且经过充分测试的库,在 GitHub 上已编写了 1500 多个测试,拥有 1700 多颗星。

12. Typed.js

地址:https://mattboldt.com/demos/typed-js/

4CC9E03C-9503-40D3-8ED1-76423512FF46.gif

它的名字就说明了一切:一个动画打字库。
它能逐个字符键入特定字符串,就像有人在实时键入一样,允许你暂停键入速度,甚至暂停键入特定时间。通过智能退格,它可以键入以与当前字符相同的字符集开始的连续字符串,而不会退格整个前一个字符串--就像我们在上面的演示中看到的那样。
此外,它还支持批量键入,即同时在屏幕上键入一组字符,而不是一个接一个地键入。Typed.js在GitHub上有超过12K颗星,深受Slack和Envato的信任。

转载至网易新闻客户端 @电竞圈每日关注

for 循环


for是最基础的循环,基本上每种编程语言都能见到他的身影,最为常见的使用方法为:

let a=[1,2,3];
for ( let i=0;i<a.length;i++ ) {
   console.log(a[i]);
}
//输出 0 1 2

不少小伙伴可能会看到有的人建议将数组的长度用一个变量缓存起来,以便提高循环效率,例如上述例子改为:

let a=[1,2,3];
let length=a.length;
for ( let i=0;i<length;i++ ) {
   console.log(a[i]);
}
//输出 0 1 2

但这样做其实并不会给你循环带来性能提升(无论循环次数多少),所以除非有其他需求,否则没必要把数组长度单独缓存起来.

对于遍历对象(关联数组),可以如下操作:

let obj={"a":1,"b":2};
let keys=Object.keys(obj)//获取对象的key组成的数组
for ( let i=0;i<keys.length;i++ ) {
  console.log(keys[i],obj[keys[i]]);
}
//输出:
// a 1
// b 2

这里let keys=Object.keys(obj) 与上述的把数组长度缓存起来有所不同,如果放到for循环中的话,Object.keys每次循环都会去计算、生成索引数组,对循环效率产生极大影响.

除使用Object.keys()外,若还有以下方法可选:

  • Object.values(),与Object.keys()类似,但返回的不是索引,而是值
  • Object.getOwnPropertyNames()返回对象自身属性名(包括不可枚举的属性)组成的数组.
  • Object.getOwnPropertySymbols()返回对象自身的Symbol属性组成的数组,不含普通属性
  • Reflect.ownKeys() 返回对象自身所有属性名组成的数组,包括不可枚举的属性和Symbol属性
  • Object.entries() 返回对象自身所有属性键值组成的数组,不含原型.

     let obj={a:1,b:2,c:3}
     console.log(Object.entries(obj))
     输出:
     [ [ 'a', 1 ], [ 'b', 2 ], [ 'c', 3 ] ]
    
方法基本属性原型链不可枚举Symbol
Object.keys()
Object.values()
Object.getOwnPropertyNames()
Object.getOwnPropertySymbols()
Object.entries()是(k&v)
Reflect.ownKeys()

以上方法都是返回一个数组,然后配合for循环或者其他循环语句进行遍历.

for的优点是非常灵活,可以实现一些特殊循环,其基本结构为for(a;b;c){},其中a、c可以为表达式、语句、函数、值、对象等等都行, 第二个位置需要是一个表达式或者值,如果等于false则停止循环(null、undefined都不等于false哦).其实a、b、c甚至都可以省略(但分号不能省),以下写法在js中是合法的,但因为第二个位置永不等于false,所以会形成一个死循环.

  for(;;;){}

这里主要想阐述for循环非常灵活,但有似乎点跑题了.

let i=0
let flag=true
let f=()=>{
  if(i>10){
    flag=false
  }
  return i++
}
for ([1,2,3];flag;3) {//其中[1,2,3] 和 3 无意义
  console.log(f());
}

另外也可使用while循环进行遍历,但一般不常用于数组或对象上,所以这里就不展开介绍了

for in


for in 是es5加入的,可以用于遍历数组、对象, 需要注意的是,for in会遍历数组所有的可枚举属性,包括原型属性,不包括Symbol.

Object.prototype.title = 'for in';
 let obj={a:1,b:2,c:3}
console.log(obj); //输出 { a: 1, b: 2, c: 3 }
for(let index in obj){
  console.log(index);
}

输出:
a
b
c
title

为避免输出原型属性,可配合hasOwnProperty()方法来进行判断

Object.prototype.title = 'for in';
let obj={a:1,b:2,c:3}
console.log(obj); //输出 { a: 1, b: 2, c: 3 }
for(let index in obj){
  if (obj.hasOwnProperty(index)) {
    console.log(index);
  }
}

输出:
a
b
c

for of 虽然也可以遍历数组,但是一般不推荐,除上面说到的会遍历出原型属性外,还存在两个问题:

  • 遍历数组获取到的key为sting类型,而非number,不注意的话,在使用时可能导致出错.
  • 遍历数组时,存在不按索引顺序遍历的风险

for of


for of 是es6标准,与 for in 相比:
1.遍历出来的是值而非索引.但可以通过遍历arr.keys()的方式获取索引.
2.不会遍历原型属性
3.不支持遍历普通对象,但支持map、set、arguments甚至字符串等存在iterator接口的对象

Array.prototype.title = 'for of';
let arr=[1,2,3] //输出 [1,2,3]
for(let val of arr){
    console.log(val);
}
输出:
1
2
3

Array.forEach


和for of相比,他有一个特点就是可同时遍历出索引和值.
基本用法:

var arr=[1,2,3]
 arr.forEach((val,key)=>{
    console.log(val,key);
    val+=this; //不会改变原数组内容
    //这里的this是forEach的第二个参数1,该参数是可选的,当不填时,默认指向window
},1)
输出:
1 0
2 1
3 2

Array.map


Array.map可以返回遍历的内容,形成新的数组,而Array.forEach没返回值,示例如下:

let arr=[1,2,3]
let newArr=arr.map(function(val,key,_arr){
    //其中参数_arr为arr本身
    return val * this;
},3);
console.log('newArr:',newArr)
console.log('arr:',arr)
输出:
newArr: [ 3, 6, 9 ]
arr: [ 1, 2, 3 ]


Array.filter


Array.filter顾名思义,对数组进行过滤,返回满足条件的元素组成的数组

//取数组中的奇数
let arr = [1,2,3,4,5,6,7,8,9];
let odds = arr.filter(item => item % 2)
console.log(odds);
输出:
[ 1, 3, 5, 7, 9 ]

和foreach、map、filter的相似点:

  • 都不能中途停止遍历.除非程序报错。
  • 不能循环时通过增加数组元素来改变循环次数
  • 但可以减少数组元素来改变循环次数,如使用pop()、shift()
  • 修改回调传入的值不会改变原数组

Array.reduce


Array.reduce是一个累加器,用于累加整个数组的值,当然,你也可以用于拼接数组中的所有字符串,这取决于你回调函数中的处理逻辑.其中第二个参数为初始值,可省略.

let arr = [1,2,3];
let total = arr.reduce((total,item)=> {
   return total + item;
});
console.log(total);
输出:
6

总结:

  • for效率非常高,而且灵活,但代码可能没其他方法简洁
  • 要遍历对象,除for in 外,一般都是先获取对象的属性成为数组,然后再实现遍历
  • for in 不建议用于数组,除非你清楚他的特性

背景:MAC 12 之后,就把内置的 PHP去掉了,需要自己安装。
准备:先创建自己的证书,用来给PHP的 libphp.so 文件签名。

步骤一、创建证书
1、打开启动台 —> 其他 —> 钥匙串访问

2、在弹框中输入证书名称,比如:PHPCA,证书类型选择代码签名,勾选“让我覆盖这些默认”,点击继续。

3、填写证书信息,有效天数可以自己定义,点击继续

接着往下输入

密钥对信息:密钥大小 2048位,算法 RSA

密钥使用扩展:签名

以扩展的密钥使用扩展:代码签名

后边就一直是默认不用修改,最后直接“创建”,看到下边的图就是成功了。

步骤二、使用Homebrew安装PHP
brew install php
1
安装完成之后,在命令行输入php -v 查看php的版本,我安装的是8.1.8 版本。

步骤三、对libphp.so 文件签名
在命令行输入,其中php@8.1修改为自己安装的版本,可以在/opt/homebrew/opt/目录下查看,主要是对libphp.so 文件签名, PHPCA为自己步骤一生成的签名文件名字。

codesign --sign "PHPCA" --force --keychain ~/Library/Keychains/login.keychain-db /opt/homebrew/opt/php@8.1/lib/httpd/modules/libphp.so
1
回车后会出现弹框,输入自己的开机密码就行,如下图所示

完成之后,在命令行会显示:/opt/homebrew/opt/php@8.1/lib/httpd/modules/libphp.so: replacing existing signature, 看到这个就说明成功了。

步骤四、修改Apache的配置文件
sudo vi /etc/apache2/httpd.conf
1
在配置文件中添加下边一行,PHPCA 为第一步生成的证书名字。

LoadModule php_module /opt/homebrew/opt/php/lib/httpd/modules/libphp.so "PHPCA"
1
找到 DirectoryIndex
修改为

DirectoryIndex index.php index.html
1
然后重启 apachectl 就可以了

sudo apachectl start
1
默认PHP的项目文件在/Library/WebServer/Documents目录下,所以将自己开发的文件放在这个目录下,然后在浏览器打开http://localhost/testPage/就可以看到了, 也可以自己更改项目路径。

目录结构

-— Library

     -— WebServer
          -— Documents
               -— testPage
                    -— index.php

1
2
3
4
5
index.php 内容:

<?php
print "

PHP 很有趣!

";
print "Hello world!
";
print "我要学习 PHP!";
?>
————————————————
版权声明:本文为CSDN博主「lancnn」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41767649/article/details/127557253

类型系统

众所周知 JS 是一门 弱类型语言,不到执行时都不能确定变量的类型。编码时可以随心所欲反正不报错,一不小心就写出八哥( undefined 警告!)。

1. 静态类型检查

静态类型检查让 TS 在编辑器中披上 强类型语言 的“马甲”,使得开发者在 编码时 就可以 避免大多数类型错误的情况发生,而开发者要做的就 只是声明变量时多写一个符号和一个单词。

当然你也可以在声明变量时 不指定类型 或者使用 any 类型 来达到 JS 的动态类型效果,让 TypeScript 变成 AnyScript ,任性~

let name: string = '陈皮皮';
name = 9527; // 报错

let age: any = 18;
age = 'eighteen'; // 不报错

真正做到 早发现,早解决,早下班

2. 原始类型

TS 在支持 与 JS 基本相同的原始类型 之外,还额外提供了 枚举(Enum)和元组(Tuple) 的支持。

// 枚举
enum Direction {
    Up = 1,
    Down,
    Left,
    Right
}
let direction: Direction = Direction.Up;

// 元组
let x: [string, number];
x = ['hello', 10]; // 不报错
x = [10, 'hello']; // 报错

3. 智能提示

类型系统 配合 声明文件(关于声明文件我们后面再聊)给我们带来了编辑器中 完善的自动补全智能提示,大大增加了开发效率,也再不会因为拼错变量名或函数名而导致运行时的错误。

我知道 JS 加插件也能实现一定程度的智能提示但是语言自带它不香吗 : )

修饰符和静态关键字

泪目,是从 C# 那里几乎原汁原味搬过来的一套修饰符和关键字,主要如以下几个:

1. 访问修饰符(public、private 和 protected)

用来 限定类成员的可访问范围。

没有 internal 和 protect internal

没有访问修饰符的封装莫得灵魂!

class Me {
    public name = '陈皮皮'; // 大家都知道我叫陈皮皮
    private secret = '*******'; // 我的秘密只有我知道
    protected password = '********'; // 我的支付宝密码会告诉我的后人的
}

let me = new Me();
let a = me.name; // 拿到了我的名字
let b = me.secret; // 报错,私有的属性
let c = me.password; // 报错,受保护的属性

class Child extends Me {
    constructor() {
        super();
        this.name = '陈XX';
        this.secret // 报错,无法访问
        this.password = '888888'; // 可以访问
    }
}

2. 静态关键字(static)

用于 定义全局唯一的静态变量和静态函数。

在 Creator 的 JS 脚本中是使用 cc.Class 的 statics 属性来定义静态成员的,使用体验一言难尽…

另外在 ES6 中 JS 已经支持静态函数,在 ES7 中也加入了对静态属性的支持。

class Whatever {
    public static origin: string = 'Whatever';
    public static printOrigin() {
        console.log(this.origin);
        console.log(Whatever.origin);
    };
}

console.log(Whatever.origin); // Whatever
Whatever.printOrigin(); // Whatever

3. 抽象关键字(abstract)

用来定义 抽象类或抽象函数,面向对象编程很重要的一环。

没对象的可以面向工资编程…

abstract class Animal {
    abstract eat(): void; // 不同动物进食的方式不一样
}

let animal = new Animal(); // 报错,法实例化抽象类无

class Dog implements Animal {
    eat() {
        console.log('我吃,汪!');
    }
}

let dog = new Dog();
dog.eat(); // 我吃,汪!

class Cat implements Animal {
    // 报错了,没有实现进食的功能
}

4. 只读关键字(readonly)

用来定义只读的字段,使得字段 只能在创建的时候赋值一次。

class Human {
    name: string;
    readonly id: number;
    constructor(name: string, id: number) {
        this.name = name;
        this.id = id;
    }
}

let human = new Human('陈皮皮', 666666);
human.name = '陈不皮'; // 名字可以改
human.id = 999999; // 报错,身份证号码一旦确定不能更改

接口(Interface)

C# 和 Java 的朋友们让我看到你们的双手好吗
接口用于一系列成员的声明,但不包含实现,接口支持合并(重复声明),也可以继承于另一接口。

下面展示几个常见的用法:

1. 扩展原始类型

// 扩展 String 类型
interface String {

    /**
     * 翻译
     */
    translate(): string;

}

// 实现翻译函数
String.prototype.translate = function () {
    return this; // 不具体写了,直接返回原字符串吧
};

// 使用
let nickname = '陈皮皮'.translate();

2. 定义类型

interface Human {
    name: string; // 普通属性,必须有但是可以改
    readonly id: number; // 只读属性,一旦确定就不能更改
    hair?: number; // 可选属性,挺秃然的
}

let ChenPiPi: Human = {
    name: '陈皮皮',
    id: 123456789,
    hair: 9999999999999
}

3. 类实现接口

interface Vehicle {
    wheel: number;
    engine?: string;
    run(): void;
}

class Car implements Vehicle {
    wheel: 4;
    engine: '帝皇引擎';
    run() {
        console.log('小汽车跑得快!')
    }
}

class Bike implements Vehicle {
    wheel: 2;
    run() {
        console.log('小黄车冲冲冲!')
    }
}

类型别名(Type)

这是一个比较常用的特性,作用如其名。
类型别名 用来 给类型起一个新的名字。

类型别名和接口很相似,类型别名可以作用于原始类型,联合类型,元组以及其它任何你需要手写的类型,接口支持合并而类型别名不可以。

类型别名同样也 支持扩展,并且可以和接口互相扩展。

// 给原始类型起个小名
type UserName = string;
let userName: UserName = '陈皮';

// 还可以是函数
type GetString = () => string;
let getString: GetString = () => {
    return 'i am string';
}
let result = getString();

// 创建一个新的类型
type Name = {
    realname: string;
    nickname: string;
}
let name: Name = {
    realname: '吴彦祖',
    nickname: '陈皮皮'
}
// 再来一个新的类型
type Age = {
    age: number;
}
// 用上面两个类型扩展出新的类型
type User = Name & Age;
let user: User = {
    realname: '吴彦祖',
    nickname: '陈皮皮',
    age: 18,
}

联合类型(Union Types)

使用 联合类型 允许你在 声明变量或接收参数时兼容多种类型。

个人最喜欢的特性之一,点赞!
1. 表示一个值可以是几种类型之一

let bye: string | number;
bye = 886; // 不报错
bye = 'bye'; // 不报错
bye = false; // 报错**

2. 让函数接受不同类型的参数,并在函数内部做不同处理

function padLeft(value: string, padding: string | number) {
    if (typeof padding === 'string') {
        return padding + value;
    } else {
        return Array(padding + 1).join('') + value;
    }
}
padLeft('Hello world', 4); // 返回 '    Hello world'
padLeft('Hello', 'I said: '); // 返回 'I said: Hello'

泛型(Generics)

C# 和 Java 的朋友们再次让我看到你们的双手好吗
使用 泛型 可以让一个 类/函数支持多种类型的数据,使用时可以传入需要的类型。

又是一个非常实用的特性,利用泛型可以 大大增加代码的可重用性,减少重复的工作,点赞!

以下是两个常用的用法:

1. 泛型函数

// 这是一个清洗物品的函数
function wash<T>(item: T): T {
    // 假装有清洗的逻辑...
    return item;
}

class Dish { } // 这是盘子
let dish = new Dish(); // 来个盘子
// 盘子洗完还是盘子
// 用尖括号提前告诉它这是盘子
dish = wash<Dish>(dish);

class Car { } // 这是汽车
let car = new Car(); // 买辆汽车
// 汽车洗完还是汽车
// 没告诉它这是汽车但是它认出来了
car = wash(car);
2. 泛型类

// 盒子
class Box<T>{
    item: T = null;
    put(value: T) {
        this.item = value;
    }
    get() {
        return this.item;
    }
}

let stringBox = new Box<String>(); // 买一个用来装 String 的盒子
stringBox.put('你好!'); // 存一个 '你好!'
// stringBox.put(666); // 报错,只能存 String 类型的东西
let string = stringBox.get(); // 拿出来的是 String 类型

装饰器(Decorator)

这是一个相对比较高级的特性,以 @expression 的形式对类、函数、访问符、属性或参数进行额外的声明。

利用装饰器可以做很多骚操作,感兴趣的话可以深入研究下。
对类做预处理

export function color(color: string) {
    return function (target: Function) {
        target.prototype.color = color;
    }
}

@color('white')
class Cloth {
    color: string;
}
let cloth = new Cloth();
console.log(cloth.color); // white

@color('red')
class Car {
    color: string;
}
let car = new Car();
console.log(car.color); // red
Creator 中的 TS 组件中的 ccclass 和 property 就是两个装饰器

const { ccclass, property } = cc._decorator;

@ccclass
export default class CPP extends cc.Component {

    @property(cc.Node)
    private abc: cc.Node = null;

}

命名空间(namespace)

命名空间用来定义标识符的可用范围,主要用于解决重名的问题,对于项目模块化有很大的帮助。

Cocos Creator 中的 cc 就是一个内置的命名空间
1. 对相同名字的类和函数进行区分

// pp 命名空间
namespace pp {
    export class Action {
        public static speak() {
            cc.log('我是皮皮!');
        }
    }
}

// dd 命名空间
namespace dd {
    export class Action {
        public static speak() {
            cc.log('我是弟弟!');
        }
    }
}

// 使用
pp.Action.speak(); // 我是皮皮!
dd.Action.speak(); // 我是弟弟!

2. 对接口进行分类

namespace Lobby {
    export interface Request {
        event: string,
        other: object
        // ...
    }
}

namespace Game {
    export interface Request {
        event: string,
        status: string
        // ...
    }
}

// 用于 Lobby 的请求函数
function requestLobby(request: Lobby.Request) {
    // ...
}

// 用于 Game 的请求函数
function requestGame(request: Game.Request) {
    // ...
}


转自:https://forum.cocos.org/t/typescript/93014
@陈皮皮