vue3大屏可视化项目,包含地图,各种 图表,全屏适配方案

news2025/1/27 13:03:37

项目设计

请添加图片描述

1.始终满屏适配,这种方案一般用在屏幕变化不会特别的大项目,项目基本上不会用在比例非常不协调的大屏,设计图按1920*1080标准电脑屏幕比,所用的屏幕也基本在这个比例左右
2.涉及图表知识点简单,主要有自定义色系,环形图,堆叠柱状图,折线图
3.使用高德地图标点做中间地图

满屏适配方案实现思路

1 宽度使用vw,高度使用vh,严格按照设计图换算,并且留出缓冲空间
2 具体算法,设计图为19201080

高度上:
1.设计图上量取高度
2.高度除以设计图高度1080
3得到结果
100
4计算结果加上vh单位3
宽度上:
设计图上量取宽度
高度除以设计图高度1920
得到结果*100
计算结果加上vw单位

3 特别提醒,因为我们大屏项目,高度要始终保持一屏,一般移动端项目高度不用一屏,是可以滚动的,所以高宽统一VW

项目头部制作

//
<template>
<div class="headerContainer">

<div class="header-title">大数据展示</div>

</div>

</template>
<script setup>
</script>

<style scoped>

.headerContainer{

width:100vw;

height:6.85vh;

background-color: #030829;

.header-title{

color:white;

font-size: 1.01vw;

width:28.48vh;

height:100%;

line-height:6.85vh;

text-align:center;

margin: 0 auto;

background-image: url("../assets/logoBg.png");

background-size: 100% 100%;

}

}

</style>

项目请求和环境搭建

// request/index.js
import axios from 'axios'

const request = axios.create({

timeout:10000,

baseURL:import.meta.env.VITE_BASE_URL

})

request.interceptors.request.use((config) => {

return config

})

request.interceptors.response.use((res) => {

if(res.data.code !== 200){

alert("请求错误")

}

return res

},(res) => {

alert("请求错误")

throw new Error(res)

})

export default request
// api/index.js
import request from '../request/index.js'
  

export function getGather(){

return request.get("/getGather")

}

export function getChargeData(){

return request.get("/getCharGeData")

}

export function getOutpatient(){

return request.get("/getOutpatient")

}

export function hosiptalPostion(){

return request.get("/hosiptalPostion")

}

export function getHospitalization(){

return request.get("/getHospitalization")

}

在根目录创建.env.development和.env.production

VITE_BASE_URL="http://localhost:8000"

在App.vue

const loading = ref(true);
async function getAllData() {

//获取收费数据

const chargeRes = await getChargeData();

//获取采集数

const gatherRes = await getGather()

//获取门诊数据

const hospitalizationRes = await getHospitalization();

//获取住院数据

const outpatientRes = await getOutpatient();

//获取医院位置

loading.value = false;

return {

chargeRes: chargeRes.data.data,

gatherRes: gatherRes.data.data,

hospitalizationRes: hospitalizationRes.data.data,

outpatientRes: outpatientRes.data.data

}

}

顶部项目总览菜单

// components/showData.vue
<script setup>

const baseInfo = [

{

totalTitle: "总采集数据量",

monthTitle: "当月采集量",

totalIcon: "./info_1.png",

monthIcon: "./info_2.png",

color: "#ffff43"

},

{

totalTitle: "总门诊数量",

monthTitle: "当月门诊数量",

totalIcon: "./info_3.png",

monthIcon: "./info_4.png",

color: "#25ebca"

},

{

totalTitle: "总住院人数",

monthTitle: "当月住院人数",

totalIcon: "./info_5.png",

monthIcon: "./info_6.png",

color: "#ff4e4e"

}

]

const props = defineProps(['data'])

  

//第一次渲染->请求还没回来->页面渲染要先渲染出来

</script>

  

<template>

<div class="showdataContainer">

<div class="showdataBox" v-for="(item, index) in baseInfo">

<div class="part">

<div class="imgcontent">

<img :src="item.totalIcon" />

</div>

<div class="valuecontent">

<div class="valuetitle">{{ item.totalTitle }}</div>

