整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

用HTML写出绽放的烟花

下是一个使用HTML和CSS实现绽放的烟花的示例代码:

```html

<!DOCTYPE html>

<html>

<head>

<title>绽放的烟花</title>

<style>

.firework {

position: relative;

width: 100px;

height: 100px;

background-color: #ff0000;

border-radius: 50%;

animation: explode 1s ease-in-out infinite;

}

@keyframes explode {

0% {

transform: scale(1);

opacity: 1;

}

50% {

transform: scale(1.5);

opacity: 0.5;

}

100% {

transform: scale(1);

opacity: 1;

}

}

</style>

</head>

<body>

<div class="firework"></div>

</body>

</html>

```

这段代码创建了一个`div`元素,并将其样式设置为一个圆形的红色烟花。使用CSS的动画效果,通过`@keyframes`定义了一个名为`explode`的动画,使烟花在1秒钟内以缩放的方式产生绽放效果。动画会无限循环播放,直到页面关闭。

你可以将上述代码保存为一个HTML文件,并在浏览器中打开,就能看到绽放的烟花效果了。希望你喜欢!

端训练营:1v1私教,终身辅导计划,帮你拿到满意的 offer 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~

Hello,大家好,我是 Sunday。

说起 HTML 很多同学都会认为,这不就是小菜一碟吗?这玩意有啥难度?你也太瞧不起我了吧!

不过看似越简单的东西,我们越会忽略,同时它们还可以提供出令人惊艳的效果!


01:使用 Popover 属性构建可访问的原生弹出框元素

过去,我们经常使用本机浏览器窗口作为弹出框元素来显示顶层内容(例如:常见的 dialog)。

可是这些默认的弹窗并不友好。所以后来,我们使用外部库(Element、AntD 等)构建了页面内的、经过CSS样式化的弹出框,以好看的UI方式方式显示此类内容。

不过现在,你可以使用纯HTML创建弹出框,而无需编写任何JavaScript代码。现代Web标准通过Popover API提供了内置的弹出框支持

看下面的源代码:

<style>
  div[popover]::backdrop {
    background-color: rgba(0, 0, 0, 0.4);
  }
  
  div[popover] {
    padding: 12px;
    border: none;
  }
</style>

<div id="pop" popover>
  我是弹出的内容
</div>

<button popovertarget="pop">展示 popover</button>

上述HTML使用了 popover 属性来实现一个简单的弹出框元素。

它使用 popovertarget 属性来在不使用JavaScript的情况下显示弹出框元素。此外,我们使用了 ::backdrop 伪元素来样式化弹出框的背景:

