当前位置: 首页 > news >正文

【CSS in Depth 2 精译_096】16.4:CSS 中的三维变换 + 16.5:本章小结

当前内容所在位置(可进入专栏查看其他译好的章节内容)

  • 第五部分 添加动效 ✔️
  • 【第 16 章 变换】 ✔️
    • 16.1 旋转、平移、缩放与倾斜
      • 16.1.1 变换原点的更改
      • 16.1.2 多重变换的设置
      • 16.1.3 单个变换属性的设置
    • 16.2 变换在动效中的应用
      • 16.2.1 放大图标(上)
      • 16.2.2 带“飞入”特效的文本标签的创建(下)
      • 16.2.3 过渡特效的交错渲染(下)
    • 16.3 动画的性能
    • 16.4 三维变换 ✔️
      • 16.4.1 控制透视距离 ✔️
      • 16.4.2 高级三维变换效果的实现 ✔️
    • 16.5 本章小结 ✔️

文章目录

  • 16.4 三维变换 3D transforms
    • 16.4.1 控制透视距离 Controlling perspective
    • 16.4.2 高级三维变换效果的实现 Implementing advanced 3D transforms
      • 16.4.2.1 perspective-origin 属性(Perspective-origin property)
      • 16.4.2.2 backface-visibility 属性(backface-visibility property)
      • 16.4.2.3 transform-style (preserve-3D) 属性(transform-style (preserve-3D) property)
  • 16.5 本章小结 Summary

《CSS in Depth》新版封面

《CSS in Depth》新版封面

译者按
上一篇我们学习了 CSS 的底层渲染原理,这一篇就来实际应用一下相关知识点。虽然 CSS 的 3D 变换在实际工作中用得并不多,但了解里面最基本的概念和典型案例,对于构建完整的 CSS 知识体系而言也是至关重要的。除了作者提到的延伸材料外,相关属性的实际应用案例还可以参考《Tiny CSS Projects》这本书的相关章节,可以更好地理解本节的核心概念。

16.4 三维变换 3D transforms

到目前为止我们使用的变换都是二维的。这些变换是最容易处理的(也最常见),因为页面本身就是二维的。但我们不应该止步于此,旋转和平移都可以在三个维度上实现:x 轴、y 轴和 z 轴。

我们可以像之前那样使用 translate() 函数,在水平和垂直方向上平移(即 xy 维度);也可以通过 translateX()translateY() 函数来实现同样的效果。下面三个声明会产生同样的效果:

transform: translate(15px, 50px);
transform: translateX(15px) translateY(50px);
translate: 15px 50px;

我们还可以使用 translateZ() 函数、或者给 translate 属性提供第三个参数值来实现 z 轴上的平移变换。从概念上看,这个 z 值相当于通过平移的方式让该元素更靠近或远离用户。

