Brand.vue 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819
  1. <template>
  2. <div class="brand-container">
  3. <div class="wrap">
  4. <header>
  5. <div class="weather">
  6. <img :src="imgSrc">
  7. <span class="tem">{{ weatcherData.tem }}°C</span>
  8. <span class="wea">{{ weatcherData.wea }}</span>
  9. </div>
  10. <h2>疫情数据分析</h2>
  11. <div class="showTime">
  12. <span class="time">{{ nowTime }}</span>
  13. <span class="date">
  14. <span>{{ week }}</span>
  15. <span>{{ date }}</span>
  16. </span>
  17. </div>
  18. </header>
  19. <section class="mainbox">
  20. <div class="item left">
  21. <div class="panel">
  22. <h2>海外累计病例排行</h2>
  23. <CityRank/>
  24. <div class="panel-footer"></div>
  25. </div>
  26. <div class="panel">
  27. <h2>新增病例情况</h2>
  28. <PieCon/>
  29. <div class="panel-footer"></div>
  30. </div>
  31. <div class="panel">
  32. <h2>全国 现有确诊/疑似/累计确诊 趋势</h2>
  33. <TrendCon/>
  34. <div class="panel-footer"></div>
  35. </div>
  36. </div>
  37. <div class="item center">
  38. <div class="resume">
  39. <div class="resume-hd">
  40. <ul>
  41. <li>
  42. <countTo :startVal='startVal' :endVal='1632' :duration='6000' separator=","></countTo>
  43. </li>
  44. <li>
  45. <countTo :startVal='startVal' :endVal='95983' :duration='6000' separator=","></countTo>
  46. </li>
  47. <li>
  48. <countTo :startVal='startVal' :endVal='89578' :duration='6000' separator=","></countTo>
  49. </li>
  50. </ul>
  51. </div>
  52. <div class="resume-bd">
  53. <ul>
  54. <li>现存确诊(单位:人)</li>
  55. <li>累计确诊(单位:人)</li>
  56. <li>累计治愈(单位:人)</li>
  57. </ul>
  58. </div>
  59. </div>
  60. <div class="map">
  61. <div class="chart" id="chart_map"></div>
  62. <div class="map1"></div>
  63. <div class="map2"></div>
  64. <div class="map3"></div>
  65. </div>
  66. </div>
  67. <div class="item right">
  68. <div class="panel">
  69. <h2>近期热词</h2>
  70. <wordCloud/>
  71. <div class="panel-footer"></div>
  72. </div>
  73. <div class="panel">
  74. <h2>现存确诊</h2>
  75. <RoseCon/>
  76. <div class="panel-footer"></div>
  77. </div>
  78. <div class="panel">
  79. <h2>疫情实况</h2>
  80. <Newly/>
  81. <div class="panel-footer"></div>
  82. </div>
  83. </div>
  84. </section>
  85. </div>
  86. </div>
  87. </template>
  88. <script>
  89. import '@/assets/js/flexible'
  90. import '@/assets/js/china'
  91. import countTo from 'vue-count-to'
  92. export default {
  93. name: 'Brand',
  94. components: {
  95. countTo
  96. },
  97. data() {
  98. return {
  99. nowTime: '',
  100. week: '',
  101. date: '',
  102. timer: null,
  103. imgSrc: '',
  104. weatcherData: {},
  105. startVal: 0,
  106. geoCoordMap: {},
  107. XAData: [
  108. [{name: "长沙"}, {name: "北京", value: 100}],
  109. [{name: "长沙"}, {name: "上海", value: 100}],
  110. [{name: "长沙"}, {name: "广州", value: 100}],
  111. [{name: "长沙"}, {name: "深圳", value: 100}],
  112. [{name: "长沙"}, {name: "西安", value: 100}]
  113. ],
  114. XNData: [
  115. [{name: "长沙"}, {name: "西宁", value: 100}],
  116. [{name: "长沙"}, {name: "拉萨", value: 100}],
  117. [{name: "长沙"}, {name: "哈尔滨", value: 100}],
  118. [{name: "长沙"}, {name: "成都", value: 100}],
  119. [{name: "长沙"}, {name: "重庆", value: 100}]
  120. ],
  121. YCData: [
  122. [{name: "北京"}, {name: "长沙", value: 100}],
  123. [{name: "北京"}, {name: "贵阳", value: 100}],
  124. [{name: "北京"}, {name: "杭州", value: 100}]
  125. ]
  126. }
  127. },
  128. computed: {},
  129. created() {
  130. },
  131. mounted() {
  132. // this.getWeather();
  133. this.timer = setInterval(() => {
  134. this.getWeather();
  135. }, 1000 * 60 * 60)
  136. this.nowTimes();
  137. this.getEchart();
  138. },
  139. methods: {
  140. timeFormate(timeStamp) { //显示当前时间
  141. let newDate = new Date(timeStamp);
  142. let year = newDate.getFullYear();
  143. let month = newDate.getMonth() + 1 < 10 ? '0' + (newDate.getMonth() + 1) : newDate.getMonth() + 1;
  144. let date = newDate.getDate() < 10 ? '0' + newDate.getDate() : newDate.getDate();
  145. let hh = newDate.getHours() < 10 ? '0' + newDate.getHours() : newDate.getHours();
  146. let mm = newDate.getMinutes() < 10 ? '0' + newDate.getMinutes() : newDate.getMinutes();
  147. let ss = newDate.getSeconds() < 10 ? '0' + newDate.getSeconds() : newDate.getSeconds();
  148. let week = newDate.getDay();
  149. let weeks = ['日', '一', '二', '三', '四', '五', '六'];
  150. let getWeek = '星期' + weeks[week];
  151. this.week = getWeek;
  152. this.date = year + '.' + month + '.' + date;
  153. this.nowTime = hh + ':' + mm + ':' + ss;
  154. },
  155. nowTimes() {
  156. this.timeFormate(new Date());
  157. setInterval(this.nowTimes, 1000);
  158. this.clear();
  159. },
  160. clear() {
  161. clearInterval(this.nowTimes)
  162. this.nowTimes = null;
  163. },
  164. // getWeather() { // 第三方天气api接口
  165. //
  166. // },
  167. convertData(data) { // 地图数据转换
  168. let res = [];
  169. for (let i = 0; i < data.length; i++) {
  170. let dataItem = data[i];
  171. let fromCoord = this.geoCoordMap[dataItem[0].name];
  172. let toCoord = this.geoCoordMap[dataItem[1].name];
  173. if (fromCoord && toCoord) {
  174. res.push({
  175. fromName: dataItem[0].name,
  176. toName: dataItem[1].name,
  177. coords: [fromCoord, toCoord],
  178. value: dataItem[1].value
  179. });
  180. }
  181. }
  182. return res;
  183. },
  184. getEchart() { // 初始化地图数据
  185. let myChart = echarts.init(document.getElementById('chart_map'));
  186. this.geoCoordMap = {
  187. 上海: [121.4648, 31.2891],
  188. 东莞: [113.8953, 22.901],
  189. 东营: [118.7073, 37.5513],
  190. 中山: [113.4229, 22.478],
  191. 临汾: [111.4783, 36.1615],
  192. 临沂: [118.3118, 35.2936],
  193. 丹东: [124.541, 40.4242],
  194. 丽水: [119.5642, 28.1854],
  195. 乌鲁木齐: [87.9236, 43.5883],
  196. 佛山: [112.8955, 23.1097],
  197. 保定: [115.0488, 39.0948],
  198. 兰州: [103.5901, 36.3043],
  199. 包头: [110.3467, 41.4899],
  200. 北京: [116.4551, 40.2539],
  201. 北海: [109.314, 21.6211],
  202. 南京: [118.8062, 31.9208],
  203. 南宁: [108.479, 23.1152],
  204. 南昌: [116.0046, 28.6633],
  205. 南通: [121.1023, 32.1625],
  206. 厦门: [118.1689, 24.6478],
  207. 台州: [121.1353, 28.6688],
  208. 合肥: [117.29, 32.0581],
  209. 呼和浩特: [111.4124, 40.4901],
  210. 咸阳: [108.4131, 34.8706],
  211. 哈尔滨: [127.9688, 45.368],
  212. 唐山: [118.4766, 39.6826],
  213. 嘉兴: [120.9155, 30.6354],
  214. 大同: [113.7854, 39.8035],
  215. 大连: [122.2229, 39.4409],
  216. 天津: [117.4219, 39.4189],
  217. 太原: [112.3352, 37.9413],
  218. 威海: [121.9482, 37.1393],
  219. 宁波: [121.5967, 29.6466],
  220. 宝鸡: [107.1826, 34.3433],
  221. 宿迁: [118.5535, 33.7775],
  222. 常州: [119.4543, 31.5582],
  223. 广州: [113.5107, 23.2196],
  224. 廊坊: [116.521, 39.0509],
  225. 延安: [109.1052, 36.4252],
  226. 张家口: [115.1477, 40.8527],
  227. 徐州: [117.5208, 34.3268],
  228. 德州: [116.6858, 37.2107],
  229. 惠州: [114.6204, 23.1647],
  230. 成都: [103.9526, 30.7617],
  231. 扬州: [119.4653, 32.8162],
  232. 承德: [117.5757, 41.4075],
  233. 拉萨: [91.1865, 30.1465],
  234. 无锡: [120.3442, 31.5527],
  235. 日照: [119.2786, 35.5023],
  236. 昆明: [102.9199, 25.4663],
  237. 杭州: [119.5313, 29.8773],
  238. 枣庄: [117.323, 34.8926],
  239. 柳州: [109.3799, 24.9774],
  240. 株洲: [113.5327, 27.0319],
  241. 武汉: [114.3896, 30.6628],
  242. 汕头: [117.1692, 23.3405],
  243. 江门: [112.6318, 22.1484],
  244. 沈阳: [123.1238, 42.1216],
  245. 沧州: [116.8286, 38.2104],
  246. 河源: [114.917, 23.9722],
  247. 泉州: [118.3228, 25.1147],
  248. 泰安: [117.0264, 36.0516],
  249. 泰州: [120.0586, 32.5525],
  250. 济南: [117.1582, 36.8701],
  251. 济宁: [116.8286, 35.3375],
  252. 海口: [110.3893, 19.8516],
  253. 淄博: [118.0371, 36.6064],
  254. 淮安: [118.927, 33.4039],
  255. 深圳: [114.5435, 22.5439],
  256. 清远: [112.9175, 24.3292],
  257. 温州: [120.498, 27.8119],
  258. 渭南: [109.7864, 35.0299],
  259. 湖州: [119.8608, 30.7782],
  260. 湘潭: [112.5439, 27.7075],
  261. 滨州: [117.8174, 37.4963],
  262. 潍坊: [119.0918, 36.524],
  263. 烟台: [120.7397, 37.5128],
  264. 玉溪: [101.9312, 23.8898],
  265. 珠海: [113.7305, 22.1155],
  266. 盐城: [120.2234, 33.5577],
  267. 盘锦: [121.9482, 41.0449],
  268. 石家庄: [114.4995, 38.1006],
  269. 福州: [119.4543, 25.9222],
  270. 秦皇岛: [119.2126, 40.0232],
  271. 绍兴: [120.564, 29.7565],
  272. 聊城: [115.9167, 36.4032],
  273. 肇庆: [112.1265, 23.5822],
  274. 舟山: [122.2559, 30.2234],
  275. 苏州: [120.6519, 31.3989],
  276. 莱芜: [117.6526, 36.2714],
  277. 菏泽: [115.6201, 35.2057],
  278. 营口: [122.4316, 40.4297],
  279. 葫芦岛: [120.1575, 40.578],
  280. 衡水: [115.8838, 37.7161],
  281. 衢州: [118.6853, 28.8666],
  282. 西宁: [101.4038, 36.8207],
  283. 西安: [109.1162, 34.2004],
  284. 贵阳: [106.6992, 26.7682],
  285. 连云港: [119.1248, 34.552],
  286. 邢台: [114.8071, 37.2821],
  287. 邯郸: [114.4775, 36.535],
  288. 郑州: [113.4668, 34.6234],
  289. 鄂尔多斯: [108.9734, 39.2487],
  290. 重庆: [107.7539, 30.1904],
  291. 金华: [120.0037, 29.1028],
  292. 铜川: [109.0393, 35.1947],
  293. 银川: [106.3586, 38.1775],
  294. 镇江: [119.4763, 31.9702],
  295. 长春: [125.8154, 44.2584],
  296. 长沙: [113.0823, 28.2568],
  297. 长治: [112.8625, 36.4746],
  298. 阳泉: [113.4778, 38.0951],
  299. 青岛: [120.4651, 36.3373],
  300. 韶关: [113.7964, 24.7028]
  301. };
  302. let planePath = "path://M1705.06,1318.313v-89.254l-319.9-221.799l0.073-208.063c0.521-84.662-26.629-121.796-63.961-121.491c-37.332-0.305-64.482,36.829-63.961,121.491l0.073,208.063l-319.9,221.799v89.254l330.343-157.288l12.238,241.308l-134.449,92.931l0.531,42.034l175.125-42.917l175.125,42.917l0.531-42.034l-134.449-92.931l12.238-241.308L1705.06,1318.313z";
  303. let color = ["#fff", "#fff", "#fff"]; //航线的颜色
  304. let series = [];
  305. [
  306. ["长沙", this.XAData],
  307. ["长沙", this.XNData],
  308. ["北京", this.YCData]
  309. ].forEach((item, i) => {
  310. series.push(
  311. {
  312. name: item[0] + " Top3",
  313. type: "lines",
  314. zlevel: 1,
  315. effect: {
  316. show: true,
  317. period: 6,
  318. trailLength: 0.7,
  319. color: "red", //arrow箭头的颜色
  320. symbolSize: 3
  321. },
  322. lineStyle: {
  323. normal: {
  324. color: color[i],
  325. width: 0,
  326. curveness: 0.2
  327. }
  328. },
  329. data: this.convertData(item[1])
  330. },
  331. {
  332. name: item[0] + " Top3",
  333. type: "lines",
  334. zlevel: 2,
  335. symbol: ["none", "arrow"],
  336. symbolSize: 10,
  337. effect: {
  338. show: true,
  339. period: 6,
  340. trailLength: 0,
  341. symbol: planePath,
  342. symbolSize: 15
  343. },
  344. lineStyle: {
  345. normal: {
  346. color: color[i],
  347. width: 1,
  348. opacity: 0.6,
  349. curveness: 0.2
  350. }
  351. },
  352. data: this.convertData(item[1])
  353. },
  354. {
  355. name: item[0] + " Top3",
  356. type: "effectScatter",
  357. coordinateSystem: "geo",
  358. zlevel: 2,
  359. rippleEffect: {
  360. brushType: "stroke"
  361. },
  362. label: {
  363. normal: {
  364. show: true,
  365. position: "right",
  366. formatter: "{b}"
  367. }
  368. },
  369. symbolSize: (val) => {
  370. return val[2] / 8;
  371. },
  372. itemStyle: {
  373. normal: {
  374. color: color[i]
  375. },
  376. emphasis: {
  377. areaColor: "#2B91B7"
  378. }
  379. },
  380. data: item[1].map((dataItem) => {
  381. return {
  382. name: dataItem[1].name,
  383. value: this.geoCoordMap[dataItem[1].name].concat([dataItem[1].value])
  384. };
  385. })
  386. }
  387. );
  388. });
  389. let option = {
  390. tooltip: {
  391. trigger: "item",
  392. formatter: (params, ticket, callback) => {
  393. if (params.seriesType == "effectScatter") {
  394. return "线路:" + params.data.name + "" + params.data.value[2];
  395. } else if (params.seriesType == "lines") {
  396. return (
  397. params.data.fromName +
  398. ">" +
  399. params.data.toName +
  400. "<br />" +
  401. params.data.value
  402. );
  403. } else {
  404. return params.name;
  405. }
  406. }
  407. },
  408. geo: {
  409. map: "china",
  410. label: {
  411. emphasis: {
  412. show: true,
  413. color: "#fff"
  414. }
  415. },
  416. roam: false,
  417. // 放大我们的地图
  418. zoom: 1,
  419. itemStyle: {
  420. normal: {
  421. areaColor: "rgba(43, 196, 243, 0.42)",
  422. borderColor: "rgba(43, 196, 243, 1)",
  423. borderWidth: 1
  424. },
  425. emphasis: {
  426. areaColor: "#2B91B7"
  427. }
  428. }
  429. },
  430. series: series
  431. }
  432. myChart.setOption(option, true);
  433. window.addEventListener("resize", () => {
  434. myChart.resize();
  435. });
  436. }
  437. },
  438. beforeDestroy() {
  439. clearInterval(this.timer);
  440. }
  441. }
  442. </script>
  443. <style lang="scss" scoped>
  444. .brand-container {
  445. position: absolute;
  446. width: 100%;
  447. height: 100%;
  448. background: #000;
  449. .wrap {
  450. background: url(../assets/img/brand/bg.jpg) no-repeat #000;
  451. background-size: cover;
  452. line-height: 1.15;
  453. header {
  454. position: relative;
  455. height: 1rem;
  456. background: url(../assets/img/brand/head_bg.png) no-repeat top center;
  457. background-size: 100% 100%;
  458. h2 {
  459. color: #7ef0ff;
  460. font-size: 0.475rem;
  461. text-align: center;
  462. line-height: 0.75rem;
  463. letter-spacing: 1px;
  464. }
  465. .weather {
  466. position: absolute;
  467. left: 1.375rem;
  468. top: 0.35rem;
  469. font-size: 0.25rem;
  470. color: rgba(126, 240, 255, .7);
  471. img {
  472. width: .45rem;
  473. }
  474. span {
  475. display: inline-block;
  476. }
  477. .tem {
  478. margin: 0 .1rem 0 .2rem;
  479. }
  480. }
  481. .showTime {
  482. position: absolute;
  483. right: 1.375rem;
  484. top: 0.5rem;
  485. color: rgba(126, 240, 255, .7);
  486. display: flex;
  487. .time {
  488. font-size: .28rem;
  489. margin-right: .18rem;
  490. }
  491. .date {
  492. span {
  493. display: block;
  494. &:nth-child(1) {
  495. font-size: .12rem;
  496. text-align: right;
  497. }
  498. &:nth-child(2) {
  499. font-size: .14rem;
  500. }
  501. }
  502. }
  503. }
  504. }
  505. .mainbox {
  506. min-width: 1024px;
  507. max-width: 1920px;
  508. padding: 0.125rem 0.125rem 0;
  509. display: flex;
  510. .item {
  511. flex: 3;
  512. &.center {
  513. flex: 5;
  514. margin: 0 0.125rem 0.1rem;
  515. overflow: hidden;
  516. .resume {
  517. background: rgba(101, 132, 226, 0.1);
  518. padding: 0.1875rem;
  519. .resume-hd {
  520. position: relative;
  521. border: 1px solid rgba(25, 186, 139, 0.17);
  522. ul {
  523. display: flex;
  524. %li-line {
  525. content: "";
  526. position: absolute;
  527. height: 50%;
  528. width: 1px;
  529. background: rgba(255, 255, 255, 0.2);
  530. top: 25%;
  531. }
  532. li {
  533. position: relative;
  534. flex: 1;
  535. text-align: center;
  536. height: 1.2rem;
  537. line-height: 1.2rem;
  538. font-size: 0.65rem;
  539. color: #ffeb7b;
  540. padding: 0.05rem 0;
  541. font-family: 'DIGITALDREAMFAT';
  542. font-weight: bold;
  543. &:nth-child(2) {
  544. &:after {
  545. @extend %li-line;
  546. right: 0;
  547. }
  548. &:before {
  549. @extend %li-line;
  550. left: 0;
  551. }
  552. }
  553. }
  554. }
  555. &:before {
  556. content: "";
  557. position: absolute;
  558. width: 30px;
  559. height: 10px;
  560. border-top: 2px solid #02a6b5;
  561. border-left: 2px solid #02a6b5;
  562. top: 0;
  563. left: 0;
  564. }
  565. &:after {
  566. content: "";
  567. position: absolute;
  568. width: 30px;
  569. height: 10px;
  570. border-bottom: 2px solid #02a6b5;
  571. border-right: 2px solid #02a6b5;
  572. right: 0;
  573. bottom: 0;
  574. }
  575. }
  576. .resume-bd {
  577. ul {
  578. display: flex;
  579. li {
  580. flex: 1;
  581. height: 0.5rem;
  582. line-height: 0.5rem;
  583. text-align: center;
  584. font-size: 0.225rem;
  585. color: rgba(255, 255, 255, 0.7);
  586. padding-top: 0.125rem;
  587. }
  588. }
  589. }
  590. }
  591. }
  592. %map-style {
  593. position: absolute;
  594. top: 50%;
  595. left: 50%;
  596. transform: translate(-50%, -50%);
  597. width: 6.475rem;
  598. height: 6.475rem;
  599. background: url(../assets/img/brand/map.png) no-repeat;
  600. background-size: 100% 100%;
  601. opacity: 0.3;
  602. }
  603. .map {
  604. position: relative;
  605. height: 10.125rem;
  606. .chart {
  607. position: absolute;
  608. top: 0;
  609. left: 0;
  610. z-index: 5;
  611. height: 10.125rem;
  612. width: 100%;
  613. }
  614. .map1 {
  615. @extend %map-style;
  616. }
  617. .map2 {
  618. @extend %map-style;
  619. width: 8.0375rem;
  620. height: 8.0375rem;
  621. background-image: url(../assets/img/brand/lbx.png);
  622. opacity: 0.6;
  623. -webkit-animation: rotate 15s linear infinite;
  624. animation: rotate 15s linear infinite;
  625. z-index: 2;
  626. }
  627. .map3 {
  628. @extend %map-style;
  629. width: 7.075rem;
  630. height: 7.075rem;
  631. background-image: url(../assets/img/brand/jt.png);
  632. -webkit-animation: rotate1 10s linear infinite;
  633. animation: rotate1 10s linear infinite;
  634. }
  635. }
  636. .panel {
  637. position: relative;
  638. height: 3.875rem;
  639. border: 1px solid rgba(25, 186, 139, 0.17);
  640. background: rgba(255, 255, 255, 0.04) url(../assets/img/brand/line.png);
  641. padding: 0 0.1875rem 0;
  642. margin-bottom: 0.1875rem;
  643. &:before {
  644. position: absolute;
  645. top: 0;
  646. left: 0;
  647. content: "";
  648. width: 10px;
  649. height: 10px;
  650. border-top: 2px solid #02a6b5;
  651. border-left: 2px solid #02a6b5;
  652. }
  653. &:after {
  654. position: absolute;
  655. top: 0;
  656. right: 0;
  657. content: "";
  658. width: 10px;
  659. height: 10px;
  660. border-top: 2px solid #02a6b5;
  661. border-right: 2px solid #02a6b5;
  662. }
  663. .panel-footer {
  664. position: absolute;
  665. left: 0;
  666. bottom: 0;
  667. width: 100%;
  668. &:before {
  669. position: absolute;
  670. bottom: 0;
  671. left: 0;
  672. content: "";
  673. width: 10px;
  674. height: 10px;
  675. border-bottom: 2px solid #02a6b5;
  676. border-left: 2px solid #02a6b5;
  677. }
  678. &:after {
  679. position: absolute;
  680. bottom: 0;
  681. right: 0;
  682. content: "";
  683. width: 10px;
  684. height: 10px;
  685. border-bottom: 2px solid #02a6b5;
  686. border-right: 2px solid #02a6b5;
  687. }
  688. }
  689. h2 {
  690. height: 0.6rem;
  691. line-height: 0.6rem;
  692. text-align: center;
  693. color: #fff;
  694. font-size: 0.225rem;
  695. font-weight: 400;
  696. a {
  697. margin: 0 0.1875rem;
  698. color: #fff;
  699. text-decoration: none;
  700. }
  701. }
  702. .chart {
  703. height: 3rem;
  704. }
  705. }
  706. }
  707. }
  708. }
  709. }
  710. @-webkit-keyframes rotate {
  711. from {
  712. transform: translate(-50%, -50%) rotate(0deg);
  713. }
  714. to {
  715. transform: translate(-50%, -50%) rotate(360deg);
  716. }
  717. }
  718. @keyframes rotate {
  719. from {
  720. transform: translate(-50%, -50%) rotate(0deg);
  721. }
  722. to {
  723. transform: translate(-50%, -50%) rotate(360deg);
  724. }
  725. }
  726. @-webkit-keyframes rotate1 {
  727. from {
  728. transform: translate(-50%, -50%) rotate(0deg);
  729. }
  730. to {
  731. transform: translate(-50%, -50%) rotate(-360deg);
  732. }
  733. }
  734. @keyframes rotate1 {
  735. from {
  736. transform: translate(-50%, -50%) rotate(0deg);
  737. }
  738. to {
  739. transform: translate(-50%, -50%) rotate(-360deg);
  740. }
  741. }
  742. @media screen and (max-width: 1024px) {
  743. html {
  744. font-size: 42px !important;
  745. }
  746. }
  747. @media screen and (min-width: 1920) {
  748. html {
  749. font-size: 80px !important;
  750. }
  751. }
  752. </style>