大数据热点城市波动图案例【CSS3实现 + 原理分析 + 源码获取】

news2025/7/8 0:15:14

一:案例效果

       本次案例我们分析一下数据可视化页面最常见的热点图是如何实现的,其原理并不复杂,只需要用到CSS3动画属性 animation 以及 @keyframe 关键帧即可,重点是向外扩散的环如何布局比较合适,以及每个环怎么扩散何时扩散比较合适。

二:源码获取

源码我已经上传到了资源里,想拿来学习引用的小伙伴直接下载即可,没有会员的可以私聊我 “大数据热点图” 免费获取,下方是源码的资源链接


大数据热点波动图,纯css3实现-Javascript文档类资源-CSDN下载通过css3动画设置的大数据热点波动图,主要利用了animation动画更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/weixin_52212950/86728456

三:原理分析

原理分析我们分为热点的布局分析与热点向外扩散的动画实现的分析

3.1 布局分析

  • 布局我们那单独的一个城市分析,例如地图中北京的 ,其由一个类名为city1的最外层盒子来添加定位以定到目标城市位置,其不设置宽高,大小完全由中心点撑起(即第二个类名为center的盒子) ,波纹其实是有三个圈圈组成的,最开始是完全重合的,用中心小算法来保证其永远是围绕center来扩散的。
       <div class="city1">
            <div class="center1"></div>
            <p class="bj">Beijing</p>
            <div class="bw1"></div>
            <div class="bw2"></div>
            <div class="bw3"></div>
        </div>
  • 波纹的样式添加我们采用了属性选择器 .city1 div[class^="bw"],即选择父类city1里面类名以bw开头的所有子div标签 
.city1{
            position: absolute;
            top: 370px;
            right: 403px;
            color: aliceblue;
        }
        .center1{
            width: 5px;
            height: 5px;
            background-color: rgb(255, 255, 255);
            box-shadow: 0 0 12px 2px #fff;
            border-radius: 50%;
        }
        .city1 div[class^="bw"]{
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%,-50%);
             width: 5px;
             height: 5px;
             box-shadow: 0 0 7px  #fff;
             border-radius: 50%;
             animation: scla 3s linear infinite;      
        }
        .map .city1 div.bw2{
            animation-delay: 1s;
        }
        .map .city1 div.bw3{
            animation-delay: 2s;
        }

3.2 动画分析

  • 本次添加的关键帧为:0%的时候波纹是完全不透明的,50%的时候宽高均变大为105px,即圈圈在总动画时间50%的时候要从宽高5px扩散到宽高105px,然后变为半透明状态。再下一个是100%的时候,扩散到宽高150px,并变成完全不透明。要给波纹添加属性:animation: scla 3s linear infinite;  含义为3s做完动画,匀速,并且无限循环

     

  • 为了呈现出波纹一个接一个往外扩散而不是一起扩散,需要给第一个圈圈直接开始扩散,第二个圈圈第三个圈圈设置不同的 animation-delay 动画延迟,第二个设置为1s,第二个设置为2s,这样就可以呈现出一个接一个往外扩散了
   /* @keyframes关键帧动画 */
        @keyframes scla{
            0% {
                opacity: 1;
            }
            50% {
                width: 105px;
                height: 105px;
                opacity: 0.5;
            }
            100% {
                width: 150px;
                height: 150px;
                opacity: 0;
            }
        }
       .city3 div[class^="bw"]{
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%,-50%);
             width: 5px;
             height: 5px;
             box-shadow: 0 0 7px  #fff;
             border-radius: 50%;
             animation: scla 3s linear infinite;      
        }
        .map .city3 div.bw2{
            animation-delay: 1s;
        }
        .map .city3 div.bw3{
            animation-delay: 2s;
        }

四:主要代码