<div class="value" :style="{

color: item.color

}">

{{ props.data[index]?.total }}

</div>

</div>

</div>

<div class="part">

<div class="imgcontent">

<img :src="item.monthIcon" />

</div>

<div class="valuecontent">

<div class="valuetitle">{{ item.monthTitle }}</div>

<div class="value" :style="{

color: item.color

}">

{{ props.data[index]?.month }}

</div>

</div>

</div>

</div>

</div>

</template>

  

<style scoped lang="scss">

.showdataContainer {

display: flex;

width: 100%;

justify-content: space-between;

  

.showdataBox {

width: 31.66vw;

height: 11.48vh;

background-color: #034c6a;

display: flex;

align-items: center;

padding-left: 1.3vw;

box-sizing: border-box;

  

.part {

width: 50%;

display: flex;

  

.imgcontent {

width: 2.08vw;

margin-right: 1.3vw;

  

img {

width: 100%

}

}

  

.valuecontent {

.valuetitle {

font-size: 0.75vw;

color: white;

}

  

.value {

margin-top: 1.38vh;

font-size: 1vw;

font-weight: 800;

}

}

}

}

}

</style>
//App.vue
async function getAllData() {

//获取收费数据

const chargeRes = await getChargeData();

//获取采集数

const gatherRes = await getGather()

//获取门诊数据

const hospitalizationRes = await getHospitalization();

//获取住院数据

const outpatientRes = await getOutpatient();

//获取医院位置

  

loading.value = false;

return {

chargeRes: chargeRes.data.data,

gatherRes: gatherRes.data.data,

hospitalizationRes: hospitalizationRes.data.data,

outpatientRes: outpatientRes.data.data

}

}
getAllData().then((res) => {

//进行数据赋值

//形成上面数据概览所需要数据

dataofshowData.push(

{

total: res.gatherRes.allgather,

month: res.gatherRes.monthegather

},

{

total: res.hospitalizationRes.allHospitalization,

month: res.hospitalizationRes.montHospitalization

},

{

total: res.outpatientRes.allOutpatient,

month: res.outpatientRes.monthOutpatient

},

)})
<script>
<template>

<div class="container">

<div v-if="!loading">

<topHeader></topHeader>

<div class="mainbody">

<showData :data="dataofshowData"></showData>

  

</div>

</div>

<div v-else>数据加载中请稍等</div>

</div>

</template>

主体布局设计

//App.vue
<template>

<div class="container">

<div v-if="!loading">

<topHeader></topHeader>

<div class="mainbody">

<showData :data="dataofshowData"></showData>

<div class="chartContainer">

<div class="leftOrRight">

<chartGather :data="chart1Data"></chartGather>

<chartCharge :data="chart2Data"></chartCharge>

</div>

<div class="middle">

<chartMap></chartMap>

</div>

<div class="leftOrRight">

<chartGatherToday :data="chart3Data"></chartGatherToday>

<chartHospitalizationToday :data="chart4Data"></chartHospitalizationToday>

</div>

</div>

  
  

</div>

</div>

<div v-else>数据加载中请稍等</div>

</div>

</template>

  

<style scoped lang="less">

.container {

width: 100vw;

height: 100vh;

background-color: #081832;

  

.mainbody {

width: 100vw;

box-sizing: border-box;

padding: 1.85vh 1.04vw;

  

.chartContainer {

padding-top: 5.09vh;

display: flex;

justify-content: space-between;

  

.leftOrRight {

display: flex;

flex-direction: column;

justify-content: space-between;

}

}

}

}

</style>
<script>
//引入四个组件
import chartGather from "./components/chartGather.vue";

import chartCharge from "./components/chartCharge.vue";

import chartGatherToday from "./components/chartGatherToday.vue";

import chartHospitalizationToday from "./components/chartHospitalizationToday.vue";
</script>

chartContent.vue组件 布局组件

//component/chartContent.vue
<script setup>

const { title } = defineProps(['title'])

</script>

<template>

<div class="chartContentWrapper">

<div class="chartContentTitle">

{{ title }}

</div>

<div class="chartContentMain">

<slot></slot>