同理,也可以让元素绕着三个不同的坐标轴进行旋转。但与平移不同的是,我们已经非常熟悉 rotateZ() 函数了,因为 rotateZ() 也是 rotate() 的别名,它就是绕着 z 轴旋转的。函数 rotateX()rotateY() 分别围绕水平方向上的 x 轴(使元素向前或向后倾斜(pitching))和垂直方向上的 y 轴(使元素向左或者向右转动或 偏移(yawing)旋转。有关这些函数的具体示例,如图 16.13 所示。

图 16.13 透视距离为 300px 下的三个坐标轴上的旋转效果图(虚线表示元素的初始位置)

【图 16.13 透视距离为 300px 下的三个坐标轴上的旋转效果图(虚线表示元素的初始位置)】

在使用 rotate 属性进行变换时,还可以指定坐标轴的名称 xy 或者 z,并带上角度值,例如 rotate: z 20deg 或者 rotate: x 30deg

16.4.1 控制透视距离 Controlling perspective

在给页面添加三维变换特效前,我们需要先明确一个概念,即 透视距离(perspective。变换后的元素共同构成了一个 3D 场景。随后浏览器会计算该 3D 场景的 2D 图像并渲染到屏幕上。我们可以把透视距离想象成 “摄像机” 与场景之间的距离,前后移动镜头就可以改变整个场景在最终图像中的展示方式。

如果镜头离得较近(即透视距离小),那么 3D 效果会比较强;如果镜头离得较远(即透视距离大),则 3D 效果就比较弱。图 16.14 列出了几种不同的透视距离效果。

图 16.14 同一旋转变换在不同透视距离下的页面效果

【图 16.14 同一旋转变换在不同透视距离下的页面效果】

左侧这个旋转后的元素没有设置透视距离,看起来不太像是 3D 的。它只是在水平方向上做了些压缩,并没有什么立体感。不设置透视距离的三维变换看上去像是平的(flat);元素中 “更远” 的那部分并没有渲染得小一些。另一方面,中间那个盒子设置了 400px 的透视距离,其右边缘(即距离观察者较远的那一边),看起来小了些;而离观察者较近的这一侧看上去则变大了些。右边的盒子透视距离更短,只有 100px。这样就大大增强了 3D 效果,使得元素边缘离得越远,图像缩小得也就越明显。

我们可以通过两种方式来指定透视距离:使用 perspective() 变换,或者使用 perspective 属性(property)。两种方式略有不同。下面通过一个简单的示例来说明。这是个简化版示例,仅用于演示透视距离的页面效果。

首先,我们为四个元素添加旋转特效,使用 rotateX() 将它们向后倾斜(如图 16.5 所示)。因为每个元素旋转同样的角度,并且设置了相同的 perspective() 变换,所以它们看上去是一样的。

图 16.15 四个元素都围绕 x 轴旋转、并且均设置了 perspective(200px) 后的效果图

【图 16.15 四个元素都围绕 x 轴旋转、并且均设置了 perspective(200px) 后的效果图】

为这个演示案例新建一个页面,并复制以下代码清单 16.12 中的 HTML。

代码清单 16.12 用于演示三维变换及透视效果的四个盒子 HTML 标记

<div class="row"><div class="box">One</div><div class="box">Two</div><div class="box">Three</div><div class="box">Four</div>
</div>

接着,我们给每个盒子添加 3D 变换和透视距离。同时也可以来点颜色和内边距样式,略微扩充些尺寸大小,让最终效果更加明显。请根据代码清单 16.13 同步更新本地样式表。

代码清单 16.13 给盒子添加三维变换特效的示例样式代码

.row {display: flex;gap: 4em;justify-content: center;
}.box {box-sizing: border-box;width: 150px;padding: 60px 0;text-align: center;background-color: oklch(60% 0.12 158deg);transform: perspective(200px) rotateX(30deg); /* 令盒子向后旋转 30 度角,并指定透视距离 */
}

在本例中,每个盒子看上去都相同。它们都有自己的透视距离,并利用 perspective() 函数进行定义。这个方法可以为单个元素设置透视距离,示例中我们直接为所有盒子做了相同的设置,这样就像给每个元素分别单独拍照,但是拍摄位置是相同的。

警告

perspective() 变换必须在期望其影响的其他变换 之后 生效。也就是说,perspective() 在与单独的变换属性(如 rotate)结合使用时效果并不理想,因为这些属性是在 transform 属性之后生效的。当使用 perspective() 变换时,应该将它列为第一项,然后在同一个 transform 声明中列出其他变换函数。

有时候我们希望多个元素能共享同一套透视距离,仿佛它们都处于相同的三维空间中。图 16.16 展示了这种情况的一个效果图。图中有四个相同的元素,并且它们都向着远方的一个相同的交汇点延伸,就仿佛把四个元素放一起然后拍了一张整体的照片。要实现这种效果,需要为它们的父元素设置 perspective 属性。

图 16.16 为公共祖先元素设置 perspective 属性可以让多个元素共享相同的透视距离

【图 16.16 为公共祖先元素设置 perspective 属性可以让多个元素共享相同的透视距离】

要查看这样的效果,可以移除各元素盒上的 perspective() 函数,并在其父容器上设置 perspective 属性。具体样式如代码清单 16.14 所示。

代码清单 16.14 建立统一透视距离的示例样式代码

.row {display: flex;gap: 4em;justify-content: center;perspective: 200px; /* 在容器上添加透视距离 */
}
.box {box-sizing: border-box;width: 150px;padding: 60px 0;text-align: center;background-color: oklch(60% 0.12 158deg);transform: rotateX(30deg); /* 不在盒子本身设置透视距离 */
}

通过为父容器(或其他祖先元素)设置统一的透视距离,父容器包含的所有应用了三维变换的子元素,都将共享这一相同的透视距离。

添加透视距离是三维变换中非常重要的知识点。如果不设置透视距离,既不能让离得较远的元素显小,也不会让离得较近的元素渲染得更大。上面的例子都比较简单,下一章我们还会把这些技术应用到一个实际案例中,实现元素从远处 “飞入” 的效果。

16.4.2 高级三维变换效果的实现 Implementing advanced 3D transforms

在对元素进行三维变换时,还有其他一些很有用的属性(properties)。我不打算花太多精力讲解这些属性,因为在实际开发中应用场景寥寥无几(few and far between)。但了解它们的存在也是有必要的,万一今后用得上也不错。想要更深入地研究这些属性,稍后我也会提供几个线上的示例。

16.4.2.1 perspective-origin 属性(Perspective-origin property)

默认情况下,透视距离的渲染是假设观察者(或相机镜头)位于元素中心的正前方。perspective-origin 属性可以上下、左右移动镜头位置。图 16.17 展示了刚才的示例,只是镜头移到了左下角位置。

图 16.17 移动透视原点后,元素向远端延伸的形变增加了

【图 16.17 移动透视原点后,元素向远端延伸的形变增加了】

请根据代码清单 16.15 同步更新本地样式表,查看上述演示效果。

代码清单 16.15 利用 perspective-origin 移动镜头位置的示例样式代码

.row {display: flex;justify-content: center;perspective: 200px;perspective-origin: left bottom; /* 将镜头位置调至元素左下角 */
}

还是跟之前一样的透视距离,但是视角改变了,所有的盒子都移到了镜头的右侧。我们既可以使用关键字 topleftbottomrightcenter 来设置方位,也可以使用百分比或长度值来精确控制,并从元素的左上角开始计算偏移量(例如 perspective-origin: 25% 25%)。

本例演示的效果较为夸张,原因在于透视距离相对较近,仅有 200px。您也可以将该距离调大些,让页面的立体感没那么强烈。

16.4.2.2 backface-visibility 属性(backface-visibility property)

如果使用 rotateX() 或者 rotateY() 旋转元素超过 90 度,就会发现一些有趣的现象:元素的 “正面” 不再直接朝向您;相反,它是背对您的。您会看到元素的背面。如图 16.18 所示,图中元素设置了 rotateY(180deg) 的变换特效,看上去就像是之前元素的镜像图片。

图 16.18 通过元素旋转来查看其背面效果

【图 16.18 通过元素旋转来查看其背面效果】

这就是元素背面的效果图。默认情况下背面是可见的,但我们可以为该元素设置 backface-visibility: hidden 来进行修改。添加这句声明后,元素只有在正面朝向观察者的时候才是可见的,而朝向反面时将被隐藏起来。

这项技术的一个可能的应用场景,是把两个元素背靠背放在一起,就像卡片的正反两面。卡片的正面展示出来,背面则隐藏。然后我们可以旋转它们的容器元素,让这两个元素同时翻转过来,使得正面隐藏、背面则会显现。卡片翻转特效的演示案例,可以参考这篇文章:《Intro to CSS 3D Transforms: Card Flip》。

16.4.2.3 transform-style (preserve-3D) 属性(transform-style (preserve-3D) property)

如果要使用嵌套元素来构建复杂的 3D 场景,transform-style 属性就变得非常重要。假设我们已经对容器设置了透视距离,接下来对容器内的元素进行三维变换。容器元素在渲染时,实际上会被绘制成二维场景,如同三维对象的一张照片。这看起来没什么问题,因为元素终将渲染到二维屏幕上。

但如果这时对容器元素进行三维旋转,就会出问题:这样做没能对整个场景进行旋转,只是旋转了三维场景下的二维图像。透视距离全都错了,场景中的立体感也被破坏了。相关的页面效果如图 16.19 所示。

图 16.19 如果对 3D 变换元素的父元素再进行 3D 变换,可能需要启用 preserve-3d 属性(右侧)

【图 16.19 如果对 3D 变换元素的父元素再进行 3D 变换,可能需要启用 preserve-3d 属性(右侧)】

左图展示了通过把六个面变换到相应位置创建的一个 3D 立方体效果;中间的图片展示的是对整个立方体(即它们的父元素)使用变换后的效果。为了修正这个问题,应该在父元素上声明 transform-style: preserve-3d

想要了解更多讲解内容和实用案例,可以查看 Ana Tudor 的线上教程,详见:https://davidwalsh.name/3d-transforms。虽然这些示例很有意思,但我从未在实际项目中用过 preserve-3d。如果您决定上手试试三维变换,想看看可以实现哪些效果,这份教程会很有帮助。


16.5 本章小结 Summary

  • CSS 变换可以在二维和三维中缩放、旋转、平移和倾斜元素。
  • 可以使用 transform 属性设置多个变换特效。这些变换是从右到左生效的。
  • 利用单独的 scalerotatetranslate 属性可以实现更简单的变换效果。
  • CSS 的 transformopacity 属性是在过渡和动画特效中性能最好的两个属性。它们无需浏览器重新计算布局或重绘页面内容。
  • 在其他变换之后生效的 perspective() 变换会让这些变换效果看起来具有三维立体感。您还可以将 transform 属性设置到容器元素上,让子元素共享同一个三维场景。
  • 自定义的定时函数曲线可以实现过渡特效中的 “弹跳” 效果。


关于《CSS in Depth》(中译本书名《深入解析 CSS》)

第 1 版第 2 版
读者评分原版:4.7(亚马逊);中文版:9.3(豆瓣)原版:5.0(亚马逊);中文版:暂无,待出版
出版时间原版:2018 年 3 月;中文版:2020 年 4 月原版:2024 年 7 月;中文版:暂无,待出版
原价原版:$44.99;中文版:¥139.00原版:$59.99;中文版:暂无,待出版
现价原版:$36.49;中文版:¥52.54 起步原版:$52.09;中文版:暂无,待出版
原版国内预订起步价 ¥461.00起步价 ¥750.00

本专栏为该书第 2 版高分译文专栏,全网首发,精译精校,持续更新,计划今年内完成全书翻译,敬请期待!!!

目前已完结的章节(可进入本专栏查看详情,连载期间完全免费):

  • 第一章 层叠、优先级与继承(已完结)
    • 1.1 层叠
    • 1.2 继承
    • 1.3 特殊值
    • 1.4 简写属性
    • 1.5 CSS 渐进式增强技术
    • 1.6 本章小结
  • 第二章 相对单位(已完结)
    • 2.1 相对单位的威力
    • 2.2 em 与 rem
    • 2.3 告别像素思维
    • 2.4 视口的相对单位
    • 2.5 无单位的数值与行高
    • 2.6 自定义属性
    • 2.7 本章小结
  • 第三章 文档流与盒模型(已完结)
    • 3.1 常规文档流
    • 3.2 盒模型
    • 3.3 元素的高度
    • 3.4 负的外边距
    • 3.5 外边距折叠
    • 3.6 容器内的元素间距问题
    • 3.7 本章小结
  • 第四章 Flexbox 布局(已完结)
    • 4.1 Flexbox 布局原理
    • 4.2 弹性子元素的大小
    • 4.3 弹性布局的方向
    • 4.4 对齐、间距等细节处
    • 4.5 本章小结
  • 第五章 网格布局(已完结)
    • 5.1 构建基础网格
    • 5.2 网格结构剖析 (上)
      • 5.2.1 网格线的编号(下)
      • 5.2.2 网格与 Flexbox 配合(下)
    • 5.3 两种替代语法
      • 5.3.1 命名网格线
      • 5.3.2 命名网格区域
    • 5.4 显式网格与隐式网格(上)
      • 5.4.1 添加变化 (中)
      • 5.4.2 让网格元素填满网格轨道(下)
    • 5.5 子网格(全新增补内容)
    • 5.6 对齐相关的属性
    • 5.7 本章小结
  • 第六章 定位与堆叠上下文(已完结)
    • 6.1 固定定位
      • 6.1.1 创建一个固定定位的模态对话框
      • 6.1.2 在模态对话框打开时防止屏幕滚动
      • 6.1.3 控制定位元素的大小
    • 6.2 绝对定位
      • 6.2.1 关闭按钮的绝对定位
      • 6.2.2 伪元素的定位问题
    • 6.3 相对定位
      • 6.3.1 创建下拉菜单(上)
      • 6.3.2 创建 CSS 三角形(下)
    • 6.4 堆叠上下文与 z-index
      • 6.4.1 理解渲染过程与堆叠顺序(上)
      • 6.4.2 用 z-index 控制堆叠顺序(上)
      • 6.4.3 深入理解堆叠上下文(下)
    • 6.5 粘性定位
    • 6.6 本章小结
  • 第七章 响应式设计(已完结)
    • 7.1 移动端优先设计原则(上篇)
      • 7.1.1 创建移动端菜单(下篇)
      • 7.1.2 给视口添加 meta 标签(下篇)
    • 7.2 媒体查询(上篇)
      • 7.2.1 深入理解媒体查询的类型(上篇)
      • 7.2.2 页面断点的添加(中篇)
      • 7.2.3 响应式列的添加(下篇)
    • 7.3 流式布局
    • 7.4 响应式图片
    • 7.5 本章小结
  • 第八章 层叠图层及其嵌套
    • 8.1 用 layer 图层来操控层叠规则(上篇)
      • 8.1.1 图层的定义(上篇)
      • 8.1.2 图层的顺序与优先级(下篇)
      • 8.1.3 revert-layer 关键字(下篇)
    • 8.2 层叠图层的推荐组织方案
    • 8.3 伪类 :is() 和 :where() 的用法
    • 8.4 CSS 嵌套的使用
      • 8.4.1 嵌套选择器的使用
      • 8.4.2 深入理解嵌套选择器
      • 8.4.3 媒体查询及其他 @规则 的嵌套
    • 8.5 本章小结
  • 第九章 CSS 的模块化与作用域
    • 9.1 模块的定义
      • 9.1.1 模块和全局样式
      • 9.1.2 一个简单的 CSS 模块
      • 9.1.3 模块的变体
      • 9.1.4 多元素模块
    • 9.2 将模块组合为更大的结构
      • 9.2.1 模块中多个职责的拆分
      • 9.2.2 模块的命名
    • 9.3 CSS 的作用域
      • 9.3.1 CSS 作用域的就近原则
      • 9.3.2 划定作用域的边界
      • 9.3.3 CSS 中的隐式作用域
      • 9.3.4 关于 CSS 作用域与层叠图层
    • 9.4 CSS 模式库
    • 9.5 本章小结
  • 第十章 CSS 容器查询
    • 10.1 容器查询的一个简单示例
      • 10.1.1 容器尺寸查询的用法
    • 10.2 深入理解容器
      • 10.2.1 容器的类型
      • 10.2.2 容器的名称
      • 10.2.3 容器与模块化 CSS
    • 10.3 与容器相关的单位
    • 10.4 容器样式查询的用法
      • 10.4.1 将模块与所在容器解耦
      • 10.4.2 减少重复代码
    • 10.5 本章小结
  • 第 11 章 颜色与对比
    • 11.1 通过对比进行交流
      • 11.1.1 模式的建立
      • 11.1.2 还原设计稿
    • 11.2 颜色的定义
      • 11.2.1 色域与色彩空间
      • 11.2.2 CSS 颜色表示法(RGB、Hex、HSL、HWB、LAB/OKLAB、LCH/OKLCH)
    • 11.3 利用 OKLCH 处理颜色(上篇)
      • 11.3.4 从页面其他颜色衍生出新颜色(下篇)
    • 11.4 思考字体颜色的对比效果
    • 11.5 本章小结
  • 第 12 章 CSS 排版与间距
    • 12.1 间距设置
      • 12.1.1 使用 em 还是 px
      • 12.1.2 对行高的深入思考
      • 12.1.3 行内元素的间距设置
    • 12.2 Web 字体
    • 12.3 谷歌字体
    • 12.4 @font-face 的工作原理
      • 12.4.1 字体格式与回退处理
      • 12.4.2 同一字型的多种变体形式
    • 12.5 性能因素考量
      • 12.5.1 font-display 属性解析
      • 12.5.2 可变字体的用法
    • 12.6 调整字间距,提升可读性
      • 12.6.1 正文的字间距
      • 12.6.2 标题、小元素和间距
    • 12.7 本章小结
  • 第 13 章 渐变、阴影与混合模式
    • 13.1 渐变
      • 13.1.1 使用多个颜色节点(上)
      • 13.1.2 颜色插值方法(中)
      • 13.1.3 径向渐变(下)
      • 13.1.4 锥形渐变(下)
    • 13.2 阴影
      • 13.2.1 利用渐变和阴影打造立体感
      • 13.2.2 使用扁平化设计创建元素
      • 13.2.3 创建混合风格的按钮外观
    • 13.3 混合模式
      • 13.3.1 为图片上色
      • 13.3.2 混合模式的类型
      • 13.3.3 图片纹理的添加
      • 13.3.4 融合混合模式的用法
    • 13.4 本章小结
  • 第 14 章 蒙版、形状与剪切
    • 14.1 滤镜
      • 14.1.1 滤镜的类型
      • 14.1.2 背景滤镜
    • 14.2 蒙版
      • 14.2.1 带渐变效果的蒙版特效
      • 14.2.2 基于亮度来定义蒙版
      • 14.2.3 其他蒙版属性
    • 14.3 剪切路径
      • 14.3.1 多边形的裁剪路径
      • 14.3.2 Firefox 内置的剪切路径工具
      • 14.3.3 其他剪切路径类型
    • 14.4 浮动与形状
      • 14.4.1 浮动
      • 14.4.2 形状的定义
    • 14.5 本章小结
  • 第 15 章 过渡
    • 15.1 状态间的由此及彼
    • 15.2 定时函数
      • 15.2.1 定制贝塞尔曲线
      • 15.2.2 阶跃
    • 15.3 非动画属性
      • 15.3.1 不可添加动画效果的属性
      • 15.3.2 淡入与淡出
    • 15.4 过渡到自然高度
    • 15.5 自定义属性的过渡设置
    • 15.6 本章小结
  • 附录
    • 附录A:CSS 选择器参考
    • 附录B:CSS 预处理器简介

相关文章:

【CSS in Depth 2 精译_096】16.4:CSS 中的三维变换 + 16.5:本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第五部分 添加动效 ✔️【第 16 章 变换】 ✔️ 16.1 旋转、平移、缩放与倾斜 16.1.1 变换原点的更改16.1.2 多重变换的设置16.1.3 单个变换属性的设置 16.2 变换在动效中的应用 16.2.1 放大图标&am…...

Label-Studio X SAM 半自动化标注

教程&#xff1a;playground/label_anything/readme_zh.md at main open-mmlab/playground GitHub B站视频&#xff1a;Label Studio x Segment Anything Model 半自动化标注_哔哩哔哩_bilibili 需要注意&#xff1a; 1.LINUX上跑比较方便 2.中文路径、文件名闯大祸 3. 4…...

Mono里运行C#脚本8—mono_image_storage_open打开EXE文件

Mono里运行C#脚本8—mono_image_storage_open打开EXE文件 前面分析哈希表的实现,以及文件打开的底层函数,还有保存到HASH表里的数据结构。 static MonoImageStorage * mono_image_storage_open (const char *fname) { char *key = NULL; key = mono_path_resolve_symlinks…...

【WebSocket】tomcat内部处理websocket的过程

websocket请求格式 浏览器请求 GET /webfin/websocket/ HTTP/1.1。 Host: localhost。 Upgrade: websocket。 Connection: Upgrade。 Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg。 Origin: http://服务器地址。 Sec-WebSocket-Version: 13。 服务器响应 HTTP/1.1 101 Swi…...

将一个组件的propName属性与父组件中的variable变量进行双向绑定的vue3(组件传值)

封装组件看这个&#xff0c;然后理解父子组件传值 应用场景&#xff1a; 1.使用v - model语法实现双向绑定&#xff08;传值两边都不用定义方法接数据&#xff09; 1.子组件 1. update:modelValue事件是MultiSelect组件对象自带的事件 2.:options"countries" opti…...

Linux下通用型shellcode的编写

实验目的及要求 目的&#xff1a; 通过对本实验执行过程的理解&#xff0c;认真分析总结&#xff0c;能够独立的在 Linux 下进行 shellcode 的编写。 要求&#xff1a; &#xff08;1&#xff09;%70&#xff1a;完成对 shellcode 的分析及提取 &#xff08;2&#xff09;%…...

STM32F103RCT6学习之二:GPIO开发

GPIO基础 1.简介 2.GPIO基本结构 3.种模式 GPIO基本功能 1.输出功能--LED灯闪烁 1)进行基本配置 2)编辑代码 主要在main.c中编辑。 int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration------------------------------------------------…...