<style>
        *{
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        body{
            background-color: rgb(45, 45, 45);
        }
        .map{
            position: relative;
            width: 1400px;
            height: 830px;
            background-image: url(./img/QX3OPNW5qY.png);
            background-repeat: no-repeat;
            background-size: 100%;
            margin: 0 auto;
        }
        .bj{
            position: absolute;
            top: 15px;
            left: 10px;
            font-size: 10px;
        }
        .Gambia{
            position: absolute;
            top: 15px;
            left: 10px;
            font-size: 10px;
            color:rgb(255, 153, 153)
        }
        .Island{
            position: absolute;
            top: 15px;
            left: 10px;
            font-size: 10px;
        }
        /* 城市1 */
        .city1{
            position: absolute;
            top: 370px;
            right: 403px;
            color: aliceblue;
        }
        .center1{
            width: 5px;
            height: 5px;
            background-color: rgb(255, 255, 255);
            box-shadow: 0 0 12px 2px #fff;
            border-radius: 50%;
        }
        .city1 div[class^="bw"]{
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%,-50%);
             width: 5px;
             height: 5px;
             box-shadow: 0 0 7px  #fff;
             border-radius: 50%;
             animation: scla 3s linear infinite;      
        }
        .map .city1 div.bw2{
            animation-delay: 1s;
        }
        .map .city1 div.bw3{
            animation-delay: 2s;
        }
        /* 城市2 */
        .city2{
            position: absolute;
            top: 500px;
            right: 703px;
            color: aliceblue;
        }
        .center2{
            width: 5px;
            height: 5px;
            background-color: rgb(255, 255, 255);
            box-shadow: 0 0 12px 2px #fff;
            border-radius: 50%;
        }
        .city2 div[class^="bw"]{
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%,-50%);
             width: 5px;
             height: 5px;
             box-shadow: 0 0 7px  rgb(255, 149, 149);
             border-radius: 50%;
             animation: scla1 3s linear infinite;      
        }
        .map .city2 div.bw2{
            animation-delay: 0.75s;
        }
        .map .city2 div.bw3{
            animation-delay: 1.5s;
        }
        .map .city2 div.bw4{
            animation-delay: 2.25s;
        }
        /* 城市3 */
        .city3{
            position: absolute;
            top: 200px;
            right: 1003px;
            color: aliceblue;
        }
        .center3{
            width: 5px;
            height: 5px;
            background-color: rgb(255, 255, 255);
            box-shadow: 0 0 12px 2px #fff;
            border-radius: 50%;
        }
        /* 属性选择器 正则表达式筛选bw开头类名 */
        .city3 div[class^="bw"]{
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%,-50%);
             width: 5px;
             height: 5px;
             box-shadow: 0 0 7px  #fff;
             border-radius: 50%;
             animation: scla 3s linear infinite;      
        }
        .map .city3 div.bw2{
            animation-delay: 1s;
        }
        .map .city3 div.bw3{
            animation-delay: 2s;
        }
        /* @keyframes关键帧动画 */
        @keyframes scla{
            0% {
                opacity: 1;
            }
            50% {
                width: 105px;
                height: 105px;
                opacity: 0.5;
            }
            100% {
                width: 150px;
                height: 150px;
                opacity: 0;
            }
        }
        @keyframes scla1{
            0% {
                opacity: 1;
            }
            50% {
                width: 285px;
                height: 285px;
                opacity: 0.5;
            }
            100% {
                width: 330px;
                height: 330px;
                opacity: 0;
            }
        }
    </style>
</head>
<body>
    <div class="map">
        <div class="city1">
            <div class="center1"></div>
            <p class="bj">Beijing</p>
            <div class="bw1"></div>
            <div class="bw2"></div>
            <div class="bw3"></div>
        </div>
        <div class="city2">
            <div class="center2"></div>
            <p class="Gambia">Gambia</p>
            <div class="bw1"></div>
            <div class="bw2"></div>
            <div class="bw3"></div>
            <div class="bw4"></div>
        </div>
        <div class="city3">
            <div class="center3"></div>
            <p class="Island">Island</p>
            <div class="bw1"></div>
            <div class="bw2"></div>
            <div class="bw3"></div>
        </div>
    </div>
</body>

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

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