</div>

</div>

</template>

  

<style scoped lang="less">

.chartContentWrapper {

box-shadow: -10px 0px 15px #034c6a inset,

0px -10px 15px #034c6a inset,

10px 0px 15px #034c6a inset,

0px 10px 15px #034c6a inset;

position: relative;

  

.chartContentTitle {

width: 14.15vw;

height: 3.7vh;

background-color: #034c6a;

border-radius: 50px;

text-align: center;

color: white;

position: absolute;

left: 50%;

margin-left: -7.075vw;

top: -1.85vh;

line-height: 3.7vh;

z-index: 9999

}

}

</style>

四个组件都布好局

//四个组件都是这样的布局  然后title字符串换换内容
<template>

<div>

<chartContent title="各医院今日采集量">

<div id="chart3Container" :style="{

width: '22.7vw',

height: '33.19vh'

}">

  

</div>

</chartContent>

</div>

</template>
![[Pasted image 20240803193402.png]]

堆叠柱状图和圆环图

// component/chartGather.vue
<script setup>

import chartContent from './chartContent.vue';

import * as echarts from "echarts"

import { watch } from 'vue';

  

//引入echarts -》准备一个容器-》获取这个容器的真实dom-》init方法初始化图表-》setOptions给入配置绘制具体图表

const props = defineProps(['data']);

watch(props, () => {

if (props.data.length > 0) {

const _dom = document.getElementById("gatherChartContainer")

//以dom的大小为图表大小

const echartobj = echarts.init(_dom);

const opts = {

color: [

'#87cefa',

'#ff7f50',

'#32cd32',

'#da70d6'

],

legend: {

bottom: 25,

textStyle: {

color: "#fff"

}

},

series: [

{

type: "pie",

radius: ['40%', '70%'],

bottom: 30,

data: props.data,

label: {

show: false

}

}

]

}

echartobj.setOption(opts)

}

  

})

  

</script>

  

<template>

<div>

<chartContent title="各医院采集数据量">

<div id="gatherChartContainer" :style="{

width: '22.7vw',

height: '33.19vh'

}">

  

</div>

</chartContent>

</div>

</template>

  

<style scoped lang="less"></style>
//component/chartCharge.vue
<script setup>

import chartContent from './chartContent.vue';

import * as echarts from "echarts"

import { watch } from 'vue';

  

//引入echarts -》准备一个容器-》获取这个容器的真实dom-》init方法初始化图表-》setOptions给入配置绘制具体图表

const props = defineProps(['data']);

watch(props, () => {

if (props.data.length > 0) {

const _dom = document.getElementById("chargeChartContainer")

const echartobj = echarts.init(_dom);

const opts = {

grid: {

left: "20%",

bottom: "25%"

},

tooltip: {

  

},

legend: {

bottom: 35,

textStyle: {

color: "white"

}

},

color: [

'#87cefa',

'#ff7f50',

'#32cd32',

'#da70d6'

],

yAxis: {

type: "category",

axisLabel: {

color: "white"

},

data: ['人均费用(元)', '住院人次(人)', '门诊人数(人)']

},

xAxis: {

  

splitLine: {

show: false

},

type: 'value'

},

series: [

  

]

}

props.data.forEach((item) => {

opts.series.push({

type: "bar",

stack: "total",

name: item.name,

data: item.data

})

})

echartobj.setOption(opts)

}

  

})

  

</script>

  

<template>

<div>

<chartContent title="各医院平均费用">

<div id="chargeChartContainer" :style="{

width: '22.7vw',

height: '33.19vh'

}">

  

</div>

</chartContent>

</div>

</template>

  

<style scoped lang="less"></style>

折线图与坐标轴自定义

// chartGatherToday.vue
<script setup>

import chartContent from './chartContent.vue';

import * as echarts from "echarts"

import { watch } from 'vue';

  

//引入echarts -》准备一个容器-》获取这个容器的真实dom-》init方法初始化图表-》setOptions给入配置绘制具体图表

const props = defineProps(['data']);

//data-[{name:'xxx',data:[1,2,3]}]