你可以使用 @starting-style 为原生弹出框添加动画,正如 MDN 文档(https://developer.mozilla.org/en-US/docs/Web/CSS/@starting-style)中所解释的那样。

02:在对话框和页面中使用 autofocus 属性

HTML标准提供了 autofocus 属性,用于在页面加载和对话框/弹出框显示状态下自动聚焦表单元素。

看下面的示例模态框,它在第一个输入已经预填充的情况下自动将焦点设置到第二个文本输入框上:

<dialog id="dlg">
  <form method="dialog">
    <input type="text" placeholder="Firstname" value="张" />
    <div style="height: 8px"></div>
    <input type="text" placeholder="Lastname" autofocus />
    <div style="height: 8px"></div>
    <button>保存</button>
  </form>
</dialog>
<button onclick="document.getElementById('dlg').showModal()" autofocus>点我</button>

上面的HTML在两个地方使用了 autofocus 属性:

  1. 在显示模态框的按钮元素中,在页面加载事件后聚焦它。
  2. 在第二个文本输入框中,自动将焦点设置到它,因为第一个文本输入框已经预填充。

此外,我们还使用了 method="dialog" 属性来设置关闭对话框而无需使用JavaScript代码。

03:使用 pattern 属性在文本输入框中进行原生验证

表单校验是日常开发的常见需求。不过当我们脱离了 Element、AntD 这些组件库之后,你还知道如何实现表单校验吗?

其实对于 HTML的 input 元素来说,它是有 pattern 属性的

假设我们需要验证一个产品标识符,它包含两个英文字母和六个数字,用连字符连接,即 GR-100200。

以下HTML片段实现了上述要求的验证功能的文本输入框:

<form>
  <label for="productID"> ID:</label>
  <input type="text" id="productID" name="productID" pattern="[A-Za-z]{2}-\d{6}" title="Please enter a valid product identifier (e.g., GR-100200)" required>
  <button type="submit">Submit</button>
</form>

在上面的示例中,我们使用 pattern 属性设置了一个正则表达式,用于验证产品标识符。此正则表达式要求两个英文字母(不区分大小写)后跟一个连字符,然后是六个数字。另外,我们还添加了 title 属性,以提供关于输入格式的说明。最后,我们将 required 属性添加到输入元素上,以确保用户输入有效的产品标识符。

这里,pattern 属性通过显示浏览器特定的验证消息来阻止表单提交无效输入。但是他必须要在点击了 提交 按钮之后才可以进行校验。

如果我们想要进行实时校验(根据输入内容实时校验)怎么办呢?

04:使用 :valid 和 :invalid CSS 伪类来实现 pattern 的实时验证

我们可以使用 :valid:invalid CSS 伪类来实现 pattern 的实时验证,如下所示的 HTML 代码片段所示:

<style>
  input[type=text] {
    border: #000 1px solid;
    border-radius: 4px;
    outline: none;
    padding: 6px;
  }

  input[type=text]:invalid {
    border: red 1px solid;

    +span::before {
      content: '✖';
      display: inline;
      color: red;
    }
  }

  input[type=text]:valid {
    border: green 1px solid;

    +span::before {
      content: '✓';
      display: inline;
      color: green;
    }
  }
</style>

<input type="text" placeholder="i.e., GR-100200" pattern="[A-Z]{2}-[0-9]{6}" required />
<span></span>

上面的HTML片段使用CSS代码根据验证状态设置样式。无效输入会将输入框边框设置为红色,并显示红色的叉号。与此同时,有效输入会呈现绿色边框和绿色的勾号符号:

05:处理移动虚拟键盘模式的 inputmode 属性

手机通过虚拟键盘进行输入,这个键盘有几种模式。

例如,它可能仅显示数字键用于数字输入元素,对于一般的字符串输入则显示完整的键盘界面。移动浏览器会根据输入类型自动更改虚拟键盘模式,但开发人员也可以使用 input 元素的 inputmode 属性进行自定义。

<input type="text" pattern="[0-9]{6}" inputmode="numeric" maxlength="6">

在上面的示例中,我们使用了 inputmode 属性来指定虚拟键盘的模式为 numeric,以便在移动设备上只显示数字键盘。同时,我们还使用了 pattern 属性来限制输入只能是六位数字。maxlength 属性限制输入的最大长度为六位。

06:使用 loading 属性实现浏览器级别的图片懒加载

图片懒加载是日常开发中的常见需求。我们在实现懒加载时大多数会使用一些现成的库或者基于 Intersection Observer API 进行处理

不过很多同学不知道的是:img 标签的 loading 属性可以让你在不编写JavaScript代码或使用第三方库的情况下启用浏览器级别的图片懒加载。

看下面的源代码:

<div style="height: 2000px"></div>

<img src="https://gips3.baidu.com/it/u=45328832,131546734&fm=3039&app=3039&f=JPEG?w=1024&h=1024
" loading="lazy" />

以这种方式实现图片懒加载的功能,当页面往下滚动的时候,图片动态加载:

. 对 HTML 语义化的理解

语义化是指根据内容的结构化(内容语义化),选择合适的标签(代 码语义化)。通俗来讲就是用正确的标签做正确的事情。

语义化的优点如下:

对机器友好,带有语义的文字表现力丰富,更适合搜索引擎的爬虫爬 取有效信息,有利于 SEO。除此之外,语义类还支持读屏软件,根据 文章可以自动生成目录;

对开发者友好,使用语义类标签增强了可读性,结构更加清晰,开发 者能清晰地看出网页的结构,便于团队的开发与维护。

常见的语义化标签:

2. DOCTYPE(⽂档类型) 的作⽤

DOCTYPE 是 HTML5 中一种标准通用标记语言的文档类型声明,它的目 的是告诉浏览器(解析器)应该以什么样(html 或 xhtml)的文档类 行定义来解析文档,不同的渲染模式会影响浏览器对 CSS 代码甚⾄JavaScript 脚本的解析。它必须声明在 HTML⽂档的第⼀⾏。

浏览器渲染页面的两种模式(可通过 document.compatMode 获取,比 如,语雀官网的文档类型是 CSS1Compat):

CSS1Compat:标准模式(Strick mode),默认模式,浏览器使用 W3C 的标准解析渲染页面。在标准模式中,浏览器以其支持的最高标准呈 现页面。

BackCompat:怪异模式(混杂模式)(Quick mode),浏览器使用自己的 怪异模式解析渲染页面。在怪异模式中,页面以一种比较宽松的向后 兼容的方式显示。

3. script 标签中 defer 和 async 的区别

如果没有 defer 或 async 属性,浏览器会立即加载并执行相应的脚本。它不会等待后续加载的文档元素,读取到就会开始加载和执行,这样 就阻塞了后续文档的加载。

下图可以直观地看出三者之间的区别:

其中蓝色代表 js 脚本网络加载时间,红色代表 js 脚本执行时间,绿 色代表 html 解析。

defer 和 async 属性都是去异步加载外部的 JS 脚本文件,它们都不 会阻塞页面的解析,其区别如下:

执行顺序:多个带 async 属性的标签,不能保证加载的顺序;多个带 defer 属性的标签,按照加载顺序执行;

脚本是否并行执行:async 属性,表示后续文档的加载和执行与 js 脚本的加载和执行是并行进行的,即异步执行;defer 属性,加载后 续文档的过程和 js 脚本的加载(此时仅加载不执行)是并行进行的(异步),js 脚本需要等到文档所有元素解析完成之后才执行,DOMContentLoaded 事件触发执行之前。

4. 行内元素有哪些?块级元素有哪些? 空(void)元素有那 些?

行内元素有:a b span img input select strong;

块级元素有:div ul ol li dl dt dd h1 h2 h3 h4 h5 h6 p;

空元素,即没有内容的 HTML 元素。空元素是在开始标签中关闭的,也就是空元素没有闭合标签:

常见的有:<br>、<hr>、<img>、<input>、<link>、<meta>;

鲜见的有:<area>、<base>、<col>、<colgroup>、<command>、<embed>、<keygen>、<param>、<source>、<track>、<wbr>。

5. 浏览器是如何对 HTML5 的离线储存资源进行管理和加载?

在线的情况下,浏览器发现 html 头部有 manifest 属性,它会请求 manifest 文件,如果是第一次访问页面 ,那么浏览器就会根据 manifest 文件的内容下载相应的资源并且进行离线存储。如果已经 访问过页面并且资源已经进行离线存储了,那么浏览器就会使用离线 的资源加载页面,然后浏览器会对比新的 manifest 文件与旧的 manifest 文件,如果文件没有发生改变,就不做任何操作,如果文 件改变了,就会重新下载文件中的资源并进行离线存储。

离线的情况下,浏览器会直接使用离线存储的资源。

6. Canvas 和 SVG 的区别

(1)SVG:

SVG 可缩放矢量图形(Scalable Vector Graphics)是基于可扩展标 记语言 XML 描述的 2D 图形的语言,SVG 基于 XML 就意味着 SVG DOM 中的每个元素都是可用的,可以为某个元素附加 Javascript 事件处 理器。在 SVG 中,每个被绘制的图形均被视为对象。如果 SVG 对象 的属性发生变化,那么浏览器能够自动重现图形。

其特点如下:

不依赖分辨率

支持事件处理器

最适合带有大型渲染区域的应用程序(比如谷歌地图)

复杂度高会减慢渲染速度(任何过度使用 DOM 的应用都不快)不适合游戏应用

(2)Canvas:

Canvas 是画布,通过 Javascript 来绘制 2D 图形,是逐像素进行渲 染的。其位置发生改变,就会重新进行绘制。

其特点如下:

依赖分辨率

不支持事件处理器

弱的文本渲染能力

能够以 .png 或 .jpg 格式保存结果图像

最适合图像密集型的游戏,其中的许多对象会被频繁重绘

注:矢量图,也称为面向对象的图像或绘图图像,在数学上定义为一 系列由线连接的点。矢量文件中的图形元素称为对象。每个对象都是

一个自成一体的实体,它具有颜色、形状、轮廓、大小和屏幕位置等 属性。

7. 说一下 HTML5 drag API

dragstart:事件主体是被拖放元素,在开始拖放被拖放元素时触发。

darg:事件主体是被拖放元素,在正在拖放被拖放元素时触发。dragenter:事件主体是目标元素,在被拖放元素进入某元素时触发。dragover:事件主体是目标元素,在被拖放在某元素内移动时触发。dragleave:事件主体是目标元素,在被拖放元素移出目标元素是触 发。

drop:事件主体是目标元素,在目标元素完全接受被拖放元素时触发。

dragend:事件主体是被拖放元素,在整个拖放操作结束时触发。