相关文章

HTML 5标签搭建页面结构--1

本文标签: HTML基本语法 排版标签 媒体标签 链接标签 文章目录 前言 一、基础认识 1.认识网页 2.微博标准 3.web标准的构成 4.小结 二、HTML基本结构解读 2.HTML标签及结构 1.标签的结构: 2.排版标签: 2.文本格式化标签: 3.媒体标签: 1.图像相关标签: 2.图片标签的 title …

JavaScript-百炼成仙(第1节掌握JavaScript基础1.1-1.21)

文章目录1.1 第一章 初入宗门1.2 第二章 直接量1.3 第三章 数据类型1.4 第四章 数据类型扩展内容:1.5 第五章 基础考核1.6 第六章 何老1.7 第七章 对象数据类型1.8 第八章 对象的取值1.9 第九章 循环遍历的奥妙小结&#xff1a;For 循环1.10 第十章 对象内容的遍历1.11 第十一章…

30个题型+代码(冲刺2023蓝桥杯)(上)

愿意的可以跟我一起刷&#xff0c;每个类型做1~5题 &#xff0c;4月前还可以回来系统复习 目录 &#x1f34e;注意 &#x1f33c;前言 &#x1f33c;一&#xff0c;前缀和 &#x1f44a;&#xff08;一&#xff09;3956. 截断数组 &#x1f333;Time Limit Exceeded &a…

如何用python代码,更改照片尺寸,以及更换照片底色

前言 python浅浅替代ps&#xff1f;如何用代码来p证件照并且更换底色&#xff1f; 唉&#xff0c;有个小姐姐给我扔了张照片&#xff0c;叫我帮忙给她搞成证件照的尺寸还得换底色&#xff0c;她说自己忙的很 可惜电脑上没有ps只有pycharm&#xff0c;没得办法只能来试试看代…

没有关系的话,那就去建立关系吧

今天给大家分享一道链表的好题--链表的深度拷贝&#xff0c;学会这道题&#xff0c;你的链表就可以达到优秀的水平了。力扣 先来理解一下题目意思&#xff0c;即建立一个新的单向链表&#xff0c;里面每个结点的值与对应的原链表相同&#xff0c;并且random指针也要指向新链表中…

vite基础使用及相关配置

前言 这篇文章主要是记录前段时间公司里以vite构建的一个小项目&#xff08;前端界面不多&#xff0c;主要功能及相关配置是在后端&#xff09;&#xff0c;挺简单的几个小页面。 说到vite&#xff0c;之前虽然都有学习了解及demo尝试&#xff0c;但因为业务等其他各方面因素也…

uniapp开发APP从开发到上架全过程(一)

前端时间受朋友委托帮他开发了一款APP&#xff0c;综合考虑了下&#xff0c;没有上原生&#xff0c;使用了uniapp这一套技术栈来进行开发 uniapp是dcloud推出的一套跨端前端解决方案&#xff0c;可以通过一套代码生成小程序、安卓、IOS、H5等代码&#xff0c;对于中小项目来说…

vue通知提醒消息

目录 前言 一、Notification 二、Notification引用 1.全局引用 2.单独引用 三、参数说明 四、简单案例 五、项目实战 1、定义全局Notification。 2、Websocket实时接收通知。 3、消息通知 前言 最近有个项目需求就是在客户端的右上角要实时展示提醒消息&#xff0c;下…

vue3使用tinymce

1、安装相关依赖 npm install tinymce -S npm install tinymce/tinymce-vue -S2、下载中文包 地址 https://www.tiny.cloud/get-tiny/language-packages/ 3. 引入皮肤和汉化包 在项目public文件夹下新建tinymce文件夹&#xff0c; 将下载的汉化包解压到此文件夹 然后在node…

js延迟加载的六种方式

1. defer 属性 HTML 4.01 为<script>标签定义了defer属性。标签定义了defer属性元素中设置defer属性&#xff0c;等于告诉浏览器立即下载&#xff0c;但延迟执行标签定义了defer属性。 用途&#xff1a;表明脚本在执行时不会影响页面的构造。也就是说&#xff0c;脚本会…