watch(props, () => {

if (props.data.length > 0) {

const _dom = document.getElementById("chart3Container")

const echartobj = echarts.init(_dom);

const opts = {

grid: {

bottom: '25%',

left: '15%'

},

tooltip: {

  

},

legend: {

bottom: 35,

textStyle: {

color: "white"

}

},

color: [

'#87cefa',

'#ff7f50',

'#32cd32',

'#da70d6'

],

yAxis: {

axisLabel: {

color: "white",

formatter: (value) => {

return value + 'k条'

}

},

},

xAxis: {

axisLabel: {

color: "white"

},

type: "category",

data: [

"8:00",

"12:00",

"16:00",

"20:00"

]

},

series: [

  

]

}

props.data.forEach((item) => {

opts.series.push({

type: "line",

smooth: true,

name: item.name,

data: item.data

})

})

console.log(opts);

echartobj.setOption(opts)

}

})

</script>

  

<template>

<div>

<chartContent title="各医院今日采集量">

<div id="chart3Container" :style="{

width: '22.7vw',

height: '33.19vh'

}">

  

</div>

</chartContent>

</div>

</template>

  

<style scoped lang="less"></style>
//chartHospitalizationToday.vue
<script setup>

import chartContent from './chartContent.vue';

import * as echarts from "echarts"

import { watch } from 'vue';

  

//引入echarts -》准备一个容器-》获取这个容器的真实dom-》init方法初始化图表-》setOptions给入配置绘制具体图表

const props = defineProps(['data']);

//data-[{name:'xxx',data:[1,2,3]}]

watch(props, () => {

if (props.data.length > 0) {

const _dom = document.getElementById("chart4Container")

const echartobj = echarts.init(_dom);

const opts = {

grid: {

bottom: '25%',

left: '15%'

},

tooltip: {

  

},

legend: {

bottom: 35,

textStyle: {

color: "white"

}

},

color: [

'#87cefa',

'#ff7f50',

'#32cd32',

'#da70d6'

],

yAxis: {

axisLabel: {

color: "white",

formatter: (value) => {

return value + '人'

}

},

},

xAxis: {

axisLabel: {

color: "white"

},

type: "category",

data: [

"8:00",

"12:00",

"16:00",

"20:00"

]

},

series: [

  

]

}

props.data.forEach((item) => {

opts.series.push({

type: "line",

smooth: true,

name: item.name,

data: item.data

})

})

console.log(opts);

echartobj.setOption(opts)

}

  

})

</script>

  

<template>

<div>

<chartContent title="就诊人数(今日)">

<div id="chart4Container" :style="{

width: '22.7vw',

height: '33.19vh'

}">

  

</div>

</chartContent>

</div>

</template>

  
<style scoped lang="less"></style>

地图开发和标记点

搜索高德开放平台。注册账号并打开网站https://lbs.amap.com/api/javascript-api-v2/summary根据里面文档看代码

//项目的根目录index.html文件
<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<link rel="icon" href="/favicon.ico">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Vite App</title>

</head>

<body>

<script type="text/javascript">

window._AMapSecurityConfig = {

securityJsCode: "你的密钥",

};

</script>

<script src="https://webapi.amap.com/loader.js"></script>

<div id="app"></div>

<script type="module" src="/src/main.js"></script>

</body>

</html>

<script setup>
//chartMap.vue

import chartContent from './chartContent.vue';

import { hosiptalPostion } from '@/api';

import { onMounted } from 'vue';

import config from "@/global.config.js"

function createInfoWindow(AMap, mapObj, info) {

console.log(info);

let infoWindow = new AMap.InfoWindow({

isCustom: true,

content: `<div class="window-container">

${info.name}

</div>`

})

//第一个参数在哪个地图打开,第二参数打开的位置,info.postion

infoWindow.open(mapObj, info.position)

}

//标记点

function creatPoint(AMap, mapObj, data) {

const marker = new AMap.Marker({

position: new AMap.LngLat(data.position[0], data.position[1]),

})

marker.on("click", (e) => {

createInfoWindow(AMap, mapObj, {

name: data.hospitalName,

position: e.target.getPosition()

})

})

mapObj.add(marker);

}

  

