|
|
@@ -1,429 +1,72 @@
|
|
|
<template>
|
|
|
- <div
|
|
|
- style="position: absolute;width: 100%;height: 100%;top: 0;overflow: hidden;pointer-events: none;z-index: 999999999999999;">
|
|
|
+ <div style="position: absolute;width: 100%;height: 100%;top: 0;overflow: hidden;pointer-events: none;">
|
|
|
<!-- 园区信息 -->
|
|
|
<info-box class="toRight " top="0" left="0" width="21%" height="63%" title="园区信息" mode="right-min" :more="true">
|
|
|
- <div class="infoClass" style="font-style: normal;color: #FFFFFF;">
|
|
|
- <div>园区名称: 信阳榕基软件园</div>
|
|
|
- <div>建成年份: 1993年</div>
|
|
|
- <div>占地面积: 130亩</div>
|
|
|
- <div>建筑面积: 18万平方米</div>
|
|
|
- <div>住宅面积: 5万平方米</div>
|
|
|
- <div>园区地址:信阳市南湾湖风景区新七大道西段</div>
|
|
|
- <div>园区背景:信阳榕基软件园所属福建榕基软件股份有限公司。成立于1993年,2010年在深交所挂牌上市(股票代码:002474),专注于行业应用软件研发、系统集成和运维服务,
|
|
|
- 为党政、质检、能源、司法、环保等行业提供信息系统全生命周期、全方位服务。</div>
|
|
|
- </div>
|
|
|
- <div class="infoData">
|
|
|
- <div class="card" v-for="(item,index) in parInfoList" :key="index">
|
|
|
- <div>{{item.label}}</div>
|
|
|
- <div>{{item.value}}</div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
+ <agency-info></agency-info>
|
|
|
</info-box>
|
|
|
|
|
|
<!-- 企业类型 -->
|
|
|
<info-box class="toRight " bottom="0" left="0" width="21%" height="35%" title="企业类型" mode="right-min" :more="true">
|
|
|
- <div class="full" id="enterpriseType"></div>
|
|
|
+ <enterpriseType></enterpriseType>
|
|
|
</info-box>
|
|
|
|
|
|
|
|
|
<!-- 周边配套分析 -->
|
|
|
<info-box class="toLeft" mode="left-min" bottom="0" right="0" width="21%" height="35%" title="周边配套分析" :more="true">
|
|
|
- <div class="full" style="display: flex;justify-content: center;align-items: flex-end;">
|
|
|
- <div class="full" id="matingInfo"></div>
|
|
|
- </div>
|
|
|
+ <mating-info></mating-info>
|
|
|
</info-box>
|
|
|
|
|
|
<!-- 视频监控 -->
|
|
|
<info-box class="toLeft " top="0" right="0" width="21%" height="33%" title="视频监控" mode="left-min" :more="true">
|
|
|
- <div class="full center" style="align-items: flex-start">
|
|
|
- <div class="" style="width: 100%;">
|
|
|
- <div v-if="index<4" @click="playVideo(item.deviceId, item.channelId)"
|
|
|
- style="display: flex;background-color: rgba(255, 255, 255,.95);margin:15px;padding: 12px;border-radius: 0.3rem;"
|
|
|
- v-for="(item,index) in channelList" :key="index">
|
|
|
- <div class="center" style="margin-right: 0.6rem;">
|
|
|
- <div class="el-icon-video-play" style="font-size: 20px;"></div>
|
|
|
- </div>
|
|
|
- <div class="center">
|
|
|
- {{item.name}}
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
+ <video-list></video-list>
|
|
|
</info-box>
|
|
|
+
|
|
|
+
|
|
|
<!-- 车位信息 -->
|
|
|
<info-box mode="left-min" class="toLeft " top="35%" right="0" width="21%" height="28%" title="车位信息" :more="true">
|
|
|
- <div class="full">
|
|
|
- <div style="height: 100%;width: 50%;float: left" class="center">
|
|
|
- <div class="roundBox center">
|
|
|
- <div
|
|
|
- style="width: 150px;height: 150px;background: linear-gradient(to bottom,rgba(0,213,250,0.3),transparent,transparent)"
|
|
|
- class="roundBox center">
|
|
|
- <div class="wave1"></div>
|
|
|
- <div class="wave2"></div>
|
|
|
- <div class="wave3"></div>
|
|
|
- <div class="full center"
|
|
|
- style="z-index: 9;color: white;font-size: 1.25rem;text-shadow: 2px 2px 5px #282727">
|
|
|
- 空车位: 97
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div style="height: 100%;width: 50%;flex-direction: column;margin-left: -1.625rem;" class="center">
|
|
|
- <div
|
|
|
- style="width: 90%;height: 60px;font-size: 1rem;color: white;letter-spacing: 2px;text-shadow: 2px 2px 5px #282727"
|
|
|
- v-for="item of carInfoList" :key="item">
|
|
|
- <span>{{item.label}}</span>
|
|
|
- <span style="margin-left: 1.25rem;font-size: 20px;font-weight: 800;"
|
|
|
- :style="{color: item.color}">{{item.value}}</span>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
+ <carInfo></carInfo>
|
|
|
</info-box>
|
|
|
|
|
|
|
|
|
<!-- 园区事件 -->
|
|
|
-
|
|
|
<info-box mode="top-min" class="toTop " bottom="0" right="22%" left="22%" width="56%" height="35%" title="园区事件"
|
|
|
:more="true">
|
|
|
- <div class="full center" style="align-items: flex-start;padding-top: 0.6rem;">
|
|
|
- <div class="" style="width: 100%;">
|
|
|
- <div v-if="index<4" @click.stop="openDialog(item)"
|
|
|
- style="display: flex;justify-content: space-between;background-color: rgba(255, 255, 255,.95);margin:15px;padding: 15px;border-radius: 0.3rem;"
|
|
|
- v-for="(item,index) in eventList" :key="index">
|
|
|
- <div>{{item.detail}}</div>
|
|
|
- <div style="color: #999;">{{item.time}}</div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
+ <incident></incident>
|
|
|
</info-box>
|
|
|
-
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
- import {
|
|
|
- reqFullScreen,fullscreenEnable
|
|
|
- } from "../../util/util.js";
|
|
|
+ import {reqFullScreen,fullscreenEnable } from "../../util/util.js";
|
|
|
import mpDialog from "../mp-dialog.vue"
|
|
|
+ import enterpriseType from "./comps/enterprise-type.vue"
|
|
|
+ import matingInfo from "./comps/mating-info.vue"
|
|
|
+ import incident from "./comps/incident.vue"
|
|
|
+ import agencyInfo from "./comps/agency-info.vue"
|
|
|
+ import carInfo from "./comps/car-info.vue"
|
|
|
+ import videoList from "./comps/video-list.vue"
|
|
|
import InfoBox from "./infoBox";
|
|
|
- import player from './wvp/jessibuca'
|
|
|
- import * as echarts from 'echarts';
|
|
|
- import {
|
|
|
- getDeviceList,
|
|
|
- getChannelList,
|
|
|
- startPlay
|
|
|
- } from "../../api/third/wvp";
|
|
|
export default {
|
|
|
name: "mainScene",
|
|
|
components: {
|
|
|
mpDialog,
|
|
|
InfoBox,
|
|
|
- player,
|
|
|
- },
|
|
|
- mounted() {
|
|
|
- this.initCharts();
|
|
|
- window.addEventListener('resize', this.resize);
|
|
|
- setInterval(() => {
|
|
|
- let list = this.eventList;
|
|
|
- list.push(list[0]);
|
|
|
- list.splice(0, 1);
|
|
|
- this.eventList = list;
|
|
|
- }, 3000)
|
|
|
- },
|
|
|
- watch: {
|
|
|
- $route() {
|
|
|
- this.resize()
|
|
|
- }
|
|
|
- },
|
|
|
- created() {
|
|
|
- this.loadVideoList(1, 10);
|
|
|
+ enterpriseType,
|
|
|
+ matingInfo,
|
|
|
+ agencyInfo,
|
|
|
+ carInfo,
|
|
|
+ videoList,
|
|
|
+ incident
|
|
|
},
|
|
|
data() {
|
|
|
return {
|
|
|
isOpen: true,
|
|
|
- controls: {},
|
|
|
- deviceList: [],
|
|
|
- channelList: [],
|
|
|
- carInfoList: [{
|
|
|
- label: '停车场',
|
|
|
- value: '3个',
|
|
|
- color: '#ee6666'
|
|
|
- },
|
|
|
- {
|
|
|
- label: '车位总数',
|
|
|
- value: '230位',
|
|
|
- color: '#ea7ccc'
|
|
|
- },
|
|
|
- {
|
|
|
- label: '车辆道闸',
|
|
|
- value: '8个',
|
|
|
- color: '#91cc75'
|
|
|
- },
|
|
|
- ],
|
|
|
- parInfoList: [{
|
|
|
- label: '总面积',
|
|
|
- value: '38900',
|
|
|
- },
|
|
|
- {
|
|
|
- label: '楼栋数量',
|
|
|
- value: '23',
|
|
|
- },
|
|
|
- {
|
|
|
- label: '办公人数',
|
|
|
- value: '3566',
|
|
|
- },
|
|
|
- {
|
|
|
- label: '总办公区域',
|
|
|
- value: '45',
|
|
|
- },
|
|
|
- {
|
|
|
- label: '总入驻企业',
|
|
|
- value: '44',
|
|
|
- },
|
|
|
- {
|
|
|
- label: '入住率',
|
|
|
- value: '88%',
|
|
|
- },
|
|
|
- {
|
|
|
- label: '员工宿舍',
|
|
|
- value: '4栋',
|
|
|
- },
|
|
|
- {
|
|
|
- label: '员工餐厅',
|
|
|
- value: '2栋',
|
|
|
- },
|
|
|
- {
|
|
|
- label: '写字楼',
|
|
|
- value: '6栋',
|
|
|
- },
|
|
|
- ],
|
|
|
- matingList: [{
|
|
|
- icon: '/data/mai.png',
|
|
|
- label: '员工宿舍',
|
|
|
- value: '4栋',
|
|
|
- color: '#b72e2e'
|
|
|
- },
|
|
|
- {
|
|
|
- icon: '/data/mai.png',
|
|
|
- label: '员工餐厅',
|
|
|
- value: '2间',
|
|
|
- color: '#314817'
|
|
|
- },
|
|
|
- {
|
|
|
- icon: '/data/mai.png',
|
|
|
- label: '健身房',
|
|
|
- value: '3间',
|
|
|
- color: '#5b4a2c'
|
|
|
- },
|
|
|
- {
|
|
|
- icon: '/data/mai.png',
|
|
|
- label: '写字楼',
|
|
|
- value: '4栋',
|
|
|
- color: '#206b65'
|
|
|
- },
|
|
|
- {
|
|
|
- icon: '/data/mai.png',
|
|
|
- label: '休闲区',
|
|
|
- value: '1套',
|
|
|
- color: '#233964'
|
|
|
- },
|
|
|
- {
|
|
|
- icon: '/data/mai.png',
|
|
|
- label: '广场',
|
|
|
- value: '1个',
|
|
|
- color: '#673636'
|
|
|
- },
|
|
|
- ],
|
|
|
- enterpriseTypeInfo: {},
|
|
|
- enterpriseTypeOption: {
|
|
|
- tooltip: {
|
|
|
- trigger: 'item',
|
|
|
- formatter: '{a}<br/>{b} : {c} ({d}%)'
|
|
|
- },
|
|
|
- textStyle: {
|
|
|
- color: "white",
|
|
|
- fontWeight: 100,
|
|
|
- fontSize: 11,
|
|
|
- },
|
|
|
- legend: {
|
|
|
- type: 'scroll',
|
|
|
- orient: 'vertical',
|
|
|
- textStyle: {
|
|
|
- color: "white",
|
|
|
- fontWeight: 100,
|
|
|
- fontSize: 10
|
|
|
- },
|
|
|
- right: 10,
|
|
|
- top: 20,
|
|
|
- data: ['商务服务', '科研服务', '信息技术', '批发零售', '制造业', '仓储运输', '房地产业', '文体娱乐', '金融业'],
|
|
|
- selected: '商务服务',
|
|
|
- },
|
|
|
- series: [{
|
|
|
- name: '类型',
|
|
|
- type: 'pie',
|
|
|
- radius: '50%',
|
|
|
- center: ['40%', '50%'],
|
|
|
- data: [{
|
|
|
- name: '商务服务',
|
|
|
- value: '30000'
|
|
|
- },
|
|
|
- {
|
|
|
- name: '科研服务',
|
|
|
- value: '30000'
|
|
|
- },
|
|
|
- {
|
|
|
- name: '信息技术',
|
|
|
- value: '10000'
|
|
|
- },
|
|
|
- {
|
|
|
- name: '批发零售',
|
|
|
- value: '45000'
|
|
|
- },
|
|
|
- {
|
|
|
- name: '制造业',
|
|
|
- value: '30000'
|
|
|
- },
|
|
|
- {
|
|
|
- name: '仓储运输',
|
|
|
- value: '30000'
|
|
|
- },
|
|
|
- {
|
|
|
- name: '房地产业',
|
|
|
- value: '2000'
|
|
|
- },
|
|
|
- {
|
|
|
- name: '文体娱乐',
|
|
|
- value: '30000'
|
|
|
- },
|
|
|
- {
|
|
|
- name: '金融业',
|
|
|
- value: '30000'
|
|
|
- },
|
|
|
- ],
|
|
|
- }]
|
|
|
- },
|
|
|
- matingOption: {
|
|
|
- textStyle: {
|
|
|
- color: "white",
|
|
|
- fontWeight: 100,
|
|
|
- fontSize: 14
|
|
|
- },
|
|
|
- tooltip: {
|
|
|
- trigger: 'item',
|
|
|
- formatter: '{b} : {c}'
|
|
|
- },
|
|
|
- legend: {
|
|
|
- type: 'scroll',
|
|
|
- textStyle: {
|
|
|
- color: "white",
|
|
|
- fontWeight: 100,
|
|
|
- fontSize: 14
|
|
|
- },
|
|
|
- top: 10,
|
|
|
- data: ['柱状图', '折线图'],
|
|
|
- },
|
|
|
- grid: {
|
|
|
- show: false, //---是否显示直角坐标系网格
|
|
|
- left: 60,
|
|
|
- bottom: 40, //---相对位置,top\bottom\left\right
|
|
|
- containLabel: false, //---grid 区域是否包含坐标轴的刻度标签
|
|
|
- },
|
|
|
- xAxis: {
|
|
|
- type: 'category',
|
|
|
- data: ['住宅区', '科教文化', '写字楼', '住宅服务', '购物服务', '医疗保健', '交通设施']
|
|
|
- },
|
|
|
- yAxis: {
|
|
|
- type: 'value',
|
|
|
- boundaryGap: [0, 0.01]
|
|
|
- },
|
|
|
- series: [{
|
|
|
- name: "柱状图",
|
|
|
- data: [150, 230, 224, 218, 135, 147, 260],
|
|
|
- type: 'bar'
|
|
|
- },
|
|
|
- {
|
|
|
- name: '折线图',
|
|
|
- data: [150, 230, 224, 218, 135, 147, 260],
|
|
|
- type: 'line'
|
|
|
- }
|
|
|
- ]
|
|
|
- },
|
|
|
- matingInfo: {},
|
|
|
- eventList: [{
|
|
|
- icon: '/icon/car2.png',
|
|
|
- time: '2021/06/21 09:50:21',
|
|
|
- detail: '烟雾告警:软件园区(E栋)3002 单元房间烟雾告警'
|
|
|
- },
|
|
|
- {
|
|
|
- icon: '/icon/car2.png',
|
|
|
- time: '2021/06/18 08:33:22',
|
|
|
- detail: '梯控告警:软件园(C栋)2号梯 电梯夹门告警,请及时处理'
|
|
|
- },
|
|
|
- {
|
|
|
- icon: '/icon/car2.png',
|
|
|
- time: '2021/06/18 15:16:12',
|
|
|
- detail: '道闸告警:车辆车牌抓拍异常告警'
|
|
|
- },
|
|
|
- {
|
|
|
- icon: '/icon/car2.png',
|
|
|
- time: '2021/06/12 09:50:21',
|
|
|
- detail: '梯控告警:软件园(A栋)1号梯 电梯夹门告警,请及时处理'
|
|
|
- },
|
|
|
- {
|
|
|
- icon: '/icon/car2.png',
|
|
|
- time: '2021/06/21 21:20:33',
|
|
|
- detail: '施工管理:工地扬尘;施工过程中或者施工堆料未采取有效防尘措施造成扬尘现象'
|
|
|
- },
|
|
|
- {
|
|
|
- icon: '/icon/car2.png',
|
|
|
- time: '2021/06/10 05:21:20',
|
|
|
- detail: '突发事件:道路积水;道路(桥涵)大面积积水,影响通行的现象'
|
|
|
- },
|
|
|
- {
|
|
|
- icon: '/icon/car2.png',
|
|
|
- time: '2021/06/13 12:25:21',
|
|
|
- detail: '烟雾告警:软件园区(D栋)1002 单元房间烟雾告警'
|
|
|
- },
|
|
|
- {
|
|
|
- icon: '/icon/car2.png',
|
|
|
- time: '2021/06/18 06:33:05',
|
|
|
- detail: '街面秩序:机动车乱停放;在未经许可、未合法设置停车泊位的地点停放机动车辆'
|
|
|
- },
|
|
|
- {
|
|
|
- icon: '/icon/car2.png',
|
|
|
- time: '2021/06/16 13:05:03',
|
|
|
- detail: '施工管理:工地扬尘;施工过程中或者施工堆料未采取有效防尘措施造成扬尘现象'
|
|
|
- },
|
|
|
- {
|
|
|
- icon: '/icon/car2.png',
|
|
|
- time: '2021/06/17 13:21:45',
|
|
|
- detail: '施工管理:施工占道;施工过程中未经审批擅自占道的现象'
|
|
|
- },
|
|
|
- {
|
|
|
- icon: '/icon/car2.png',
|
|
|
- time: '2021/06/15 03:22:13',
|
|
|
- detail: '烟雾告警:软件园区(A栋)5012 单元房间烟雾告警'
|
|
|
- },
|
|
|
- {
|
|
|
- icon: '/icon/car2.png',
|
|
|
- time: '2021/06/12 05:06:51',
|
|
|
- detail: '突发事件:道路积水;道路(桥涵)大面积积水,影响通行的现象'
|
|
|
- },
|
|
|
- ]
|
|
|
}
|
|
|
},
|
|
|
methods: {
|
|
|
openDialog(item) {
|
|
|
this.$emit('openDialog', item)
|
|
|
},
|
|
|
- resize() {
|
|
|
- let _this = this
|
|
|
- setTimeout(() => {
|
|
|
- _this.matingInfo.resize();
|
|
|
- _this.enterpriseTypeInfo.resize();
|
|
|
- }, 500)
|
|
|
- },
|
|
|
infoBoxShow(show) {
|
|
|
if (!fullscreenEnable()) {
|
|
|
reqFullScreen()
|
|
|
@@ -438,42 +81,6 @@
|
|
|
})
|
|
|
this.$emit('showInfoBox',this.isOpen)
|
|
|
},
|
|
|
- initCharts() {
|
|
|
- this.enterpriseTypeInfo = echarts.init(document.getElementById('enterpriseType'));
|
|
|
- this.enterpriseTypeInfo.setOption(this.enterpriseTypeOption);
|
|
|
- this.matingInfo = echarts.init(document.getElementById('matingInfo'));
|
|
|
- this.matingInfo.setOption(this.matingOption);
|
|
|
- },
|
|
|
- loadVideoList() {
|
|
|
- let that = this;
|
|
|
- getDeviceList(1, 10, null).then(res => {
|
|
|
- that.deviceList = res.data.data.records;
|
|
|
- that.deviceList.forEach(item => {
|
|
|
- getChannelList(1, 100, item.deviceId, null).then(res => {
|
|
|
- that.channelList = that.channelList.concat(res.data.data.records);
|
|
|
- })
|
|
|
- })
|
|
|
- })
|
|
|
- },
|
|
|
- playVideo(deviceId, channelId) {
|
|
|
- startPlay(deviceId, channelId).then(res => {
|
|
|
- if (res.data.code == 200) {
|
|
|
- let info = {
|
|
|
- streamInfo: res.data.data,
|
|
|
- hasAudio: true
|
|
|
- }
|
|
|
- let data = {
|
|
|
- deviceId,
|
|
|
- channelId,
|
|
|
- info
|
|
|
- }
|
|
|
- this.$emit('playVideo', data)
|
|
|
-
|
|
|
- } else {
|
|
|
- this.$message.error(res.data.msg);
|
|
|
- }
|
|
|
- })
|
|
|
- }
|
|
|
},
|
|
|
}
|
|
|
</script>
|
|
|
@@ -484,151 +91,4 @@
|
|
|
justify-content: center;
|
|
|
align-items: center;
|
|
|
}
|
|
|
-
|
|
|
- .infoClass {
|
|
|
- width: 90%;
|
|
|
- height: 300px;
|
|
|
- font-size: 0.74rem;
|
|
|
- font-weight: 100;
|
|
|
- margin: 0 auto;
|
|
|
- letter-spacing: 0.3125rem;
|
|
|
- overflow: hidden;
|
|
|
- font-style: normal;
|
|
|
- font-family: PingFangSC-Regular;
|
|
|
-
|
|
|
- div {
|
|
|
- line-height: 1.4rem;
|
|
|
- }
|
|
|
-
|
|
|
- div:first-child {
|
|
|
- padding-top: 0.8rem;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- .infoData {
|
|
|
- width: 100%;
|
|
|
- display: flex;
|
|
|
- justify-content: space-around;
|
|
|
- align-items: center;
|
|
|
- flex-wrap: wrap;
|
|
|
-
|
|
|
- .card {
|
|
|
- display: flex;
|
|
|
- justify-content: center;
|
|
|
- align-items: flex-start;
|
|
|
- flex-direction: column;
|
|
|
- width: 30%;
|
|
|
- margin-bottom: 1rem;
|
|
|
- text-indent: 0.8rem;
|
|
|
- border-radius: 0.16rem;
|
|
|
- background-color: #FFFFFF;
|
|
|
- padding: 0.5rem 0;
|
|
|
-
|
|
|
- div:first-child {
|
|
|
- font-size: 0.64rem;
|
|
|
- color: #818181;
|
|
|
- }
|
|
|
-
|
|
|
- div:last-child {
|
|
|
- padding-top: 0.10rem;
|
|
|
- font-size: 1.2rem;
|
|
|
- color: #333;
|
|
|
- font-weight: 500;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- .iconTagBox {
|
|
|
- width: 90%;
|
|
|
- height: 90%;
|
|
|
- border-radius: 5px 5px 20px 5px;
|
|
|
- box-shadow: 2px 2px 5px #282727;
|
|
|
- /*background: #00bdff;*/
|
|
|
- }
|
|
|
-
|
|
|
- .event-item:hover {
|
|
|
- cursor: pointer;
|
|
|
- background: rgba(107, 92, 62, 0.5);
|
|
|
- box-shadow: 2px 2px 5px #282727;
|
|
|
- }
|
|
|
-
|
|
|
- .event-item {
|
|
|
- animation: slide-in-bottom 0.5s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
|
|
|
- }
|
|
|
-
|
|
|
- @keyframes slide-in-bottom {
|
|
|
- 0% {
|
|
|
- -webkit-transform: translateY(1000px);
|
|
|
- transform: translateY(1000px);
|
|
|
- opacity: 0;
|
|
|
- }
|
|
|
-
|
|
|
- 100% {
|
|
|
- -webkit-transform: translateY(0);
|
|
|
- transform: translateY(0);
|
|
|
- opacity: 1;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- .roundBox {
|
|
|
- position: relative;
|
|
|
- width: 160px;
|
|
|
- height: 160px;
|
|
|
- border-radius: 50%;
|
|
|
- border: 1px #00e3ff solid;
|
|
|
- box-shadow: 2px 2px 5px #020202;
|
|
|
- overflow: hidden;
|
|
|
- animation: water-wave linear infinite;
|
|
|
- }
|
|
|
-
|
|
|
- .wave1 {
|
|
|
- position: absolute;
|
|
|
- top: 40%;
|
|
|
- left: -25%;
|
|
|
- background: #33cfff;
|
|
|
- opacity: .7;
|
|
|
- width: 200%;
|
|
|
- height: 200%;
|
|
|
- border-radius: 40%;
|
|
|
- animation: inherit;
|
|
|
- animation-duration: 5s;
|
|
|
- }
|
|
|
-
|
|
|
- .wave2 {
|
|
|
- position: absolute;
|
|
|
- top: 40%;
|
|
|
- left: -35%;
|
|
|
- background: #0eaffe;
|
|
|
- opacity: .7;
|
|
|
- width: 200%;
|
|
|
- height: 200%;
|
|
|
- border-radius: 35%;
|
|
|
- animation: inherit;
|
|
|
- animation-duration: 7s;
|
|
|
- }
|
|
|
-
|
|
|
- .wave3 {
|
|
|
- position: absolute;
|
|
|
- top: 50%;
|
|
|
- left: -35%;
|
|
|
- background: #0f7ea4;
|
|
|
- opacity: .3;
|
|
|
- width: 200%;
|
|
|
- height: 200%;
|
|
|
- border-radius: 33%;
|
|
|
- animation: inherit;
|
|
|
- animation-duration: 11s;
|
|
|
- }
|
|
|
-
|
|
|
- @keyframes water-wave {
|
|
|
- 0% {
|
|
|
- transform: rotate(0deg);
|
|
|
- }
|
|
|
-
|
|
|
- 100% {
|
|
|
- transform: rotate(360deg);
|
|
|
- }
|
|
|
- }
|
|
|
</style>
|