论文阅读笔记《Nctr: Neighborhood Consensus Transformer for Feature Matching》

核心思想 本文提出一种融合邻域一致性的Transfomer结构来实现特征点的匹配&#xff08;NCTR&#xff09;。整个的实现流程和思想与SuperGlue相似&#xff0c;改进点在于考虑到了邻域一致性。邻域一致性在许多的传统图像匹配和图匹配任务中都有应用&#xff0c;他基于一个很重要…

【VUE前进之路】使用数据代理,计算属性与监视属性的妙用

1.数据代理 1.1什么是数据代理 通过一个对象代理对另一个对象中属性的操作&#xff08;读/写&#xff09; 1.Vue中的数据代理&#xff1a;通过vm对象来代理data对象中属性的操作&#xff08;读/写&#xff09; 2.Vue中数据代理的好处:更加方便的操作data中的数据 3.基本原理:…

ESLint 配置入门

大家好&#xff0c;我是前端西瓜哥&#xff0c;今天带大家了解 ESLint 的配置项。 ESLint 是一款检查 JavaScript 程序是否符合特定的规则的工具。比如字符串用单引号还是双引号&#xff0c;tab 缩进用 2 个空格还是 4 个空格还是其他&#xff0c;这些都可以用 ESLint 来规定。…

微信小程序---分包操作

有时候我们的小程序太大&#xff0c;首次打开小程序的时候回比较慢&#xff0c;这个时候我们可以试试分包操作。分包可以让用户在操作小程序的时候按需下载资源&#xff08;用户在进入某些页面的时候才去下载相应的资源&#xff0c;可以加快小程序的速度&#xff0c;优化用户体…

前端学习笔记(15)-Vue3状态管理store及Vuex的使用

1.状态管理 2.用响应式API做简单状态管理 3.Vuex基础 4.Vuex 核心概念 5. VuexsessionStorage实现数据存储1.状态管理理论上来说&#xff0c;每一个 Vue 组件实例都已经在“管理”它自己的响应式状态了。我们以一个简单的计数器组件为例&#xff1a;<script setup> impor…

最新小程序反编译详细教程,亲测可用

小程序因为触手可及、自带推广等的特点&#xff0c;自诞生以来&#xff0c;实现了很多的商业场景&#xff0c;同时取代了App的大部分市场份额。其实小程序的开发和网页开发类似&#xff0c;同样使用的是JavaScript开发的&#xff0c;属于前端&#xff0c;所以借助一些程序的帮助…

html+css唯美登录页面,代码提供(效果展示)

文章目录效果图所有代码效果图 所有代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" cont…

vue脚手架报错:“Component name “***“ should always be multi-word”解决方法

出现的问题 在我们写完脚手架运行 npm run serve 后控制台报错 页面报错 报错的原因 在为自定义组件命名的时候未按照官方代码规范进行命名&#xff0c;根据 ESLint 官方代码风格指南&#xff0c;除了根组件&#xff08;App.vue&#xff09;以外&#xff0c;其他自定义组件命名…

若依框架登录后跳转其他页面获取不同的菜单登录进入后跳转至动态路由的第一个路由

最近碰到的需求是登录进入后,先跳转至一个自己定义的页面,在这个页面选择一个系统后,进入若依的系统,根据选择的系统获取相应的菜单,进入页面后默认跳转至后端返回的动态路由的第一个路由 1.首先在登录页面login.vue做如下改动 写成你要跳转过去的页面:(这个路由如果是自己定…

蓝桥杯冲击-02约数篇(必考)

文章目录 前言 一、约数是什么 二、三大模板 1、试除法求约数个数 2、求约数个数 3、求约数之和 三、真题演练 前言 约数和质数一样在蓝桥杯考试中是在数论中考察频率较高的一种&#xff0c;在省赛考察的时候往往就是模板题&#xff0c;难度大一点会结合其他知识点考察&#x…