onMounted(() => {

hosiptalPostion().then((res) => {

const _data = res.data.data

//拿到数据进行绘制,AMapLoader,是引入高德地图后自动注入到window

AMapLoader.load({

key: config.amapkey, //申请好的Web端开发者 Key,调用 load 时必填

version: "2.0", //指定要加载的 JS API 的版本,缺省时默认为 1.4.15

})

.then((AMap) => {

const map = new AMap.Map("map1", {

zoom: 13,

center: _data[0].position

})

_data.forEach((item) => {

creatPoint(AMap, map, item)

})

})

.catch((e) => {

  

});

});

})

</script>

  

<template>

<div>

<chartContent title="厦门市地图">

<div id="map1" :style="{

width: '47.83vw',

height: '72vh'

}">

  

</div>

</chartContent>

</div>

</template>

  

<style>

.window-container {

width: 100px;

height: 50px;

text-align: center;

background-color: white;

}

</style>

最终实现效果

请添加图片描述

如果对你有所帮助的话 点个关注吧

这篇文章是这个视频的笔记https://www.bilibili.com/video/BV1Hy411B79x/?spm_id_from=333.788&vd_source=e73709c9a1618b4c6dfd58c6c40d8986

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

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

相关文章

关于 Codeforces 的界面问题

如果你出现了上述问题的话&#xff0c;你就下拉界面到最底层&#xff0c; 点击 desktop version 即可恢复

【PyTorch】深度学习PyTorch环境配置及安装【详细清晰】

文章目录 概要步骤Anaconda安装管理环境 安装PyTorchPyTorch环境使用JupyterJupyter简介安装Jupyter及使用 我的部分版本 概要 搭建PyTorch环境用于深度学习 步骤 Anaconda安装 安装详情&#xff1a;https://blog.csdn.net/Q20011102/article/details/127831950 我安装的是…

基于JAVA的物资管理系统设计与实现

点击下载源码 基于JAVA的物资管理系统设计与实现 摘要&#xff1a;随着科学技术的进步&#xff0c;计算机行业的迅速发展&#xff0c;大大提高人们的工作效率。计算机信息处理系统的引进已彻底改变了许多系统的经营管理。恒鑫租赁站长期大量出租各型钢管、扣件、塔吊等建筑施…

Android14音频进阶之使能内核debugfs:Adsp输出日志(七十九)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更…

轻松学c++入门篇

温馨提示&#xff1a;本篇文章只讲解是什么&#xff0c;以及怎么用 基础概念 namespace的价值 7.1namespace的价值 在C/C中&#xff0c;变量、函数和后⾯要学到的类都是⼤量存在的&#xff0c;这些变量、函数和类的名称将都存在于全局作⽤域中&#xff0c;可能会导致很多冲突…

MySQL--数据库备份

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、为什么要备份 备份&#xff1a;能够防止由于机械故障以及人为误操作带来的数据丢失&#xff0c;例如将数据库文件保存在了其它地方。 冗余&#…

AISOO爱数AnyShare/易享云-文档云数据恢复-2024.8.4

故障简述 一台数AnyShare的数据磁盘因物理故障&#xff0c;导致超过300GB企业文档资料远程访问。 客户在当地A数据恢复公司开盘恢复数据&#xff0c;但AnyShare的底层数据特有元数据信息&#xff0c;A恢复公司未能恢复此元数据信息&#xff0c;所以AnyShare极无法访问丢失的企…

栈和队列——4.前k个高频元素

力扣题目链接 给定一个非空的整数数组&#xff0c;返回其中出现频率前 k 高的元素。 示例&#xff1a; 输入&#xff1a;nums [1,1,1,2,2,3], k 2 输出&#xff1a;[1,2] 题干很简单&#xff0c;就是对数组中的元素进行频次计算&#xff0c;找到频次最多的前k和元素。那么…

48天笔试训练错题——day37

目录 选择题 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 编程题 1. 数据库连接池 2. mkdir 选择题 1. 2. 数据的五元组&#xff1a;源IP&#xff0c;源端口&#xff0c;目的IP&#xff0c;目的端口&#xff0c;协议。 源IP&#xff1a;描述数据从哪个主机上产生。 目的I…

