者:vivo 互联网前端团队 - Zhang Jiqi
本文主要讲述了CSS中的级联层(CSS@layer),讨论了级联以及级联层的创建、嵌套、排序和浏览器支持情况。级联层可以用于避免样式冲突,提高代码可读性和可维护性。
一、什么是级联层(Cascade Layers)?
1.1 级联层的官方定义
我们参看Cascading and Inheritance Level 5(13 January 2022) 中6.4节所述:
级联层提供了一种结构化的方式来组织和平衡单个起源中的问题。单个级联层内的规则级联在一起,不与层外的样式规则交错。
开发者可以创建层来表现元素默认值、第三方库、主题、组件、覆盖和其他样式问题,并且能够以显式方式重新排序层级,而无需更改每个层内的选择器或特异性,或依赖源顺序来解决跨层的冲突。
单纯看官方定义和概括可能比较晦涩,下面我们会结合案例来说清楚。
1.2 级联层为了解决什么问题?
简而言之:级联层的出现就是为了使 CSS 开发者可以更简单直接地控制级联。
我们来假设日常开发中的一个场景,从场景去理解级联层在解决什么问题。
如下图:
我们原来的'display'文案是红色,当我们引入了一个第三方组件库,第三方库中有以下样式。
/* 开发者样式 */
.item {
color: red;
}
/* 第三方库 */
#app .item {
color: green;
border: 5px solid green;
font-size: 1.3em;
padding: 0.5em;
width: 120px;
}
就会导致'display'文案变成绿色。
我们想要将'display'文案的颜色由绿色改成红色一般的手段是增加选择器特异性(优先级)。比如在开发页面中对开发者样式进行修改:
/* 开发者样式 */
#app div.item {
color: red;
}
/* 第三方库 */
#app .item {
color: green;
border: 5px solid green;
font-size: 1.3em;
padding: 0.5em;
width: 120px;
}
或者借助级联中出场顺序对优先级的影响在用户页面中重写
/* 第三方库 */
#app .item {
color: green;
border: 5px solid green;
font-size: 1.3em;
padding: 0.5em;
width: 120px;
}
/* 开发者样式 */
#app .item {
color: red;
}
效果如下:
再举个例子:
比如有可能第三方组件写了
a { color: blue; }
那项目开发中由于引入这个第三方组件 就会导致样式污染,因为第三方库的样式往往都在项目设置的通用样式比如common.css后加载。
如果后面想在代码中覆盖某些属性,使用高特异性选择器的语句就可能会导致问题。然后因为有问题就会选择更高特异性的择器的语句或使用!important,这会使代码变得冗长也可能会带来副作用。低特异性选择器的语句很容易被后面出现在代码中的语句覆盖。在自己的代码之后加载第三方 CSS 时特别会出现这种问题。
所以级联层就是为了解决以上场景出现的,级联层在级联中的的位置是在内联样式和选择器特异性之间。当有些css声明就是设置要低优先级且不受选择器特异性影响那么使用级联层再合适不过。
运用级联层解决第一个日常开发场景痛点的css代码如下:
/* 排序层 */
@layer reset, lib;
/* 通用样式 */
@layer reset {
#app .item {
color: black;
width: 100px;
padding: 1em;
}
}
/* 第三方库样式 */
/*我们将第三方库的样式全部放到lib层*/
/*这里一般使用@import导入的方式*/
/*为了示例简单我们简化了操作*/
@layer lib {
#app .item {
color: green;
border: 5px solid green;
font-size: 1.3em;
width: 130px;
}
}
/* 开发者样式 */
.item {
color: red;
}
为了知道为什么上面的css代码能解决冲突问题,更好地理解级联层的作用,理解一些现象背后的根因,了解级联层和级联的关系,我们继续往下看。
二、理解级联层的前提——级联(cascade)
2.1 什么是级联?
CSS中有两个重要的基础规则,一个是继承,一个是级联。
继承
指的是类似 color,font-family,font-size,line-height 等属性父元素设置后,子元素会继承的特性。
级联
可以简单理解为是CSS 用来解决要应用于元素的具体样式的算法。也就是基于一些优先级排序输出给给定元素上属性值一个级联值。级联值是级联的结果。
2.2 当前级联的排序标准
我们参看Cascading and Inheritance Level 5(13 January 2022) 中6.1节,
相比于Cascading and Inheritance Level 4(14 January 2016) 中的定义有明显变化。
最重要的变化就是增加了级联层。由此级联排序变成:
浏览器在确定最终元素样式呈现的时候,会依据这些准则按照优先权从高到低排序,并且会一个一个的检查,直到确定最终样式。
2.3 级联起源(Cascading Origins)
2.3.1 三个核心起源
css中每个样式规则有三个核心起源,它决定了它进入级联的位置,理解起源优先级是理解级联的关键。
2.3.2 起源的优先级
Css声明的起源取决于它来自哪里,重要性在于它是否用!important声明。
各种起源的优先级按降序排列:
越靠前来源的声明优先级越高。过渡和动画我们可以暂时忽略。
2.4 熟悉又陌生的 !important
通常作为开发者,!important会被我们视为一种增加特异性的方法,用以覆盖内联样式或特异性较高的选择器。
但是!important设计出来的初衷是作为整体级联中的一个特性,来平衡开发者、用户设置和浏览器内置之间对css优先级的影响能力。
默认情况下三者的优先级是:作者来源> 用户来源>用户代理来源(可以参看上文起源优先级中6-8的排序)。但是当css声明添加!important之后会使它们的优先顺序颠倒(参看上文起源优先级中2-4的排序)。
如果站在浏览器和用户的角度看!important提供了在必要时重获优先级控制权的能力,而非只是简单的增加特异性。
举个例子:
浏览器默认样式表包含我们开发者无法覆盖的重要样式。
浏览器对具有'hidden'类型的input输入框设置了默认的展示属性并且将其声明为重要。
input[type=hidden i] { display: none !important; }
看下面两张图例:
第一张可以看出我们对具有'hidden'类型的input输入框的展示属性设置成了显示并且声明为重要
第二张是样式最终计算结果:隐藏
从上面的浏览器表现可以看到我们作为开发者在作者样式表中设置的规则没能覆盖用户代理样式表中的相同规则。
这验证了上面说的:在级联中!important会颠倒三大核心起源默认优先顺序。
验证的过程中还发现了一个chrome控制台这边的bug,看上面的第一张图例:没生效的规则不划删除线,生效的反而划删除线了。
再看一个官方文档的例子加强一下理解:
图片来源:w3.org
font-size的值最终是‘12pt ’。
因为作者样式表中添加!important的规则优先权高于用户样式表中普通规则。
text-indent的值最终是‘1em’。
因为虽然两个样式表都标注了!important,但是标注!important用户声明优先级大于标注!important作者声明。
2.5 一张图带你理解级联
下图可以帮助我们直观的理解级联以及级联层在级联中的位置:
图片来源:css-tricks
我们会发现平时操作最多的选择器特异性(selector specificity)只是级联中的一小部分。也轻松地理解了为什么内联样式优先级天然高。同时我们会发现!important在级联中有特殊地位。他穿插在级联规则的各个阶段并能颠倒优先级。
三、级联层(CSS@layer) 使用探索
3.1 @layer 是什么?
我们来看MDN上的定义:
The @layer CSS at-rule is used to declare a cascade layer and can also be used to define the order of precedence in case of multiple cascade layers.
也就是说 @layer 这个at-rule(AT规则) 用于声明级联层(cascade layer),也能用于定义多个级联层的优先级。
At-rules 是什么?
At-rules是指导 CSS 如何表现的CSS 语句。它们以 at 符号 ' @' ( U+0040 COMMERCIAL AT) 开头,后跟一个标识符,包括下一个分号 ' ;' ( U+003B SEMICOLON) 或下一个CSS 块之前的所有内容。
我们开发常见的at-rule有@charset、@media、@font-face 、@keyframes 等。
3.2 @layer的句法规则
@layer的句法如下:
@layer layer-name {rules}
@layer layer-name;
@layer layer-name, layer-name, layer-name;
@layer {rules}
3.3 如何创建级联层
可以通过多种方式创建级联层。
第一种方法是:创建命名的级联层,其中包含该层的 CSS 规则,如下所示:
@layer green {
.item {
color: green;
border: 5px solid green;
font-size: 1.3em;
padding: 0.5em;
width: 120px;
}
}
@layer special {
.item {
color: rebeccapurple;
}
}
第二种方法是:创建一个命名的级联层而不分配任何样式。这可以是单层,如下所示:
@layer green;
可以一次定义多个层,如下:
@layer green, special
一次定义多个层有什么好处呢?
因为声明层的初始顺序决定了层的优先级。与声明一样,如果在多个层中找到声明,最后定义的层声明将最终生效。看下面代码:
@layer green,special;
@layer green {
#app .item {
color: green;
border: 5px solid green;
font-size: 1.3em;
padding: 0.5em;
width: 120px;
}
}
@layer special {
.item {
color: rebeccapurple;
}
}
效果如下图:
special层中item样式规则将被应用即使它的特异性低于 green层中的规则。这是因为一旦层顺序定义完成,就会忽略选择器特异性。
同样也会忽略出现的顺序:
我们声明层名称并设置它们的顺序后,可以通过重新声明名称来将 CSS 规则添加到图层。然后将样式附加到层,并且层顺序不会更改。比如如下代码虽然@layer green重新声明了并在文件后方但是由于顺序一开始已经设置所以字体颜色还是紫色:
@layer green,special;
@layer special {
.item {
color: rebeccapurple;
}
}
@layer green {
.item {
color: green;
border: 5px solid green;
font-size: 1.3em;
padding: 0.5em;
width: 120px;
}
}
效果如下:
忽略选择器特异性和代码出现顺序可以让我们创建更简单的 CSS 选择器,并使代码优雅,因为不必确保选择器具有足够高的特异性来覆盖其他css规则,只需要确保它出现在后面的层中。
第三种方法是:创建一个没有名称的级联层。例如:
@layer {
.item {
color: black;
}
}
这将创建一个匿名级联层,该层功能与命名层相同。但是使用匿名层有如下缺点:
平时我们尽量避免使用匿名层。但当我们是样式库的作者,并想将某些css代码不被使用者修改可以借助匿名层做到这一点。
第四种方法是:使用@import。CSS 原生支持 @import 导入其他 CSS 文件。
@import url(index.css) layer(index);
同时,也支持匿名引入,例如:
@import url(index.css) layer;
我们在使用@import时候需要放在除@charset之外的样式规则前,否则无法导入。
可能的第五种方式仍在讨论中:通过元素上的属性。请参阅[css-cascade] Provide an attribute for assigning ato a cascade layer #5853。
3.4 层的嵌套规则
图层可以嵌套。例如:
@layer base {
p { max-width: 70ch; }
}
@layer framework {
@layer base {
p { margin-block: 0.75em; }
}
@layer theme {
p { color: #222; }
}
}
生成的层可以表示为一棵树:
1.base
2.theme
或可以用扁平列表表示
要将样式附加到嵌套层,您需要使用以下全名来引用它:
@layer framework {
@layer default {
p { margin-block: 0.75em; }
}
@layer theme {
p { color: #222; }
}
}
@layer framework.theme {
/* 这些样式会被添加到framework层里面的theme层 */
blockquote { color: rebeccapurple; }
}
看效果:
3.5 层的排序规则
级联层按照它们声明的顺序排序。第一层优先级最低,最后一层优先级最高。但是,未分层的样式具有最高优先级:
/* 未分层 */a { color: green; }
@layer layer-1 { a { color: red; } }
@layer layer-2 { a { color: orange; } }
@layer layer-3 { a { color: yellow; } }
优先级顺序如下:
看下图示例:
层可以在一个地方被定义图层(以建立图层顺序),然后在任何地方添加样式
/* 定义在一个地方 */
@layer my-layer;
/* 其他样式*/
...
/* 在某个地方添加样式 */
@layer my-layer { a { color: red; } }
3.6 加上!important之后的排序规则
/* 未分层 */ a { color: green !important; }
@layer layer-1 { a { color: red !important; } }
@layer layer-2 { a { color: orange !important; } }
@layer layer-3 { a { color: yellow !important; } }
任何加上重要声明的样式都以相反的顺序应用
优先级顺序如下:
看下图示例:
这里我们看到对应规则在chrome浏览器的显示是正确的。但是在开发者控制台中的样式一栏规则显示有问题。应该是chrome浏览器开发者控制台的bug。
3.7 嵌套层的排序规则
@layer layer-1 { a { color: red; } }
@layer layer-2 { a { color: orange; } }
@layer layer-3 {
@layer sub-layer-1 { a { color: yellow; } }
@layer sub-layer-2 { a { color: green; } }
/* 未嵌套 */ a { color: blue; }
}
/* 未分层 样式 */ a { color: black; }
优先级顺序如下:
3.8 媒体查询对层排序的影响
以下层顺序将取决于匹配的媒体条件:
例如:
@media (min-width: 600px) {
@layer layout {
.item {
font-size: x-large;
}
}
}
@media (prefers-color-scheme: dark) {
@layer theme {
.item {
color: red;
}
}
}
如果两个媒体查询的规则中匹配一个那么对应的级联层生效。如果两者都匹配,那么图层顺序将为layout, theme都生效。如果两个都不匹配则不定义层。下图是两者都匹配的场景。
四、现在就能使用级联层吗?
4.1 目前浏览器支持程度
图片来源:developer.mozilla.org
目前所有现代浏览器均已经支持 @layer 规则。所有浏览器厂商都支持的特性未来一定比较实用。
4.2 W3C 鼓励可以作为日常使用
SS 的标准化流程由 W3C Cascading Style Sheets Working Group (CSSWG)——W3C层叠样式列表小组以及独立CSS专家组成。W3C 本身并不制定标准,而是作为一个论坛式的平台,接收来自小组成员的提交,并通过会议来商讨制定标准,所有的提交以及讨论都是公开透明的,可以在 W3C 网站上看到会议的记录,可以简单分为4个大阶段:
下图可以帮助理解:
图片来源:w3.org
W3C 通过状态码表示规范的成熟度。成熟度从低到高排序如下图。
图片来源:w3.org
再看下图:包含layer概念的标准讨论已经到达CR阶段。
图片来源:w3.org
W3C 鼓励从 CR阶段的标准 开始可以作为日常使用。
五、总结
最后,我们回到通过级联层如何解决“引入了一个第三方组件库导致样式覆盖“的问题上。
css代码如下:
/* 排序层 */
@layer reset, lib;
/* 通用样式 */
@layer reset {
#app .item {
color: black;
width: 100px;
padding: 1em;
}
}
/* 第三方库样式 */
/*我们将第三方库的样式全部放到lib层,这里一般使用@import导入的方式,为了示例简单我们简化了操作*/
@layer lib {
#app .item {
color: green;
border: 5px solid green;
font-size: 1.3em;
width: 130px;
}
}
/* 开发者样式 */
.item {
color: red;
}
我们将第三方库的样式全部放到lib层,将需要重置的一些样式放到reset层,自己开发的样式不放入层中(当然你也可以放入到一层然后排序在最后)。由此我们实现了样式的分层解决了第三方组件库导致样式覆盖的问题,而且做到开发者样式简单不冗长。
效果如下:
级联层(CSS@layer)已经历概念提出到到浏览器全面支持的阶段。也许在不久的将来大家都会普遍使用它,期望本文能给大家带来一定帮助。
参考资料:
作者:Zhang Jiqi
来源:微信公众号:vivo互联网技术
出处:https://mp.weixin.qq.com/s/4M-RvnTq8rJuKDC3VZOONQ
建网百科全书
通过我们推荐的参考学习书籍你将会学到的职场竞争能力:
通过这些参考学习书籍的学习,我们将会会学习10种语言和工具,包括HTML, HTML5, CSS, CSS3, JavaScript, jQuery, jQueryUI, Bootstrap, Wordpress, PHP, MySQL, etc。 我们可以从零基础开始,建立多个网站实例,其中包括eBay,YouTube,AirPods,Tesla等网页。 我们将历经一场非常有趣,又具有挑战性的旅程,让我们一起从零到专业学习建立属于自己的网站。
下面列出的参考学习书籍可以帮助任何没有程序开发经验的人更轻松地学习与IT相关的语言和工具。
这些学习书籍中有许多实际的例子以及一些比较完整的操作示例,帮助学生在短时间内全面地理解整个学科的知识,同时让新知识应用到实际的操作和工作中。
《学习编码:学习HTML,CSS和JavaScript,并构建网站,应用程序和游戏》
学习编码 - 使用 HTML、CSS 和 JavaScript 构建网站、应用和游戏。
你准备好开始你的程序员之旅了吗?坐下来,把自己绑起来,为美妙的学习体验做好准备。本书将带您完成易于遵循的分步课程,并为您提供编写第一个程序所需的所有指导,制作一个有用的网站,让您快速访问所有您喜欢的在线地方,制作一个测验应用程序,巧妙地适合您的手机,最后制作一个成熟的基于体系的平台游戏。一流!
本书旨在让您能够编写所有内容以在浏览器中运行,并在PC或Mac上本地编程。事实上,根据设计,HTML,CSS和JavaScript可以在任何浏览器中运行,并在几乎任何文本编辑器中编码。
那你还等什么?
你需要什么?
您需要的一切都可以在Windows和Mac上免费获得。 更好的是,您需要的是内置的。
书中的每个练习都为您准备下一个练习,随着您的进步教您新技能。你不需要以前的经验,因为一切都被分解和彻底解释。此外,您可以从支持网站下载所需的所有代码、图像、背景图像、精灵、音效、音乐和任何其他元素。您需要的所有细节在每次练习中都贯穿全书。
最重要的是,如果你想学习编码,这本书将为您提供很棒的工具,让你快速编码!
《学习足够的 HTML、CSS 和布局来变得专业:现代网站创建和模板系统简介》
这本书有您所需要知道的一切,没有您不知道的,开始创建和部署网站;
要设计、构建和部署现代网站,您需要三项核心技能:编写和编辑 HTML 的能力,使用 CSS 控制页面设计的能力,以及创建为用户提供良好服务的高效 Web 布局。但是你不需要学习关于HTML,CSS和网页布局的“一切”,只需要如何有效地使用它们来解决实际问题。在《学习足够的HTML、CSS和布局到专业》一书中,专家开发人员Lee Donahoe和著名讲师Michael Hartl教授完成工作所需的特定概念、技能和方法。
即使您从未创建过网页,作者也会帮助您快速建立技术复杂性并掌握成功所需的知识。专注的练习可以帮助您内化重要的事情,而不会将时间浪费在专业人士不关心的细节上。很快,你就会像生来就知道这些东西一样——你会突然变得非常专业。
通过本书学习了解足够多的信息。 。 。
Michael Hartl的“Learn Enough”系列包括书籍和视频课程,这些课程侧重于每个主题中最重要的部分,因此您不必学习所有内容即可开始 - 您只需要学习足够的知识即可成为专业并自己解决技术问题。
《使用 HTML5 和 CSS 进行响应式网页设计:使用最新的 HTML5 和 CSS 技术构建面向未来的响应式网站,第 4 版》
利用 HTML5 和 CSS 的最新功能,创建可在手机、平板电脑和台式机上完美运行的单一 UI,以及介于两者之间的所有内容 - 现在具有彩色图像!
本书的主要特点
本书的内容简介
《Responsive Web Design with HTML5 and CSS, Fourth Edition》是关于响应式网页设计的最新HTML5和CSS技术的最全面和最畅销的书籍之一的完全改进和扩展版本。它强调实用的应用,教你构建大多数现实生活网站所需的方法,每章都有可下载应用的示例。
本版本书籍以作者友好且易于遵循的风格编写,涵盖了响应式网页设计的所有最新发展和改进,包括更好的可访问性、可变字体和字体加载的方法,以及最新的颜色处理工具进入浏览器。您可以享受前沿功能的覆盖范围,例如 CSS 层、容器查询、嵌套和子网格。
本书最后探讨了作者对前端开发的一些独家技巧和方法。
在本书结束时,您不仅会全面了解响应式网页设计以及最新的HTML5和CSS的可能性,而且还会了解如何最好地实现每种技术。作为完整指南通读,或作为每个主题重点章节的参考。
你将学到什么
这本书是为谁写的
您是需要提高前端技能的全栈或后端开发人员吗?也许您在前端工作,并且需要对所有现代HTML和CSS提供的明确概述?也许你已经做了一些网站建设,但你需要深入了解响应式网页设计以及如何实现它们?那么这就是给你的书!要利用本书,你需要的只是对HTML和CSS的工作理解。不需要JavaScript知识。
本书的目录
《响应式网页设计与HTML 5和CSS》
Minnick的《RESPONSIVE WEB DESIGN WITH HTML 5和CSS,第9版》为您提供最新的工具,逐步教您如何设计专业质量的网站来吸引和留住客户。这本书籍包含专业人士的最佳实践和提示,为您提供了 HTML、CSS 和响应式网页设计的坚实基础。它向您展示如何创建一个自动适应手机、平板电脑、笔记本电脑和台式机设备以及大型显示器的网站。您将学习如何编写网页代码以从移动设备拨打电话、嵌入地图、使用自定义字体、创建快捷导航菜单、集成社交媒体以促进业务等。此外,您将使用流行的Web框架Bootstrap来创建网页。
《学习网页设计 - HTML5:实用手册》
这本电子书是通过练习HTML来学习网页设计的实用指南。
当您完成这本电子书的学习时,您将掌握HTML和网页设计技术!
这是自学材料!
任何有兴趣学习HTML和网页设计的人都可以阅读这本电子书。
快乐学习、快乐编码!
《使用HTML5和CSS3进行网站设计和开发》
结合理论和实践,《HTML5和CSS3的网站设计和开发》既针对想要设计第一个网站的初学者,也针对想要巩固其技术技能的经验丰富的开发人员。
本书讨论了HTML5和CSS3的理论方面,包括:HTML元素,语义容器,语义文本格式,多媒体元素,表单,表格,CSS样式的定义和集成,文本格式以及容器和框样式。本书还包括一个实用部分,介绍了创建网站的过程,以及应用的关键规则,以便不仅实现项目成功,而且满足用户需求。
本书通过大量示例说明,包括更正的实际工作,根据从简单的HTML5页面设计到创建专业网站的进化逻辑进行结构化。
《jQuery食谱:找到所有jQuery问题的现成解决方案》
快速发现常见问题的解决方案、您可以遵循的最佳实践以及 jQuery 提供的所有功能。本书使用问题解决方案,从开发人员在使用jQuery时通常面临的小的初始问题开始,然后逐渐深入探索更复杂的问题。解决方案包括插图和清晰、简洁的代码说明。
您将学习有效地遍历和操作 DOM,了解如何使用数组、迭代、事件模型以及实现动画和视觉效果。您将探索如何使用插件和 CSS。使用本书和jQuery,您的网站将更加动态和生动。这个完全更新的第二版教你现代jQuery技术,包括如何遍历和操作DOM,理解事件模型,实现动画和使用滑动效果。
《jQuery Recipes,第二版》向您展示了如何避免浪费开发时间并解决您可能面临的问题。这是一个宝贵的参考学习书籍,可以在你进行jQuery开发时留在你身边。立即开始使用《 jQuery Rerecies 》这本书,使你成为 jQuery 专业人士。
通过本书你将学到什么
本书适合谁学习:
这本书非常适合希望学习 jQuery 并在开发过程中拥有方便的 jQuery 参考的新手或中级开发人员。
《学习PHP,MySQL和JavaScript:使用jQuery,CSS和HTML5》
使用开源技术和 Web 标准的强大组合构建交互式数据驱动型网站,即使您只有基本的 HTML 知识。通过这个流行的实践指南,您将在当今的核心技术的帮助下处理动态Web编程:PHP,MySQL,JavaScript,CSS,HTML5和现成函数的jQuery库,以显着增强您的项目。
您不仅可以快速了解这些各种技术的最新更新,包括增强的MySQL和PHP安全功能,还可以学习如何优化您的网站以在手机和平板电脑上使用。
分别探索每种技术,学习如何将它们一起使用,并在此过程中学习有价值的 Web 编程实践。在本书的最后,您将把所有内容放在一起,使用AMPPS或任何其他流行的开发堆栈来构建一个适用于桌面和移动浏览器的全功能社交网站。您将深入学习PHP,以及面向对象编程的基础知识。
《Bootstrap 5 指南:使用 Sass 和 JavaScript 自定义和扩展 Bootstrap 5,以创建独特的网站设计》
通过释放 Bootstrap 5 的全部潜力并创建高效的 UI, 使您的网站脱颖而出
Bootstrap 是世界上最受欢迎和易于使用的前端 UI 工具包之一,用于构建响应式网站,但很少有人知道如何充分利用其广泛的组件、实用程序、JavaScript 插件和其他功能。《Missing Bootstrap 5 Guide》 将帮助您使用 Sass 自定义 Bootstrap 5,以实现从人群中脱颖而出的布局,使您能够创建看起来不像是用 Bootstrap 创建的独特内容。
有了这个实用的 Bootstrap 定制指南,使用 Bootstrap 的开发人员将能够利用强大的定制技术来创建具有独特设计和独家功能的网站。您将看到如何通过使用CSS,Sass和JavaScript的高级功能来自定义您的网站,从而快速轻松地开发具有视觉吸引力的网站。从学习如何使用 Sass 创建 Bootstrap 5 视觉样式开始,您将了解如何自定义它以满足您的需求,同时实现您想要的网站外观。然后,您将使用这些知识使用Bootstrap 5的大部分组件以及Sass和JavaScript的自定义来创建网站。最后,您将探索与 Sass、CSS、JavaScript 和源代码优化相关的各种高级 Bootstrap 5 主题。
在本书结束时,您将能够使用 Bootstrap 5 的强大功能自行设计和构建现代、迷人且独特的网站。
通过本书你将学到什么:
这本书是为谁写的:
本书面向熟悉HTML并具有Bootstrap经验的UI设计人员和开发人员。前端和使用Bootstrap的后端开发人员,他们不知道如何编写CSS代码,但对HTML有扎实的掌握,也会发现这本书很有用。有经验的默认引导程序文件用户可以使用本书来了解有关自定义和其他高级功能的所有信息。
本书的目录:
小新 编译自 Insight Data Blog
量子位 出品 | 公众号 QbitAI
写个网页能有多麻烦?在大多数公司里,这项工作分为三步:
1. 产品经理完成用户调研任务后,列出一系列技术要求;
2. 设计师根据这些要求来设计低保真原型,逐渐修改得到高保真原型和UI设计图;
3. 工程师将这些设计图实现为代码,最终变成用户使用的产品。
这么多环节,任何地方出一点问题,都会拉长开发周期。因此,不少公司,比如Airbnb已经开始用机器学习来提高这个过程的效率。
△ Airbnb内部的AI工具,从图纸到代码一步到位
看起来很美好,但Airbnb还没公开该模型中端到端训练的细节,以及手工设计的图像特征对该模型的贡献度。这是该公司特有的闭源解决方案专利,可能不会进行公开。
好在,一个叫Ashwin Kumar的程序员创建了一个开源版本,让开发者/设计师的工作变得更简单。
以下内容翻译自他的博客:
理想上,这个模型可以根据网站设计的简单手绘原型,很快地生成一个可用的HTML网站:
△ SketchCode模型利用手绘线框图来生成HTML网站
事实上,上面例子就是利用训练好的模型在测试集上生成的一个实际网站,代码请访问:https://github.com/ashnkumar/sketch-code。
目前要解决的问题属于一种更广泛的任务,叫做程序综合(program synthesis),即自动生成工作源代码。尽管很多程序综合研究通过自然语言规范或执行追踪法来生成代码,但在当前任务中,我会充分利用源图像,即给出的手绘线框图来展开工作。
在机器学习中有一个十分热门的研究领域,称为图像标注(image caption),目的是构建一种把图像和文本连接在一起的模型,特别是用于生成源图像内容的描述。
△ 图像标注模型生成源图像的文本描述
我从一篇pix2code论文和另一个应用这种方法的相关项目中获得灵感,决定把我的任务按照图像标注方式来实现,把绘制的网站线框图作为输入图像,并将其相应的HTML代码作为其输出内容。
注:上段提到的两个参考项目分别是
pix2code论文:https://arxiv.org/abs/1705.07962
floydhub教程:https://blog.floydhub.com/turning-design-mockups-into-code-with-deep-learning/?source=techstories.org
确定图像标注方法后,理想中使用的训练数据集会包含成千上万对手绘线框图和对应的HTML输出代码。但是,目前还没有我想要的相关数据集,我只好为这个任务来创建数据集。
最开始,我尝试了pix2code论文给出的开源数据集,该数据集由1750张综合生成网站的截图及其相应源代码组成。
△ pix2code数据集中的生成网站图片和源代码
这是一个很好的数据集,有几个有趣的地方:
该数据集中的每个生成网站都包含几个简单的辅助程序元素,如按钮、文本框和DIV对象。尽管这意味着这个模型受限于将这些少数元素作为它的输出内容,但是这些元素可通过选择生成网络来修改和扩展。这种方法应该很容易地推广到更大的元素词汇表。
每个样本的源代码都是由领域专用语言(DSL)的令牌组成,这是该论文作者为该任务所创建的。每个令牌对应于HTML和CSS的一个片段,且加入编译器把DSL转换为运行的HTML代码。
为了修改我的任务数据集,我要让网站图像看起来像手工绘制出的。我尝试使用Python中的OpenCV库和PIL库等工具对每张图像进行修改,包括灰度转换和轮廓检测。
最终,我决定直接修改原始网站的CSS样式表,通过执行以下操作:
1. 更改页面上元素的边框半径来平滑按钮和DIV对象的边缘;
2. 模仿绘制的草图来调整边框的粗细,并添加阴影;
3. 将原有字体更改为类似手写的字体;
最终实现的流程中还增加了一个步骤,通过添加倾斜、移动和旋转来实现图像增强,来模拟实际绘制草图中的变化。
现在,我已经处理好数据集,接下来是构建模型。
我利用了图像标注中使用的模型架构,该架构由三个主要部分组成:
1. 一种使用卷积神经网络(CNN)的计算机视觉模型,从源图像提取图像特征;
2. 一种包含门控单元GRU的语言模型,对源代码令牌序列进行编码;
3. 一个解码器模型,也属于GRU单元,把前两个步骤的输出作为输入,并预测序列中的下一个令牌。
△ 以令牌序列为输入来训练模型
为了训练模型,我将源代码拆分为令牌序列。模型的输入为单个部分序列及它的源图像,其标签是文本中的下一个令牌。该模型使用交叉熵函数作为损失函数,将模型的下个预测令牌与实际的下个令牌进行比较。
在模型从头开始生成代码的过程中,该推理方式稍有不同。图像仍然通过CNN网络进行处理,但文本处理开始时仅采用一个启动序列。在每个步骤中,模型对序列中输出的下个预测令牌将会添加到当前输入序列,并作为新的输入序列送到模型中;重复此操作直到模型的预测令牌为,或该过程达到每个文本中令牌数目的预定义值。
当模型生成一组预测令牌后,编译器就会将DSL令牌转换为HTML代码,这些HTML代码可以在任何浏览器中运行。
我决定使用BLEU分数来评估模型。这是机器翻译任务中常用的一种度量标准,通过在给定相同输入的情况下,衡量机器生成的文本与人类可能产生内容的近似程度。
实际上,BLEU通过比较生成文本和参考文本的N元序列,以创建修改后的准确版本。它非常适用于这个项目,因为它会影响生成HTML代码中的实际元素,以及它们之间的相互关系。
最棒的是,我还可以通过检查生成的网站来比较当前的实际BLEU分数。
△ 观察BLEU分数
当BLEU分数为1.0时,则说明给定源图像后该模型能在正确位置设置合适的元素,而较低的BLEU分数这说明模型预测了错误元素或是把它们放在相对不合适的位置。我们最终模型在评估数据集上的BLEU分数为0.76。
后来,我还想到,由于该模型只生成当前页面的框架,即文本的令牌,因此我可以在编译过程中添加一个定制的CSS层,并立刻得到不同风格的生成网站。
△ 一个手绘图生成多种风格的网页
把风格定制和模型生成两个过程分开,在使用模型时带来了很多好处:
1.如果想要将SketchCode模型应用到自己公司的产品中,前端工程师可以直接使用该模型,只需更改一个CSS文件来匹配该公司的网页设计风格;
2. 该模型内置的可扩展性,即通过单一源图像,模型可以迅速编译出多种不同的预定义风格,因此用户可以设想出多种可能的网站风格,并在浏览器中浏览这些生成网页。
受到图像标注研究的启发,SketchCode模型能够在几秒钟内将手绘网站线框图转换为可用的HTML网站。
但是,该模型还存在一些问题,这也是我接下来可能的工作方向:
1. 由于这个模型只使用了16个元素进行训练,所以它不能预测这些数据以外的令牌。下一步方向可能是使用更多元素来生成更多的网站样本,包括网站图片,下拉菜单和窗体,可参考启动程序组件(https://getbootstrap.com/docs/4.0/components/buttons/)来获得思路;
2. 在实际网站构建中,存在很多变化。创建一个能更好反映这种变化的训练集,是提高生成效果的一种好方法,可以通过获取更多网站的HTML/CSS代码以及内容截图来提高;
3. 手绘图纸也存在很多CSS修改技巧无法捕捉到的变化。解决这个问题的一种好方法是使用生成对抗网络GAN来创建更逼真的绘制网站图像。
代码:https://github.com/ashnkumar/sketch-code
原文:https://blog.insightdatascience.com/automated-front-end-development-using-deep-learning-3169dd086e82
— 完 —
诚挚招聘
量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复“招聘”两个字。
量子位 QbitAI · 头条号签约作者
վ'ᴗ' ի 追踪AI技术和产品新动态
*请认真填写需求信息,我们会在24小时内与您取得联系。