kong网关使用pre-function插件,改写接口的返回数据

一、背景 kong作为api网关&#xff0c;除了反向代理后端服务外&#xff0c;还可对接口进行预处理。 比如本文提及的一个小功能&#xff0c;根据http header某个字段的值&#xff0c;等于多少的时候&#xff0c;返回一个固定的报文。 使用到的kong插件是pre-function。 除了上…...

C++、Python有哪些相同和不同

C 和 Python 是两种流行的编程语言&#xff0c;设计理念和应用场景各有不同&#xff0c;但也有一些相似之处。以下是它们在语言特性、性能、语法等方面的相同点和不同点的比较&#xff1a; 相同点 支持多种编程范式&#xff1a; 面向对象编程 (OOP)&#xff1a;两者都支持类、继…...

Spring Boot 自动配置:从 spring.factories 到 AutoConfiguration.imports

Spring Boot 提供了强大的自动配置功能&#xff0c;通过约定优于配置的方式大大简化了应用开发。随着版本迭代&#xff0c;自动配置的实现方式也逐渐优化&#xff0c;从早期的 spring.factories 文件到最新的 META-INF/spring/org.springframework.boot.autoconfigure.AutoConf…...

HarmonyOS Next 应用元服务开发-应用接续动态配置迁移按需退出