南京观海微电子----单通道遥控开关电路原理及制作

本文介绍的遥控开关&#xff0c;具有遥控距离远&#xff08;大于30米&#xff09;&#xff0c;无方向限制&#xff0c;可穿透墙壁&#xff0c;工作稳定&#xff0c;体积小巧等优点。只要在家电设备的供电回路中加入这种电路&#xff0c;便能使家电具有遥控功能。下面分别介绍它…

『python爬虫』beautifulsoup库获取文本的方法.get_text()、.text 和 .string区别(保姆级图文)

目录 区别.string(不推荐用).text(get_text的简化版少敲代码的时候用).get_text(推荐用,功能强大,为什么不爱呢?) 示例代码总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 区别 省流直接看get_text 推荐用这个…

[BJDCTF2020]Cookie is so stable1

打开题目 查看页面源码 点击hint查看源码 提示看cookie&#xff0c;burp抓包查看cookie 试一下 尝试{{7*7}}&#xff0c;发现ssti漏洞&#xff0c;判断是twig 抓包&#xff0c;发现user为注入点 输入payload {{_self.env.registerUndefinedFilterCallback("exec"…

.NET 8 通用权限框架 前后端分离,开箱即用

目录 前言​ 项目介绍 1、支持各种数据库 2、前端运行步骤 3、演示环境 4、项目地址 5、在线文档 项目使用 项目功能 项目截图 总结 前言​ 推荐一个基于.NET 8 实现的通用权限开发框架Admin.NET&#xff0c;前端使用Vue3/Element-plus开发。 基于.NET 8(Furion)/Sq…

【中项】系统集成项目管理工程师-第9章 项目管理概论-9.9价值交付系统

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

十分钟速通 Vue 动态 Class、Style

计算属性 大家有没有思考过这样一个问题&#xff0c;下面这段代码&#xff0c;功能上没什么问题&#xff0c;但是读起来很费劲&#xff0c;因为需要思考过后&#xff0c;才能知道这段代码的意思。 <p>{{ message.split().reverse().join() }}</p>这完全不符合面向…

[NISACTF 2022]ezpie- 入土为安的第十五天

pwn的第3天 PIE保护ret2text栈 按照签到题的套路是找main&#xff0c;buf,shell,bin/sh/ 但是是PIE保护 那有什么不一样的呢 PIE保护&#xff1a; ​ PIE全称是position-independent executable&#xff0c;中文解释为地址无关可执行文件&#xff0c;该技术是一个针对代码…

C++ | (一)C++入门基础

从本篇文章开始&#xff0c;我们正式进行C的系统学习。C是在C语言的基础上添加了面向对象编程的特性&#xff0c;是C语言的延伸&#xff0c;并遵循C语言的绝大多数语法。如果想学习C&#xff0c;必须要有一定的C语言基础&#xff0c;这样学起来才不会太过痛苦。 本文章即假设读…

Vue分析脚手架结构

1.分析结构 <!DOCTYPE html> <html lang""><head><meta charset"utf-8"><!-- 针对IE浏览器 得一个特殊配置&#xff0c;含义是让IE浏览器以最高得渲染级别渲染页面 --><meta http-equiv"X-UA-Compatible" cont…

吃瓜用户看广告获取密码访问网页内容流量主模式源码

用户看广告获取密码访问网页内容&#xff0c;网站生成内容&#xff0c;用户需要浏览内容跳转至小程序&#xff0c;观看广告后获取密码&#xff0c;输入密码查看网页内容。 与之前得9.9付费进群区别就是内容体现在了网页里&#xff0c;用户不需要进群查看。并且不需要付费&…

HTML 基础结构

目录 1. 文档声明 2. 根标签 3. 头部元素 4. 主题元素 5. 注释 6. 演示 1. 文档声明 <!DOCTYPE html>&#xff1a;声明文档类型&#xff0c;表示该文档是 html 文档&#xff0c; 2. 根标签 &#xff08;1&#xff09;所有的其他标签都要放在一对根标签中&#…