前端小白的学习之路(HTML5 一)

提示:一些HTML5新增的标签:语义化标签,<img>,<video>,<audio>

目录

一、HTML5简介

二、语义化标签

1)新增语义化标签

2)示例

三、多媒体标签

1)图片标签

图片加载问题

1.当图片路径预设好时可以直接获取图片的信息

2.当在JS中设置图片时会因为图片还未加载而无法获取到图片

3.FileReader 对象   

         2)视频标签

1.属性

2.使用案例

3)音频标签 

1.属性

2.使用示例


一、HTML5简介

HTML5 是 HTML 的第五个主要版本,是用于构建网页和网页应用程序的标准。它是 Web 技术的一部分,旨在改善和增强现有的 HTML、CSS 和 JavaScript 技术,以满足当今 Web 应用程序的需求。

HTML5 的一些主要特性和改进包括:

  1. 语义化标记:引入了更多的语义化元素(如<header><footer><nav>等),使得开发者可以更好地描述网页内容的结构和意义,有利于搜索引擎优化(SEO)和可访问性。

  2. 多媒体支持:引入了 <video><audio> 标签,使得在网页上嵌入和控制视频和音频变得更加简单。同时,增强了对 Canvas 和 SVG 的支持,使得开发者可以使用这些技术绘制复杂的图形和动画。

  3. 表单增强:引入了新的表单控件和属性,如<input type="date"><input type="email"><input type="number">等,使得表单的构建和验证更加简单和可靠。

  4. 本地存储:引入了 Web 存储 API,使得网页应用程序可以在客户端存储数据,而不需要依赖于服务器。

  5. Web Workers 和 WebSocket:引入了 Web Workers API,使得网页应用程序可以在后台执行多线程任务,从而提高了性能。另外,引入了 WebSocket API,使得网页应用程序可以实现实时双向通信,例如实时聊天和在线游戏。

  6. 响应式设计:HTML5 促进了响应式 Web 设计的发展,使得网页可以在不同的设备和屏幕尺寸上提供一致的用户体验

      7. HTML5 仍处于完善之中

二、语义化标签

HTML5语义化标签指的是HTML5中新增的一些具有特定含义的标签,这些标签能够更清晰地描述文档的结构和内容,使得网页的结构对机器和开发者更加友好,也更有利于搜索引擎优化和可访问性。

1)新增语义化标签

  1. <header>:用于定义文档或节的页眉,通常包含导航、logo 或标题等内容。

  2. <footer>:用于定义文档或节的页脚,通常包含版权信息、联系方式等内容。

  3. <nav>:用于定义导航链接的区域,通常包含页面的主要导航链接。

  4. <article>:用于表示一个独立的、完整的文章或内容块。

  5. <section>:用于定义文档中的节或区域,通常表示一个主题或相关内容的集合。

  6. <aside>:用于表示与页面内容相关但不是主要内容的部分,通常包含侧边栏、广告等内容。

  7. <main>:用于表示文档的主要内容区域,通常包含页面的核心内容。

  8. <figure><figcaption>:用于表示图像、图表、视频等媒体内容及其标题或说明

2)示例

<!DOCTYPE html>
<html lang="zh-cn"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>基本模板</title><link rel="stylesheet" href="bootstrap/css/bootstrap.min.css"><style>.header {height: 100px;}.nav {height: 40px;}.main {height: 600px;}.main .aside {height: 600px;}.main .article {height: 600px;}.footer {height: 100px;}</style>
</head><body><!-- 这种div搭建的结构不是语义化结构 --><div class="header"></div><div class="nav"></div><div class="main"><div class="aside"></div><div class="artice"></div></div><div class="footer"></div><!-- 以下就是语义化标签 --><header class="header bg-primary container"></header><nav class="nav bg-warning container"></nav><main class="main bg-info container"><aside class="aside bg-success w-25 float-left"></aside><article class="article bg-danger w-75 float-right"></article></main><footer class="footer bg-secondary container"></footer></body></html>

代码如下(示例):