按需退出&#xff0c;支持应用动态选择迁移成功后是否退出迁移源端应用&#xff08;默认迁移成功后退出迁移源端应用&#xff09;。如果应用不想让系统自动退出迁移源端应用&#xff0c;则可以设置不退出&#xff0c;参数定义见SUPPORT_CONTINUE_SOURCE_EXIT_KEY。 示例&#x…...

SQL-leetcode-180. 连续出现的数字

180. 连续出现的数字 表&#xff1a;Logs -------------------- | Column Name | Type | -------------------- | id | int | | num | varchar | -------------------- 在 SQL 中&#xff0c;id 是该表的主键。 id 是一个自增列。 找出所有至少连续出现三次的数字。 返回的…...

使用Python pickle模块进行序列化

使用Python pickle模块进行序列化 在Python中&#xff0c;pickle模块是一个用于实现数据序列化与反序列化的强大工具。与json模块不同的是&#xff0c;pickle支持将几乎所有的Python对象进行序列化&#xff0c;包括字典、列表、类实例&#xff0c;甚至函数。这使得它在处理复杂…...

责任链模式(ChainofResponsibilityPattern)

文章目录 1.定义2.结构3.问题描述代码实现 1.定义 允许你将请求沿着处理者链进行发送。 收到请求后&#xff0c; 每个处理者均可对请求进行处理&#xff0c; 或将其传递给链上的下个处理者。 2.结构 处理者(Handler)&#xff1a;声明了所有具体处理者的通用接口。 该接口通常…...

