【CSS in Depth 2 精译_075】12.2 Web 字体简介 + 12.3 谷歌字体的用法

news2024/12/16 6:03:44

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

  • 第四部分 视觉增强技术 ✔️
  • 【第 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.2 Web 字体 Web fonts
    • 12.3 谷歌字体 Google fonts

《CSS in Depth》新版封面

《CSS in Depth》新版封面

译者按
结束了设计稿的间距样式微调,从本篇开始再来了解一下 CSS 排版方面的知识。首先就是本篇介绍的 Web 字体,尤其是像谷歌字体这样的线上 Web 字体的引用。时隔六年,作者对相关内容进行了全面更新,对其中个别段落还补充了必要的截图,方便各位了解 Web 字体的相关操作。一起来先睹为快吧!

12.2 Web 字体 Web fonts

接下来,我们将通过添加自定义字体来让页面效果再上一个新台阶。迄今为止,我都没在示例页面的设计稿中囊括这些内容,但设计师几乎肯定会在其设计作品中指定网页字体。

页面设计可谓成也字体,败也字体。多年来,Web 开发者只能从很有限的字体库中做选择,即所谓的 Web 安全字体(web-safe fonts。这些字体类型(font families)包括 ArialHelveticaGeorgia 等,且绝大多数用户的操作系统都会安装。早期的浏览器只能使用这些系统字体来渲染页面,因此也不得不使用它们来进行网页开发。即便偶尔也可能指定某个非系统字体,比如 Helvetica Neue,但也只有那些碰巧安装了这款字体的用户才能正确渲染,而其他用户只能看到更通用的字体回退方案。

随着 Web 字体的兴起,情况改变了。Web 字体可以通过 @font-face 规则来告诉浏览器去哪儿检索并下载页面所需的自定义字体。使用自定义字体后,原本平淡无奇的页面也可以大有改观,仿佛开启了一个全新的世界,让人们有了更多选择与想象的空间。

不同的页面字体会带来不同的观感体验,或灵动活泼、或有板有眼;或沉稳可信、或不拘一格。如图 12.9 所示,对同一段文字分别使用了三组不同的字体。在左上角的示例中,标题用的是 News Cycle 字体,而正文则用的是 EB Garamond;这样看起来比较正式,一般出现在新闻报纸类网站中。而右上角的案例则分别使用了 ForumOpen Sans 字体,视觉效果就没那么正式,可用于个人博客或者小型技术公司。最后左下方的案例用到的字体分别是 AntonPangolin,显得比较活泼,甚至略带卡通风格,适用于儿童类网站。以上三个案例,仅仅只是变更了一下字体,别的什么都没做,就可以营造出截然不同的页面氛围。

图 12.9 不同的字体会显著影响网站的整体观感

【图 12.9 不同的字体会显著影响网站的整体观感】

通过在线服务来使用 Web 字体是最简单、可能也是最普遍的方式。常见的有 谷歌字体Google Fonts,详见:https://fonts.google.com/)与 Adobe 字体Adobe Fonts,详见:https://fonts.adobe.com/)。

无论收费还是免费,这些服务都可以解决很多问题,包括技术上(如托管服务)和法律上(如授权许可)的一些问题。它们都提供了大量可供选择的字体库;但偶尔也遇到某个特殊字体仅对付费用户开放,并且还得自行处理托管事宜。

由于谷歌字体提供了很多高质量且开源的字体(而且是免费的),接下来我将带您了解利用这项服务将 Web 字体添加到页面的具体方法。因为谷歌做了大量的工作,所以添加字体非常简单。然后我们将深入研究它的底层运行逻辑,看看它究竟是怎么工作的、又是如何托管自己的字体的。

本章将沿用之前构建的示例页,并通过 Web 字体来完善页面设计。完成后的页面渲染效果如图 12.10 所示。图中大部分内容用的是 Roboto 字体,它也是整个页面主要的正文字体;而标题使用的是 Sansita 字体。

图 12.10 启用了 Sansita 和 Roboto 这两款 Web 字体的页面局部效果

【图 12.10 启用了 Sansita 和 Roboto 这两款 Web 字体的页面局部效果】

让标题和正文分别使用两种不同的字体是很常见的做法。通常情况下,其中一种字体是 衬线(serif)字体,而另一种则为 无衬线(sans serif)字体。但本例中的两种字体都是无衬线类型。此外还可能见到有的设计标题和正文用的是相同的字体,但字体粗细各不相同的情况。

定义

衬线(serif 是某字符笔画末端的小线条或者“爪状”修饰效果。包含衬线的字体就被称为 衬线字体(serif typeface)(例如 Times New Roman);而没有衬线效果的字体则被称为 无衬线字体(sans serif typeface(例如 Helvetica)。

12.3 谷歌字体 Google fonts

访问谷歌字体网站 https://fonts.google.com/,就可以看到谷歌字体中当前可用的字体目录。该网站通过网格板块的方式来展示这些字体(如图 12.11 所示)。您可以直接从页面上选择字体,或者通过页面顶部的搜索栏或左侧的筛选工具来检索特定字体。

图 12.11 谷歌字体的字体选择界面

【图 12.11 谷歌字体的字体选择界面】

单击其中某个字体将显示更多详情信息,包括可用的字体粗细(细体、常规、粗体)及字体样式(常规或斜体)的列表。在屏幕的右上角有个获取该字体(“Get font” 字样)的按钮。点击该按钮会将其添加到已选字体中,并可通过点击右上角的小购物袋图标来预览选中的字体。

如果知道需要什么样的字体,就可以通过字体名称来快速检索。在搜索栏中输入 Sansita 后,就会从主视图中筛选掉其他无关字体。点击 Sansita 字体进入详情页,然后点击获取字体按钮(即 “Get font” 字样的按钮)将其添加到已选字体中。这样相当于添加了该字体的所有粗细和样式,稍后再做进一步细化。

然后返回谷歌字体首页(点击顶部的 Google Fonts 图标)。在搜索框输入 Roboto,Google 会找出好几种相关字体,其中包括 RobotoRoboto CondensedRoboto Slab 等。点击 Roboto 字体并将其添加到已选字体中。

【译注】

感觉这里有必要补充一个截图,以免过于抽象:

补图1:进入某字体详情页后,点击右上角的按钮可将当前字体列入已选字体中

【补图1:进入某字体详情页后,点击右上角的按钮可将当前字体列入已选字体中】


再点击上图右上角的购物袋图标,即可看到当前已选中的所有字体:
补图2:点击右上角的购物袋图标,可以查看当前已选中的所有谷歌字体

【补图2:点击右上角的购物袋图标,可以查看当前已选中的所有谷歌字体】

这样一来,页面就会显示 “2 font families selected” 字样(即 “已选中两个字体类型”)。页面右侧有两个按钮,按钮 “Get Embed Code”(获取嵌入式代码)负责提供嵌入这些字体所需的 CSS(如图 12.12 所示);而按钮 “Download all”(即 “全部下载”)则可以将所选字体下载到本地。我们先点击第一个按钮。

图 12.12 左侧为当前选中的字体列表,右侧则显示对应的嵌入式代码

【图 12.12 左侧为当前选中的字体列表,右侧则显示对应的嵌入式代码】

到现在为止,您已经熟悉了常规和粗体字的粗细设置,但某些字体还支持多种不同的粗细尺寸。例如,Roboto 字体共有六种不同的粗细,范围从细体(thin)到特粗体(black)不等,同时每一种粗细还有对应的斜体字格式。请注意,除了使用细体(thin)、常规(regular)、粗体(bold)、黑体(black)外,字体粗细(weights)还可以用数值来表示,例如 100、400、700 和 900 等等。

说明

字型(typeface字体(font 这两个术语经常被混为一谈。字型 是指字体的整个家族(例如 Roboto),通常由同一位设计师创建;一种字型可能会存在多种样式变体或粗细形式(例如细体(light)、粗体(bold)、斜体(italic)、压缩(condensed)等等)。这些变体的每一个都可以称之为一种 字体(font

理想情况下,您可以选择字体所有的变体形式来为您的页面设计提供丰富的选择。然而,要添加的字体越多,意味着浏览器要同步下载的内容也会增多,从而让 Web 字体成为仅次于图片的、拖慢页面加载速度的几个罪魁祸首之一。为此,一种名为 可变字体(variable fonts 的全新技术应运而生,可以在一个更轻量的文件中实现多个变体形式的嵌入,本章稍后会为您演示其用法;但要是该方案并不具备实施条件,就应该更加慎重,只选取真正需要的字体。

一开始,字体的所有粗细版本都会被选中。在每个选中的字体下方,点击 “Change styles” 按钮(即 “变更样式”),并取消选中除了 Roboto 中的 Light 300、以及 Sansita 中的 ExtraBold 800 以外的所有粗细样式。剩下的这两个才是页面需要的字体粗细。通常还需要准备正文主体文字的斜体字版本,但在本例中无需考虑。

然后根据代码清单 12.6 所示的样式,将 <link> 标签复制到示例页的 <head> 元素中。这样就把包含字体描述的样式表添加到了示例页。此时页面会有两个样式表:一个是您自己的,而另一个则是字体的专属样式表。

此外,代码中还包含两个设置了 preconnect 预连接的 <link> 元素。它们是给浏览器的提示信息,用于告诉浏览器 Web 字体需要加载来自如下 Google 域名的资源,以便在解析 HTML 时预先进行连接,从而让样式表在后续解析到它们时,进一步提升字体的加载速度。

代码清单 12.6 引入谷歌字体样式的 <link> 标签写法

<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300&family=Sansita:wght@800&display=swap"
  rel="stylesheet"
/>

有了这个样式表,Web 字体的设置就能完全交给 Google 打理了。设置完成后就能在样式中使用这些字体了。将上述代码添加到本地页面,将得到如图 12.13 所示的页面效果:

图 12.13 使用了 Roboto 字体及 Sansita 字体后的页面效果

【图 12.13 使用了 Roboto 字体及 Sansita 字体后的页面效果】

要让相应的字体生效,需要通过 font-family 属性来指定 Roboto 字体或 Sansita 字体。为此,得再更新一下 CSS。先在 <body> 标签中指定正文字体 Roboto,这样整个网页都将继承该字体;然后将各级标题的字体、以及首页连接元素 home-link 的字体均设置为 Sansita。最后根据下列样式代码更新示例页面即可(要改动的位置已用注释说明)。

代码清单 12.7 使用 Web 字体的示例样式代码

@layer global {
  body {
    margin: 0;
    font-family: Roboto, sans-serif; /* 对页面全局应用 Roboto 字体 */
    line-height: 1.4;
    background-color: var(--extra-light-gray);
  }

  h1, h2, h3, h4 {
    font-family: Sansita, serif; /* 各级标题设为 Sansita 字体 */
  }
}

/* ... */

@layer modules {
  .home-link {
    color: var(--text-color);
    font-size: 1.6rem;
    font-family: Sansita, serif; /* 左上角的首页链接设为 Sansita 字体 */
    font-weight: bold;
    text-decoration: none;
  }
}

由于页面添加了谷歌字体样式表,浏览器就能正确解析这些字体设置并将其关联到已下载的 Web 字体上,最终让对应字体生效。如果使用其他的 Web 字体服务(例如 Adobe 字体),那么整个过程也是大同小异。这些服务要么提供所需 CSS 样式的 URL 地址,要么提供能为页面添加 CSS 样式的 JavaScript 代码片段。

接下来我们将对字体间距进行微调,并分享几个关于性能加载方面的考量因素。在这之前,先来看看谷歌字体都为我们做了哪些工作。



关于《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 本章小结
  • 附录
    • 附录A:CSS 选择器参考
    • 附录B:CSS 预处理器简介

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2260337.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARM嵌入式学习--第七天(GPT)

GPT -介绍 GPT有一个32位向上计数器&#xff0c;定时计数器值可以使用外部引脚上的事件捕获到寄存器中&#xff0c;捕获触发器可以被编程为上升沿和下降沿。GPT还可以在输出比较引脚上生成事件&#xff0c;并在定时器达到编程值时产生中断。GPT有一个12位预分频器&#xff0c;…

搭建Tomcat(一)---SocketServerSocket

目录 引入1 引入2--socket 流程 Socket&#xff08;应用程序之间的通讯保障&#xff09; 网卡(计算机之间的通讯保障) 端口 端口号 实例 client端 解析 server端 解析 相关方法 问题1&#xff1a;ServerSocket和Socket有什么关系&#xff1f; ServerSocket Soc…

SpringBoot快速使用

一些名词的碎碎念: 1> 俩种网络应用设计模式 C/S 客户端/服务器 B/S 浏览器/服务器 俩者对比: 2> 集群和分布式的概念 集群: 分布式: 例子: 一个公司有一个人身兼多职 集群: 招聘N个和上面这个人一样身兼多职 分布式: 招聘N个人,分担上面这个人的工作,进行工作的拆分. 工…

【含开题报告+文档+PPT+源码】基于SpringBoot的开放实验管理平台设计与实现

开题报告 设计开放实验管理平台的目的在于促进科学研究与教学的融合。传统实验室常常局限于特定地点和时间&#xff0c;而开放平台可以为学生、教师和研究人员提供一个便捷的交流与共享环境。通过在线平台&#xff0c;他们可以分享实验资源、交流经验&#xff0c;从而促进科学…

分布式 漏桶算法 总结

前言 相关系列 《分布式 & 目录》《分布式 & 漏桶算法 & 总结》《分布式 & 漏桶算法 & 问题》 概述 简介 LBA Leaky Bucket Algorithm 漏桶算法是一种流行于网络通信领域的流量控制/频率限制算法。漏桶算法的核心原理是通过一个概念上的“漏桶”来…

linux glances vs top

一、安装 apt-get install glances glances top显示效果&#xff1a;

CTF知识集-PHP特性

title: CTF知识集-PHP特性 写在开头可能会用到的提示 call_user_func 调用的函数可以不区分大小写preg_match过滤存在长度溢出&#xff0c;长度超过100w检测失效。str_repeat(‘show’,250000); 生成100w个字符preg_match是无法处理数组的&#xff0c;例如:preg_match( n u m…

Hadoop运行Mapreduce问题集锦——Ubuntu虚拟机配置

一、端口访问问题 问题描述 运行任务前一直重连。具体来说&#xff0c;错误发生在尝试从czs-virtual-machine虚拟机的127.0.1.1地址连接到同一台机器的8032端口时&#xff0c;连接被拒绝。 如下&#xff1a; 2024-11-17 23:05:45,800 INFO retry.RetryInvocationHandler: java…

【经验分享】搭建本地训练环境知识点及方法

最近忙于备考没关注&#xff0c;有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源&#xff0c;但我以交流、交换为主&#xff0c;笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟&#xff0c;为了避免更多人花没必要的钱&#xff0c;所以决定公…

流程引擎Activiti性能优化方案

流程引擎Activiti性能优化方案 基于关系型数据库层面优化 MySQL建表语句优化 Activiti在MySQL中创建默认字符集为utf8&#xff08;即utf8mb3&#xff09;格式&#xff0c;本文将默认字符集设置为utf8mb4&#xff0c;排序规则为utf8mb4_general_ci&#xff0c;并修改变量等类…

Unix 传奇 | 谁写了 Linux | Unix birthmark

注&#xff1a;本文为 “左耳听风”陈皓的 unix 相关文章合辑。 皓侠已走远&#xff0c;文章有点“年头”&#xff0c;但值得一阅。 文中部分超链已沉寂。 Unix 传奇 (上篇) 2010 年 04 月 09 日 陈皓 了解过去&#xff0c;我们才能知其然&#xff0c;更知所以然。总结过去…

TimerPickerDialog组件的用法

文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了Snackbar Widget相关的内容,本章回中将介绍TimePickerDialog Widget.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在这里说的TimePickerDialog是一种弹出窗口,只不过窗口的内容固定显示为时间,它主…

大模型系列4--开源大模型本地部署到微调(WIP)

背景 一直想真正了解大模型对硬件资源的需求&#xff0c;于是准备详细看一篇视频&#xff0c;将核心要点总结记录下。本文内容参考视频&#xff1a;保姆级教程&#xff1a;6小时掌握开源大模型本地部署到微调&#xff0c;感谢up主 训练成本 训练 > 微调 > 推理训练GPT…

现代密码学总结(上篇)

现代密码学总结 &#xff08;v.1.0.0版本&#xff09;之后会更新内容 基本说明&#xff1a; ∙ \bullet ∙如果 A A A是随机算法&#xff0c; y ← A ( x ) y\leftarrow A(x) y←A(x)表示输入为 x x x ,通过均匀选择 的随机带运行 A A A,并且将输出赋给 y y y。 ∙ \bullet …

Python中opencv的一些函数及应用

Sobel 算子函数 功能&#xff1a; Sobel 算子用于计算图像的梯度&#xff08;变化率&#xff09;&#xff0c;常用于边缘检测。它通过对图像应用一个基于一阶导数的滤波器来强调图像中的边缘部分&#xff0c;特别是水平和垂直方向上的边缘。通过计算图像的梯度&#xff0c;可以…

【docker】springboot 服务提交至docker

准备docker &#xff08;不是docker hub或者harbor&#xff0c;就是可以运行docker run的服务&#xff09;&#xff0c;首先确保docker已经安装。 本文以linux下举例说明&#xff1a; systemctl stats docker ● docker.service - Docker Application Container EngineLoaded…

XDOJ 877 图的深度优先遍历

题目&#xff1a;图的深度优先遍历 问题描述 已知无向图的邻接矩阵&#xff0c;以该矩阵为基础&#xff0c;给出深度优先搜索遍历序列&#xff0c;并且给出该无向图的连通分量的个数。在遍历时&#xff0c;当有多个点可选时&#xff0c;优先选择编号小的顶点。&#xff08;即…

大屏开源项目go-view二次开发1----环境搭建(C#)

最近公司要求做一个大屏的程序用于展示公司的产品&#xff0c;我以前也没有相关的经验&#xff0c;最糟糕的是公司没有UI设计的人员&#xff0c;领导就一句话要展示公司的产品&#xff0c;具体展示的内容细节也不知道&#xff0c;全凭借自己发挥。刚开始做时是用wpf做的&#x…

摆脱B端UI框架的桎梏,首先从布局开始

在 B 端开发中&#xff0c;UI 框架虽带来便利&#xff0c;但也可能形成桎梏。要摆脱这种束缚&#xff0c;首先从布局着手是个明智之举。传统的 B 端 UI 框架布局可能较为固定&#xff0c;缺乏灵活性。我们可以尝试创新的布局方式&#xff0c;如响应式设计&#xff0c;适应不同屏…

认识异常吧

在 Java 中&#xff0c;将程序执行过程中发生的不正常行为称为异常 。 异常的体系结构 1. Throwable &#xff1a; 是异常体系的顶层类&#xff0c;其派生出两个重要的子类 , Error&#xff08;错误&#xff09; 和 Exception&#xff08;异常&#xff09; 2. Error &…