data = pd.read_csv('https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

三、多媒体标签

1)图片标签<img>

图片加载问题

1.当图片路径预设好时可以直接获取图片的信息
<!DOCTYPE html>
<html lang="zh-cn"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>基本模板</title><link rel="stylesheet" href="./bootstrap/css/bootstrap.min.css">
</head><body><style>input {display: block;}img {width: 260px;}</style><img src="./images/one1.jpg" alt=""> <script>// 获取图片标签var img = document.querySelector("img")console.log(img.width);//260console.log(img.height);//325</script>
</body></html>
2.当在JS中设置图片时会因为图片还未加载而无法获取到图片
<!DOCTYPE html>
<html lang="zh-cn"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>基本模板</title><link rel="stylesheet" href="./bootstrap/css/bootstrap.min.css">
</head><body><style>input {display: block;}img {width: 260px;}</style><img src="" alt=""><script>// 创建一个图片var img = new Image();// 请求图片资源img.src = "./images/one1.jpg";console.log(img.width);// 0console.log(img.height);// 0// 加载图片img.onload = function () {console.log(img.width);// 256console.log(img.height);// 320}</script>
</body></html>
3.FileReader 对象

FileReader 对象是 JavaScript 中的一个内置对象,用于读取文件内容。它通常与文件输入元素 <input type="file"> 结合使用,允许用户选择本地文件,并在客户端对文件内容进行读取和处理

使用FileReader对象做一个图片预加载功能,可以实现异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容 。

代码:

<!DOCTYPE html>
<html lang="zh-cn"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>基本模板</title><link rel="stylesheet" href="./bootstrap/css/bootstrap.min.css">
</head><body><style>input {display: block;}img {width: 260px;}</style><input type="file"><img src="" alt=""><script>// 做图片预览var img = document.querySelector("img");// 选择文件的input标签var input = document.querySelector("input[type=file]");// 监听input标签的值变化 (选择文件、点击确定)input.addEventListener("change",function(){//获取图片信息var photo = input.files[0];//判断是否为图片//console.log(photo.name);// 图片名称,后缀名//判断图片大小//   console.log(photo.size);// 图片尺寸 (字节)//var v = photo.size / 1024;// 千字节//console.log(v);// 创建读取文件的实例var reader = new FileReader();// 监听文件加载reader.onload = function(){//获取转成字符串的图片信息//console.log(reader.result);// 渲染图片img.src = reader.result;}// 判断是否存在图片信息if(photo){// 把文件转字符串信息reader.readAsDataURL(photo);}})</script>
</body></html>

FileReader 对象的文档地址:https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader

2)视频标签<video>

1.属性

1.controls属性:使视频可以控制,如播放,暂停,下载等

2.muted属性:使视频默认静音

3.autoplay属性:使视频自动播放,前提是视频处于静音状态muted(媒体参与度高的情况下也可以有声音自动播放)

4.loop属性:循环播放

5.poster属性:视频封面,视频初始暂停状态时显示的图片,视频不能自动播放autoplay

6.preload属性:视频预加载模式,auto:浏览器自动加载;none:不进行任何的预加载;metadate:加载视频的基本信息,如视频时长;使用autoplay则忽略该属性

2.使用案例