自定义 Element Plus 树状表格图标

在开发使用 Element Plus 的树状表格时&#xff0c;默认的展开/收起图标可能不能满足设计需求。为了更符合项目要求&#xff0c;可以通过覆盖样式的方式来自定义这些图标。以下记录了实现自定义树状表格图标的完整过程。 实现效果 有子节点且未展开时&#xff1a;显示一个加号…...

Vue2:用一个例子理解一下vue template中属性前面的冒号“:“

常用写法 table中绑定数据,我们通常这么写: ​​​​​​​<el-table :data="tableData" style="width: 100%">data() {tableData:[], } data绑定变量名可变的动态对象 但是上一篇文中,因为要生成15组相似的table,它们的格式都一样,只是数据…...

AF3 partition_tensor函数源码解读

该函数将输入张量按原子维度 (n_atoms) 分块,以局部窗口方式滑动,生成 滑动窗口张量。 在神经网络中,尤其是处理大规模序列数据(例如蛋白质原子特征)时,直接对整个序列执行操作可能会导致计算和内存效率问题。partition_tensor 函数通过对输入张量进行分块(partitions)…...

C++类与对象上

1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题 例如洗衣服&#xff1a; C是基于面向对象的&#xff0c;关注的是对象&#xff0c;讲一件事拆分成不同的对象&#xff0c;靠对…...

