使用HTML5和CSS3实现雷达扫描超炫丽效果,它的一大特点是3D立体的视觉效果,鼠标点击雷达后将会展现一张3D立体地图,并且对地图上指定的几个地点进行坐标详细信息描述。
下面我讲解一下我是怎么写的
HTML代码
首先HTML代码非常简单,只需在页面上展示一个div容器即可。
<div class="radar"></div>
CSS代码
这里主要利用了CSS3的旋转等动画特性,看看以下的CSS代码,主要是完成所有的动画:
@-webkit-keyframes flashing { 0%, 30% { -webkit-transform: scale(1); transform: scale(1); } 70%, 100% { -webkit-transform: scale(0); transform: scale(0); } } @keyframes flashing { 0%, 30% { -webkit-transform: scale(1); transform: scale(1); } 70%, 100% { -webkit-transform: scale(0); transform: scale(0); } } @-webkit-keyframes pulsation { 0% { -webkit-transform: scale(0); transform: scale(0); border-color: red; background-color: rgba(255, 0, 0, 0.6); } 80%, 100% { -webkit-transform: scale(1); transform: scale(1); border-color: rgba(255, 0, 0, 0.2); background-color: rgba(255, 0, 0, 0.1); } } @keyframes pulsation { 0% { -webkit-transform: scale(0); transform: scale(0); border-color: red; background-color: rgba(255, 0, 0, 0.6); } 80%, 100% { -webkit-transform: scale(1); transform: scale(1); border-color: rgba(255, 0, 0, 0.2); background-color: rgba(255, 0, 0, 0.1); } } @-webkit-keyframes rotation { from { -webkit-transform: rotate(0deg) translateZ(1px); transform: rotate(0deg) translateZ(1px); } to { -webkit-transform: rotate(360deg) translateZ(1px); transform: rotate(360deg) translateZ(1px); } } @keyframes rotation { from { -webkit-transform: rotate(0deg) translateZ(1px); transform: rotate(0deg) translateZ(1px); } to { -webkit-transform: rotate(360deg) translateZ(1px); transform: rotate(360deg) translateZ(1px); } } @-webkit-keyframes scale { from { -webkit-transform: scale(1); transform: scale(1); } to { -webkit-transform: scale(1.3); transform: scale(1.3); } } @keyframes scale { from { -webkit-transform: scale(1); transform: scale(1); } to { -webkit-transform: scale(1.3); transform: scale(1.3); } } @-webkit-keyframes polish { 30%, 100% { -webkit-transform: skewX(35deg) translateX(380%); transform: skewX(35deg) translateX(380%); } } @keyframes polish { 30%, 100% { -webkit-transform: skewX(35deg) translateX(380%); transform: skewX(35deg) translateX(380%); } }
当然这个雷达光是有动画是不行的,还得有漂亮的外观,用以下CSS代码实现:
.radar { height: 40em; width: 48em; position: relative; cursor: pointer; -webkit-perspective: 62.5em; perspective: 62.5em; } .radar .radar-map-container, .radar .risk-points, .radar .scanning-circle canvas { left: 0; top: 0; position: absolute; } .radar .radar-map-container, .radar .radar-map, .radar .scanning-circle, .radar .risk-elements-group { -webkit-transition: opacity 2.5s ease-out, -webkit-transform 2.5s ease-out, -webkit-transform-origin; transition: opacity 2.5s ease-out, -webkit-transform 2.5s ease-out, -webkit-transform-origin; transition: transform 2.5s ease-out, opacity 2.5s ease-out, transform-origin; transition: transform 2.5s ease-out, opacity 2.5s ease-out, transform-origin, -webkit-transform 2.5s ease-out, -webkit-transform-origin; } .radar .radar-map-container, .radar .radar-map, .radar .scanning-circle { will-change: transform; } .radar .radar-map-container { width: 400%; height: 400%; left: -150%; top: -150%; -webkit-transform: scale(0.25); transform: scale(0.25); -webkit-transform-style: preserve-3d; transform-style: preserve-3d; } .radar .radar-map { color: rgba(19, 182, 206, 0.4); background: url('http://i64.tinypic.com/5l17ut.jpg') center / contain no-repeat; width: 100%; height: 100%; -webkit-transform-style: preserve-3d; transform-style: preserve-3d; } .radar .radar-map.roaming { -webkit-transition-duration: 5s !important; transition-duration: 5s !important; -webkit-transition-timing-function: ease-in-out; transition-timing-function: ease-in-out; -webkit-transition-delay: .5s; transition-delay: .5s; } .radar .radar-map .risk-elements-group { opacity: 0; -webkit-transform-style: preserve-3d; transform-style: preserve-3d; } .radar .radar-map .risk-elements-group .red-flag, .radar .radar-map .risk-elements-group .info-panel, .radar .radar-map .risk-elements-group .dashed-circle { position: absolute; } .radar .radar-map .risk-elements-group .red-flag, .radar .radar-map .risk-elements-group .dashed-circle { visibility: hidden; } .radar .radar-map .risk-elements-group .red-flag, .radar .radar-map .risk-elements-group .info-panel { -webkit-transform-origin: bottom; transform-origin: bottom; -webkit-transform: rotateX(-70deg); transform: rotateX(-70deg); } .radar .radar-map .risk-elements-group .red-flag { width: 0.5em; height: 10em; background-color: white; -webkit-transform: rotateX(-70deg) rotateZ(-90deg); transform: rotateX(-70deg) rotateZ(-90deg); } .radar .radar-map .risk-elements-group .red-flag.stand-up { -webkit-transform: rotateX(-70deg); transform: rotateX(-70deg); visibility: visible; } .radar .radar-map .risk-elements-group .red-flag:before { content: attr(data-city); font-weight: bold; color: white; position: absolute; background-color: red; -webkit-clip-path: polygon(0 0, 100% 50%, 0 100%); -moz-clip-path: polygon(0 0, 100% 50%, 0 100%); clip-path: polygon(0 0, 100% 50%, 0 100%); width: 4.782608695652174em; height: 3.4782608695652173em; line-height: 3.4782608695652173em; font-size: 1.4375em; font-family: 微软雅黑; letter-spacing: 0.43478260869565216em; padding-left: 0.5217391304347826em; -webkit-box-sizing: border-box; box-sizing: border-box; top: 0.43478260869565216em; white-space: nowrap; } .radar .radar-map .risk-elements-group .red-flag:after { content: ''; position: absolute; width: 2.1875em; height: 0.625em; border-radius: 50%; background-color: inherit; top: calc(100% - 0.625em); left: calc(50% - 1.09375em); } .radar .radar-map .risk-elements-group .info-panel { -webkit-transform: rotateX(-70deg) translateY(-30%); transform: rotateX(-70deg) translateY(-30%); -webkit-filter: opacity(0); -moz-filter: opacity(0); filter: opacity(0); border: 0.0625em solid #DCDA6B; border-radius: 0.25em; background-color: rgba(245, 228, 158, 0.31); display: table; font-weight: bold; font-size: 2.5em; text-shadow: 0.025em 0.025em 0.05em black; padding: 0.2em 0.3em; font-family: 黑体; overflow: hidden; } .radar .radar-map .risk-elements-group .info-panel.showup { -webkit-filter: opacity(1); -moz-filter: opacity(1); filter: opacity(1); transition: -webkit-filter 1s linear 0.5s, -moz-filter 1s linear 0.5s, filter 1s linear 0.5s, opacity 0.5s linear; } .radar .radar-map .risk-elements-group .info-panel.polish:after { -webkit-animation: polish 5s linear 1 1s; animation: polish 5s linear 1 1s; } .radar .radar-map .risk-elements-group .info-panel .info-title { background-image: -webkit-gradient(linear, left top, right top, from(rgba(208, 209, 120, 0.6)), to(rgba(223, 226, 183, 0.05))); background-image: linear-gradient(to right, rgba(208, 209, 120, 0.6), rgba(223, 226, 183, 0.05)); color: #FFE401; padding: 0 0.275em; border-radius: inherit; } .radar .radar-map .risk-elements-group .info-panel .info-content { color: white; margin: 0.25em; line-height: 1.3em; } .radar .radar-map .risk-elements-group .info-panel:after { content: ''; position: absolute; width: 30%; height: 100%; -webkit-transform: skewX(35deg) translateX(-160%); transform: skewX(35deg) translateX(-160%); top: 0; background-image: -webkit-gradient(linear, left top, right top, from(transparent), color-stop(rgba(255, 255, 255, 0.3)), to(transparent)); background-image: linear-gradient(to right, transparent, rgba(255, 255, 255, 0.3), transparent); } .radar .radar-map .risk-elements-group .dashed-circle { width: 7.5em; height: 7.5em; border-radius: 50%; background: center / contain no-repeat; -webkit-animation: rotation 5s linear infinite; animation: rotation 5s linear infinite; -webkit-transition-property: visibility; transition-property: visibility; } .radar .radar-map .risk-elements-group .dashed-circle:after { content: ''; border-radius: inherit; margin: auto; width: 15%; height: 15%; background-color: #E03636; -webkit-box-shadow: 0 0 0.9375em black; box-shadow: 0 0 0.9375em black; -webkit-animation: scale 1s linear infinite alternate; animation: scale 1s linear infinite alternate; position: absolute; left: 0; right: 0; top: 0; bottom: 0; } .radar .changing-number-container { position: absolute; right: 12%; top: 10%; bottom: 0; margin: auto; } .radar .changing-number-container { display: table; color: #10ABE0; } .radar .changing-number-container:before, .radar .changing-number-container:after { display: inline-block; } .radar .changing-number-container:before { content: ''; background: -webkit-gradient(linear, left top, left bottom, color-stop(45%, transparent), color-stop(55%, currentColor), color-stop(55%, transparent)) center / 100% 1em; background: linear-gradient(to bottom, transparent 45%, currentColor 55%, transparent 55%) center / 100% 1em; width: 1em; height: 100%; margin-right: 0.625em; } .radar .changing-number-container:after { font-size: 0.75em; content: attr(data-number); width: 1.3333333333333333em; line-height: 1.3333333333333333em; word-break: break-all; letter-spacing: 1.3333333333333333em; vertical-align: top; font-weight: bold; } .radar .risk-points { z-index: 15; } .radar .risk-points .risk-point-group .risk-point { position: absolute; width: 0.625em; height: 0.625em; border-radius: 50%; -webkit-filter: blur(2px); } .radar .risk-points .risk-point-group .risk-point:after { content: ''; display: block; height: 100%; border-radius: 50%; will-change: transform; -webkit-transform: scale(0); transform: scale(0); } .radar .risk-points .risk-point-group .risk-point.type1:after { -webkit-box-shadow: 0 0 0.3125em 0.3125em white inset, 0 0 0.3125em 0.5625em rgba(245, 76, 128, 0.54), 0 0 2.5625em 1.5625em rgba(222, 17, 17, 0.89); box-shadow: 0 0 0.3125em 0.3125em white inset, 0 0 0.3125em 0.5625em rgba(245, 76, 128, 0.54), 0 0 2.5625em 1.5625em rgba(222, 17, 17, 0.89); } .radar .risk-points .risk-point-group .risk-point.type2:after { -webkit-box-shadow: 0 0 0.3125em 0.3125em white inset, 0 0 0.3125em 0.5625em #15d8e8, 0 0 2.5625em 1.5625em rgba(44, 218, 226, 0.89); box-shadow: 0 0 0.3125em 0.3125em white inset, 0 0 0.3125em 0.5625em #15d8e8, 0 0 2.5625em 1.5625em rgba(44, 218, 226, 0.89); } .radar .risk-points .risk-point-group .risk-point.critical { -webkit-transform: scale(1); transform: scale(1); } .radar .risk-points .risk-point-group .risk-point.ordinary { -webkit-transform: scale(0.4); transform: scale(0.4); } .radar .risk-points .risk-point-group .risk-point.pulsation { color: red; -webkit-filter: none; width: 5em; height: 5em; } .radar .risk-points .risk-point-group .risk-point.pulsation .pulse-circle { position: absolute; width: 100%; height: 100%; border-radius: 50%; -webkit-box-sizing: border-box; box-sizing: border-box; border: 0.1875em solid currentColor