<!DOCTYPE html>
<html lang="zh-cn"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>基本模板</title><link rel="stylesheet" href="./bootstrap/css/bootstrap.min.css">
</head>
<style>ul,ol {list-style: none;}.container {max-width: 900px;}.progress {width: 700px;border-radius: 20px;}.video {width: 100%;height: auto;display: block;}.btn {height: 24px;width: 24px;border-radius: 50%;}.zanting {content: "";display: block;width: 24px;height: 24px;background: url(./images/bofang.png) no-repeat center;background-size: cover;}.bofang {content: "";display: inline-block;width: 24px;height: 24px;background: url(./images/zanting.png) no-repeat center;background-size: cover;}.ji-list {width: 100%;padding-left: 0;}.ji-list li {width: 100px;background-color: #ddd;text-align: center;cursor: pointer;}.ji-list li.active {background-color: skyblue;}.ji-list li:nth-child(n+2) {margin-left: 10px;}
</style><body><div class="container"><!--视频标签--><video class="video" src="./video/ys.mp4" muted preload="metadata"></video></div><div class="container mt-3 d-flex justify-content-between align-items-center contral"><div class="time d-flex align-items-center"><div class="alert-one" role="alert">00:00:00</div><div class="ml-1"> / </div><div class="alert-two ml-1" role="alert">00:00:00</div></div><div class="progress"><div class="progress-bar progress-bar-striped bg-success" role="progressbar" style="width: 0%"aria-valuenow="25" aria-valuemin="0" aria-valuemax="100"></div></div><button class="btn zanting"></button></div><div class="container mt-3"><ul class="ji-list d-flex flex-wrap"><!-- <li>第一集</li><li>第二集</li> --></ul></div><script src="../jQuery/libs/jQuery/jQuery.min.js"></script><script>//获取dom对象var btn = document.querySelector('.btn');var video = document.querySelector(".video");var progress = document.querySelector(".progress");var progress_bar = document.querySelector(".progress-bar");var time_box_c = document.querySelector(".alert-one");var time_box_d = document.querySelector(".alert-two");var ji_list = document.querySelector('.ji-list');var arr = [{'第一集': "./video/ys.mp4" //视频路径}, {'第二集': "./video/xqtd.mp4"}, {'第三集': "./video/dlam.mp4"}];//渲染函数function template() {for (var index in arr) {for (var key in arr[index]) {var newLi = document.createElement('LI');newLi.innerHTML = key;if (index == 0) {newLi.classList.add('active')}ji_list.append(newLi);}}}template()//自动播放函数function videoPlay(txxt) {for (var index in arr) {for (var key in arr[index]) {if (key == txxt) {video.src = arr[index][key];$('.ji-list li').removeClass('active');// console.log($('.ji-list li')[index]);$('.ji-list li')[index].classList.add('active');}}}btn.classList.remove('zanting');btn.classList.add('bofang');video.play();}var d = 0;var c = 0;//按钮点击事件btn.onclick = function () {if (video.paused) {btn.classList.remove('zanting');btn.classList.add('bofang');video.play();} else {btn.classList.remove('bofang');btn.classList.add('zanting');video.pause();}}//视频准备播放事件video.oncanplay = function () {d = video.duration;time_box_d.innerText = formatime(d);}//视频播放事件video.ontimeupdate = function () {c = video.currentTime;var demo = c / d * 100;progress_bar.style.width = `${demo}%`;time_box_c.innerText = formatime(c);}//视频结束事件video.onended = function () {// 下一首歌var txt = $('.ji-list').find('.active').next().text();if (txt == null) {videoPlay('第一集');} else {videoPlay(txt);}}//去除进度条默认样式progress_bar.style.transition = "none";var x = 0;var bili = 0;var v = 0;//拉动进度条事件var setProgress = function (e) {x = e.pageX - progress.offsetLeft;v = (x / progress.offsetWidth);bili = v * 100;progress_bar.style.width = bili + "%";c = v * d;video.currentTime = c;time_box_c.innerText = formatime(c);}progress.onmousedown = function (event) {setProgress(event);document.onmousemove = function (e) {setProgress(e);}}document.onmouseup = function () {document.onmousemove = null;}//渲染时间函数function formatime(time) {var h, m, s;h = Math.floor(time / 3600);m = Math.floor(time % 3600 / 60);s = Math.floor(time % 60);h = h < 10 ? '0' + h : h;m = m < 10 ? '0' + m : m;s = s < 10 ? '0' + s : s;return `${h}:${m}:${s}`;}//选集按钮点击事件 的$('.ji-list li').on('click', function () {// $('.ji-list li').removeClass('active');// $(this).addClass('active')var txt = $(this).text();videoPlay(txt);})</script>
</body></html>

3)音频标签<rudio> 

1.属性

1.controls属性:使音频可以控制,如播放,暂停,下载等