中巨伟业推出高安全高性能32位智能卡内核可编程加密芯片SMEC88SP/ST

1、产品特性  以最高安全等级的智能卡芯片内核为基础&#xff0c;具有极高的软硬件安全性  实现客户关键功能或算法代码下载&#xff0c;用户可以灵活实现自有知识产权的保护  标准 SOP8、SOT23-6 封装形式&#xff0c;器件封装小  标准 I2C 接口&#xff0c;具有接…...

Python微博动态爬虫

本文是刘金路的《语言数据获取与分析基础》第十章的扩展&#xff0c;详细解释了如何利用Python进行微博爬虫&#xff0c;爬虫内容包括微博指定帖子的一级评论、评论时间、用户名、id、地区、点赞数。 整个过程十分明了&#xff0c;就是用户利用代码模拟Ajax请求&#xff0c;发…...

包管理工具npm、yarn、pnpm、cnpm详解

1. 包管理工具 1.1 npm # 安装 $ node 自带 npm# 基本用法 npm install package # 安装包 npm install # 安装所有依赖 npm install -g package # 全局安装 npm uninstall package # 卸载包 npm update package # 更新包 npm run script #…...

Docker和Kubernetes(K8s)区别

目录 1. Docker Docker 的核心概念&#xff1a; Docker 的功能&#xff1a; Docker 常见使用场景&#xff1a; 2. Kubernetes (K8s) Kubernetes 的核心概念&#xff1a; Kubernetes 的功能&#xff1a; Kubernetes 常见使用场景&#xff1a; 3.Docker 和 Kubernetes 的…...

龙智出席2024零跑智能汽车技术论坛,分享功能安全、需求管理、版本管理、代码扫描等DevSecOps落地实践

龙智快讯 2024年12月5日&#xff0c;由零跑和盖世汽车主办的“2024零跑智能汽车技术论坛”在杭州零跑总部圆满落幕。此次技术论坛聚焦AI语言大模型、AUTOSAR AP平台、DevOps、端到端自动驾驶等热点话题展开探讨&#xff0c;旨在推动智能汽车技术的创新与发展。 龙智作为国内领先…...

SQL进阶技巧:如何分析双重职务问题?