2.muted属性:使音频默认静音

3.autoplay属性:媒体参与度(一段事件内点击媒体的次数)高的情况下可以自动播放(一般不用)

4.loop属性:循环播放

5.preload属性:音频预加载模式,auto:浏览器自动加载;none:不进行任何的预加载;metadate:加载音频的基本信息,如音频时长

2.使用示例

<!DOCTYPE html>
<html lang="zh-cn"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>基本模板</title><link rel="stylesheet" href="./bootstrap/css/bootstrap.min.css">
</head><body><!-- <audio src="./music/163.m4a" controls></audio> --><!-- <audio class="audio" src="./music/yishujiamen.mp3" controls></audio> --><style>.audio {width: 0;height: 0;opacity: 0;}</style><div class="container"><audio class="audio" src="./music/163.m4a" controls></audio><button class="btn btn-success">点击播放</button><button class="btn btn-danger">暂停</button></div><div class="container mt-3"><!-- 进度条 --><div class="progress"><div class="progress-bar progress-bar-striped bg-success" role="progressbar" style="width: 0%"aria-valuenow="25" aria-valuemin="0" aria-valuemax="100"></div></div><!-- 警告框 --><div class="alert alert-danger mt-3" role="alert">00:00:00</div><div class="alert alert-primary" role="alert">00:00:00</div></div><script>var btnPlay = document.querySelector(".btn-success");var btnPause = document.querySelector(".btn-danger");var audio = document.querySelector(".audio");var progress = document.querySelector(".progress");var progress_bar = document.querySelector(".progress-bar");var time_box_c = document.querySelector(".alert-danger");var time_box_d = document.querySelector(".alert-primary");// 定义数组记录歌曲var index = 0;var arr = ["./music/163.m4a","./music/yishujiamen.mp3"]// 记录播放总时长var d = 0;// 记录当前播放时长var c = 0;// 观察音频标签对象// console.dir(audio);// 做交互// 点击按钮btnPlay.onclick = function () {// 播放音频audio.play();}btnPause.onclick = function () {// 暂停音频audio.pause();}// 监听音频文件是否可以播放事件audio.oncanplay = function () {// 获取音频总时长d = audio.duration;// console.log({ d })// 渲染总时长time_box_d.innerText = formatime(d);}// 监听音频文件当前播放更新的时长audio.ontimeupdate = function () {// 获取当前播放的时长c = audio.currentTime;// console.log({ c });// 计算比例var demo = c / d * 100;// 设置进度条的宽度progress_bar.style.width = `${demo}%`;// 渲染当前播放时长time_box_c.innerText = formatime(c);}// 监听音频播放结束事件audio.onended = function () {// 索引值自增index ++;index = index > arr.length - 1 ? 0: index;console.log("播放结束");// 下一首歌audio.src = arr[index];audio.play();}// 移除进度条标签的过渡属性progress_bar.style.transition = "none";var x = 0;var bili = 0;var v = 0;var setProgress = function (e) {// 鼠标移动的距离x = e.pageX - progress.offsetLeft;// 计算x占整个进度条宽度的值v = (x / progress.offsetWidth);// 计算比例bili = v * 100;// console.log(bili + "%")// 设置进度宽度progress_bar.style.width = bili + "%";// 设置音频当前的时长c = v * d;console.log({ c });audio.currentTime = c;// 渲染当前播放时长time_box_c.innerText = formatime(c);}// 滑动效果progress.onmousedown = function (event) {// 鼠标按下进度条setProgress(event);document.onmousemove = function (e) {// 鼠标在页面移动setProgress(e);}}document.onmouseup = function () {document.onmousemove = null;}// 格式化时间function formatime(time) {// 记录时分秒var h, m, s;// 计算h = Math.floor(time / 3600);m = Math.floor(time % 3600 / 60);s = Math.floor(time % 60);// 补个0h = h < 10 ? '0' + h : h;m = m < 10 ? '0' + m : m;s = s < 10 ? '0' + s : s;// 返回值return `${h}:${m}:${s}`;}</script>
</body></html>

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

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