目录 0 背景描述 1 数据准备 2 问题分析 方法2&#xff1a;利用substr函数&#xff0c;充分利用数据特点【优秀解法】 3 小结 0 背景描述 在 CompuServe 刚成立时&#xff0c;Nigel Blumenthal 遇到一个应用程序中的困难。他需要获取公司人员所担任角色的源表&#xff0c;…...

SAQ问卷的定义,SAQ问卷是什么?

SAQ问卷&#xff0c;全称为可持续发展评估问卷&#xff08;Sustainability Assessment Questionnaire&#xff09;&#xff0c;是一种在线自评工具&#xff0c;其深远意义与广泛应用在当今商业环境中愈发凸显。它不仅是一种衡量企业在环境、社会和治理&#xff08;ESG&#xff…...

Express.js 有哪些常用的中间件?

在使用 Express.js 开发应用程序时&#xff0c;中间件&#xff08;Middleware&#xff09;是处理请求和响应的关键组件。它们可以执行各种任务&#xff0c;如解析请求体、添加HTTP头部、记录日志等。以下是一些常用的中间件&#xff1a; body-parser 用于解析传入的请求体。它…...

K8s DaemonSet的介绍

1. 什么是 DaemonSet&#xff1f; DaemonSet 是 Kubernetes 中的一种控制器&#xff0c;用于确保每个&#xff08;或某些指定的&#xff09;节点上运行一个 Pod 副本。它是为部署守护进程设计的&#xff0c;例如需要在每个节点上运行的任务或工具。 特点&#xff1a; Pod 会随…...

同步异步日志系统:设计模式

设计模式是前辈们对代码开发经验的总结&#xff0c;是解决特定问题的⼀系列套路。它不是语法规定&#xff0c;⽽是⼀ 套⽤来提⾼代码可复⽤性、可维护性、可读性、稳健性以及安全性的解决⽅案。 为什么会产生设计模式这样的东西呢&#xff1f;就像人类历史发展会产生兵法。最开…...

【GO基础学习】Gin 框架中间件的详解

文章目录 中间件详解中间件执行全局中间件路由级中间件运行流程中间件的链式执行中断流程 代码示例 gin框架总结 中间件详解 Gin 框架中间件是其核心特性之一&#xff0c;主要用于对 HTTP 请求的处理进行前置或后置的逻辑插入&#xff0c;例如日志记录、身份认证、错误处理等。…...

ubuntu停止.netcore正在运行程序的方法

在Ubuntu系统中停止正在运行的.NET Core程序&#xff0c;你可以使用以下几种方法&#xff1a; 使用kill命令&#xff1a; 如果你知道.NET Core程序的进程ID&#xff08;PID&#xff09;&#xff0c;你可以直接使用kill命令来停止它。首先&#xff0c;使用ps命令配合grep来查找.…...

图神经网络_图嵌入_Struc2Vec

0 背景 之前的node embedding方式&#xff0c;都是基于近邻关系&#xff0c;但是有些节点没有近邻&#xff0c;也有结构相似性。如图中的u、v节点。 struc2vec算法适用于捕获结构相似性。 1 相似度&#xff08;距离&#xff09;计算 1.1 公式 f k ( u , v ) f k − 1 ( u …...

LabVIEW应用在工业车间

LabVIEW作为一种图形化编程语言&#xff0c;以其强大的数据采集和硬件集成功能广泛应用于工业自动化领域。在工业车间中&#xff0c;LabVIEW不仅能够实现快速开发&#xff0c;还能通过灵活的硬件接口和直观的用户界面提升生产效率和设备管理水平。尽管其高成本和初期学习门槛可…...

js-000000000000

1、js书写的位置 - 内部 <body> <!-- 习惯把 js 放到 /body 的后面 --> <script> console.log(这是内部 js 的书写位置) alert(内部js) </script> </body> <body><!-- 习惯把 js 放到 /body 的后面 --><script>console.log(这…...

【微信小程序】3|首页搜索框 | 我的咖啡店-综合实训

首页-搜索框-跳转 引言 在微信小程序中&#xff0c;首页的搜索框是用户交互的重要入口。本文将通过“我的咖啡店”小程序的首页搜索框实现&#xff0c;详细介绍如何在微信小程序中创建和处理搜索框的交互。 1. 搜索函数实现 onClickInput函数在用户点击搜索框时触发&#x…...

虚幻引擎是什么?

Unreal Engine&#xff0c;是一款由Epic Games开发的游戏引擎。该引擎主要是为了开发第一人称射击游戏而设计&#xff0c;但现在已经被成功地应用于开发模拟游戏、恐怖游戏、角色扮演游戏等多种不同类型的游戏。虚幻引擎除了被用于开发游戏&#xff0c;现在也用于电影的虚拟制片…...

分布式光纤传感|分布式光纤测温|线型光纤感温火灾探测器DTS|DTS|DAS|BOTDA的行业16年的总结【2024年】

背景&#xff1a; 从2008年&#xff0c;从事分布式光纤传感行业已经过了16年时间了&#xff0c;依稀记得2008年&#xff0c;看的第一遍论文就是中国计量大学张在宣老爷子的分布式光纤测温综述&#xff0c;我的经历算是行业内极少数最丰富的之一。混过学术圈&#xff1a; 发表…...

【无标题】学生信息管理系统界面

网页是vue框架&#xff0c;后端直接python写的没使用框架...

ES7+ React/Redux/GraphQL/React-Native snippets 使用指南

VS Code React Snippets 使用指南 目录 简介基础方法React 相关React Native 相关Redux 相关PropTypes 相关控制台相关React 组件相关 简介 ES7 React/Redux/GraphQL/React-Native snippets 是一个用于 VS Code 的代码片段插件&#xff0c;它提供了大量用于 React 开发的代…...

Java中三大构建工具的发展历程(Ant、Maven和Gradle)

&#x1f438; 背景 我们要写一个Java程序&#xff0c;一般的步骤是编译&#xff0c;测试&#xff0c;打包。 这个构建的过程&#xff0c;如果文件比较少&#xff0c;我们可以手动使用java, javac,jar命令去做这些事情。但当工程越来越大&#xff0c;文件越来越多&#xff0c…...

【国产NI替代】32振动/电压(配置复合型)高精度终端采集板卡,应用于复杂的大型测量场景

32振动/电压&#xff08;配置复合型&#xff09;高精度终端采集板卡 采用 EP4CE115F29I7 型号的 FPGA &#xff0c;是一款 高精度&#xff0c;多通道动态信号采集器&#xff0c;主要应用 在复杂的大型测量并对成本要求不敏感的场 合&#xff0c;默认具备 8 个测量板卡&#…...

服务器上加入SFTP------(小白篇 1)

在服务器上配置 SFTP (基于 SSH 的文件传输协议) 通常比传统 FTP 更安全&#xff0c;因为它默认加密通信。以下是详细的配置步骤&#xff0c;以 Ubuntu 或 CentOS 为例。 1.服务器上加入SFTP------(小白篇 1) 2.加入SFTP 用户------(小白篇 2) 3.代码加入SFTP JAVA —&#…...

突围边缘:OpenAI开源实时嵌入式API,AI触角延伸至微观世界

当OpenAI宣布开源其名为openai-realtime-embedded-sdk的实时嵌入式API时&#xff0c;整个科技界都为之震惊。这一举动意味着&#xff0c;曾经遥不可及的强大AI能力&#xff0c;如今可以被嵌入到像ESP32这样的微型控制器中&#xff0c;真正地将AI的触角延伸到了物联网和边缘计算…...

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的影视网站系统的设计与实现

开题报告 随着互联网的快速发展和普及&#xff0c;人们对于娱乐和信息的需求越来越大。影视网站作为一种提供短视频、影视、电视剧、综艺节目等视频资源的网站&#xff0c;受到了广大用户的喜爱。然而&#xff0c;现有的影视网站系统仍然存在着一些安全性不强&#xff0c;用户…...

前端技术(26) : 全年排班日历

来源: 通义千问 效果图 代码 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>年度日历</title><style>body {font-family: Arial, sans-serif;}.calendar-container {margin: 20px au…...

Linux网络——TCP的运用

系列文章目录 文章目录 系列文章目录一、服务端实现1.1 创建套接字socket1.2 指定网络接口并bind2.3 设置监听状态listen2.4 获取新链接accept2.5 接收数据并处理&#xff08;服务&#xff09;2.6 整体代码 二、客户端实现2.1 创建套接字socket2.2 指定网络接口2.3 发起链接con…...

Elasticsearch 数据存储底层机制详解

Elasticsearch 数据存储底层机制详解 Elasticsearch 的底层存储机制依赖 Lucene 来实现数据的组织和管理。下面从数据存储的 流转过程 和 管理机制 两个方面来详细说明。 1. 数据存储流程 当一个文档通过 REST API 被写入 Elasticsearch 时&#xff0c;会经历以下流程&#x…...

Spring Boot 中 Map 的最佳实践

在Spring Boot中使用Map时&#xff0c;请遵循以下最佳实践: 1.避免在Controller中 直接使用Map。应该使用RequestBody 接收-个DTO对象或者 RequestParam接收参数&#xff0c;然后在Service中处 理Map。 2.避免在Service中 直接使用原始的Map。应该使用Autowired 注入-个专门…...

es6 字符串每隔几个中间插入一个逗号

const insertCommaEveryNChars (str, n) > {// 将字符串转换为数组&#xff0c;以便我们可以更容易地操作每个字符const chars str.split();// 使用map遍历数组&#xff0c;并在每隔n个字符后插入逗号const result chars.map((char, index) > {// 检查当前位置是否是n…...

区块链共识机制深度揭秘:从PoW到PoS,谁能主宰未来?

区块链的技术背后&#xff0c;最大的挑战之一就是如何让多个分布在全球各地的节点在没有中心化管理者的情况下达成一致&#xff0c;确保数据的一致性和安全性。这一切都依赖于区块链的核心——共识机制。共识机制不仅决定了区块链的安全性、效率和去中心化程度&#xff0c;还对…...

SQL Server 新建 用户 登录失败。 (Microsoft SQL Server,错误: 18456)

新建用户后用SQLserver shen身份验证一直提示用户登录用户 登录失败。 (Microsoft SQL Server,错误: 18456)。 问题&#xff1a; 新建标题: 连接到服务器 无法连接到 DESKTOP-GKBXLEE。 其他信息: 用户 ‘’ 登录失败。 (Microsoft SQL Server&#xff0c;错误: 18456) 解…...