相关文章

【SQL】1193. 每月交易 I 【年月日(日期)拼接相关函数】

前述 知识点学习&#xff1a; SQL 日期函数 day() 、month()、year() 各种使用方法mysql 两个字符年月拼接 题目描述 leetcode题目&#xff1a;1193. 每月交易 I 思路 先按照年月排&#xff0c;再按照country排列 日期拼接相关的函数 year(): 截取年份&#xff1b;month…

Java设计模式 | 设计模式概述和分类

独孤求败五重境界 利剑&#xff08;“凌厉刚猛&#xff0c;无坚不摧&#xff0c;弱冠前以之与河朔群雄争锋。”&#xff09;软剑&#xff08;“紫薇软剑&#xff0c;三十岁前所用&#xff0c;误伤义士不祥&#xff0c;乃弃之深谷。”&#xff09;重剑&#xff08;“重剑无锋&a…

宜搭faas服务器获取accessToken

可以用faas服务器的OpenAPIUtil.getCustomAccessTokenThenCache&#xff08;Client ID,Client Secret&#xff09;就可以获取 至于获取这个Client ID&#xff0c;Client Secret 就需要在钉钉开放平台创建一个应用 然后在这个应用的基础信息里面有 注意的是&#xff1a;如果需要…

「SpringBrick快速入门指南」:一款基于Spring Boot的高级插件化开发框架

文章目录 关于 | About技术文档 | Document开源项目 | Project 案例 | Demo项目结构 | Structure主程序配置集成 | Settings引入框架依赖 | Framework在配置文件加入配置 | YamlSpringBoot启动类改引导类 | Change 插件配置集成 | Settings引入依赖 | XML定义插件引导类 | Clas…

Java并发编程—JUC线程池架构

Java并发编程&#xff08;JUC&#xff0c;Java Utilities Concurrency&#xff09;中的线程池架构是Java提供的一种用于管理和复用线程的机制。线程池的主要目标是减少线程创建和销毁的开销&#xff0c;提高系统的响应速度&#xff0c;并通过合理的线程管理和资源分配&#xff…

JUnit 面试题及答案整理,最新面试题

JUnit中的断言&#xff08;Assert&#xff09;有哪些类型&#xff1f; JUnit提供了多种断言类型来帮助测试代码的正确性。常见的断言类型包括&#xff1a; 1、assertEquals&#xff1a; 用于检查两个值是否相等。如果不相等&#xff0c;测试失败。 2、assertTrue和assertFal…

数据结构的概念大合集05(串)

概念大合集05 1、串的相关定义2、串的基本运算3、串的顺序存储结构3.1 顺序串 4、串的链式存储结构4.1 链串 1、串的相关定义 串是有零个户多个字符组成的有限序列&#xff0c;比如字符串。用 “ ” 或 ‘ ’ 来表示串。两个串相等&#xff1a;当且仅当这两个串的长度相等并且…

sqllab第二十五A关通关笔记

知识点&#xff1a; 数值型注入双写绕过 oorranand这里不能用错误注入&#xff08;固定错误回显信息&#xff09;联合注入 测试发现跟25关好像一样&#xff0c;就是过滤了and or # 等东西 构造payload:id1/0 发现成功运算了&#xff0c;这是一个数值型的注入 构造payload:id…

高效使用 JMeter 生成随机数:探索 Random 和 UUID 算法

在压力测试中&#xff0c;经常需要生成随机值来模拟用户行为。JMeter 提供了多种方式来生成随机值&#xff0c;本文来具体介绍一下。 随机数函数 JMeter 提供了多个用于生成随机数的函数&#xff0c;其中最常用的是__Random函数。该函数可以生成一个指定范围内的随机整数或浮…

薄膜电容的工作原理,结构特点,工艺流程,选型参数及设计注意事项总结

🏡《总目录》 目录 1,概述2,工作原理3,结构特点4,工艺流程4.1,材料准备4.2,介质薄膜处理4.3,电极制作4.4,卷绕或堆叠4.5,焊接与引出线制作4.6,封装与保护4.7,测试与筛选4.8,老化与稳定性测试4.9,最终测试与标记

瑞_Redis_短信登录(二)

文章目录 项目介绍1.1 项目准备1.2 基于Session实现登录流程1.2.1 发送短信验证码1.2.2 短信验证码登录、注册1.2.3 校验登录状态 1.3 实现发送短信验证码功能1.3.1 页面流程1.3.2 代码实现 1.41.51.6 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《Redis》的实战篇的…

Android init.rc 解析

init.rc 文件是 Android 系统中非常重要的一部分&#xff0c;它定义了系统在启动过程中的行为和服务的初始化顺序。在 RK3566 Android 11 的环境中&#xff0c;init.rc 文件的结构和语法与其他 Android 版本大致相同。下面我将逐句解释 init.rc 文件中的典型内容&#xff1a; …

lua脚本的基础内容

官方地址&#xff1a;http://luajit.org/ 官方wiki地址&#xff1a;http://wiki.luajit.org/Home 推荐书籍&#xff1a; OpenResty 最佳实践&#xff1a;https://moonbingbing.gitbooks.io/openresty-best-practices/content/ lua基础文档&#xff1a;https://www.runoob.com/l…

深入理解生成型大型语言模型:自监督预训练、细调与对齐过程及其应用

分析概述 本文主要介绍了生成型大型语言模型&#xff08;LLM&#xff09;的预训练过程&#xff0c;特别是通过下一个令牌&#xff08;token&#xff09;预测的自监督学习方法&#xff0c;以及后续的细调&#xff08;finetuning&#xff09;和对齐&#xff08;alignment&#x…

【网络】负载均衡

OSI模型每一层的负载均衡 在OSI模型中&#xff0c;每一层的负载均衡具体如下&#xff1a; 1. 第二层&#xff08;数据链路层&#xff09;&#xff1a;数据链路层的负载均衡通常涉及对MAC地址的操作。在这一层&#xff0c;可以使用虚拟MAC地址技术&#xff0c;外部设备对虚拟MA…

【SQL Server】实验七 数据完整性

1 实验目的 掌握实体完整性、参照完整性和用户自定义完整性约束的创建方法。掌握完整性约束的运行检查机制。掌握参照完整性的级联删除和修改方法。掌握正确设计关系模式完整性约束的方法。 2 实验内容 2.1 掌握实体完整性约束的创建和使用方法 创建表时定义由一个属性组成…

解决Linux中Eclipse启动时找不到Java环境的问题

按照报错的意思是没有在/usr/local/eclipse/jre/bin/java下找到java环境&#xff0c;我检查了一下eclipse的目录结构发现在/usr/local/eclipse没有jre/bin/java&#xff0c;我的想法是自己建对应文件夹然后软连接到我的java环境 cd /usr/local/eclipse sudo mkdir jre cd jre s…

将OpenCV与gcc和CMake结合使用

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV4.9.0开源计算机视觉库在 Linux 中安装 下一篇&#xff1a; 引言&#xff1a; 近年来&#xff0c;计算机视觉技术在图像处理、目标检测和机器人等方面得到了广泛的应用…

论文篇00-【历年论文真题考点汇总】与【历年论文原题2009~2023年文字版记录】(2024年软考高级系统架构设计师冲刺知识点总结-论文篇-先导篇)

专栏系列文章推荐: 案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】 综合知识篇00-综合知识考点汇总目录 ...... 历年真题论文题考点汇总 历年软考系统架构设计师论文原题(2009-2022年) 因最新的2023年目前仅能搜索到回忆版,等楼主搜集到…

关于数据通信知识的补充——第二篇

目录 四.二层交换机 5.实现不同vlan通信的原理 方法一&#xff1a;路由器网关 方法二&#xff1a;单臂路由 方法三&#xff1a;三层交换机 五.三层路由技术 &#xff08;1&#xff09;直连路由 &#xff08;2&#xff09;静态路由 &#xff08;3&#xff09;动态路由 …