效果图
实现代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
padding: 0;
margin: 0;
}
body {
background: #232323;
font-family: Roboto;
}
.progress {
width: 200px;
height: 200px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) rotateY(180deg);
}
.progress:before {
content: "";
position: absolute;
width: 185px;
height: 185px;
background: #232323;
border-radius: 100%;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 99;
}
.progress:after {
content: "";
position: absolute;
width: 8px;
height: 100px;
background: linear-gradient(180deg, #d63031, #232323);
border-radius: 10px;
box-shadow: 0 -19px 9px -3px #d63031;
top: 0;
right: 50%;
margin-right: -4px;
z-index: 999;
transform: rotate(90deg);
transform-origin: bottom;
animation-name: meter;
animation-duration: 5s;
animation-iteration-count: infinite;
animation-timing-function: cubic-bezier(0, 0.1, 0.9, 0.81);
animation-play-state: paused;
animation-direction: reverse;
animation-delay: 5s;
}
.progress .precent {
position: absolute;
top: 29px;
left: 50%;
z-index: 99;
transform: translate(-50%, 0) rotateY(180deg);
font-size: 19px;
color: white;
width: 47px;
text-align: center;
line-height: 1.5;
}
.progress .precent:after {
content: "";
position: absolute;
width: 35px;
height: 35px;
background: #323232;
border-radius: 100%;
top: 85px;
right: -35px;
}
.progress .precent:before {
content: "";
position: absolute;
width: 35px;
height: 35px;
background: #323232;
border-radius: 100%;
top: 85px;
left: -35px;
}
.progress .circle {
width: 200px;
height: 200px;
background: white;
background: conic-gradient(from 91deg,
#d63031 0%,
#ffffff 20%,
transparent 100%);
-webkit-clip-path: polygon(0% 100%,
0% 0%,
100% 0%,
100% 50%,
50% 50%,
100% 50%,
100% 100%);
clip-path: polygon(0% 100%,
0% 0%,
100% 0%,
100% 50%,
50% 50%,
100% 50%,
100% 100%);
animation-name: loading;
animation-duration: 5s;
animation-iteration-count: infinite;
animation-timing-function: cubic-bezier(0, 0.1, 0.9, 0.81);
animation-play-state: paused;
animation-direction: reverse;
animation-delay: 5s;
border-radius: 100%;
}
@keyframes loading {
0% {
-webkit-clip-path: polygon(0% 100%,
0% 0%,
100% 0%,
100% 50%,
50% 50%,
100% 50%,
100% 100%);
clip-path: polygon(0% 100%,
0% 0%,
100% 0%,
100% 50%,
50% 50%,
100% 50%,
100% 100%);
}
12.5% {
-webkit-clip-path: polygon(0% 100%,
0% 0%,
100% 0%,
100% 50%,
50% 50%,
100% 100%,
100% 100%);
clip-path: polygon(0% 100%,
0% 0%,
100% 0%,
100% 50%,
50% 50%,
100% 100%,
100% 100%);
}
25% {
-webkit-clip-path: polygon(0% 100%,
0% 0%,
100% 0%,
100% 50%,
50% 50%,
50% 100%,
50% 100%);
clip-path: polygon(0% 100%,
0% 0%,
100% 0%,
100% 50%,
50% 50%,
50% 100%,
50% 100%);
}
37.5% {
-webkit-clip-path: polygon(0% 100%,
0% 0%,
100% 0%,
100% 50%,
50% 50%,
0% 100%,
0% 100%);
clip-path: polygon(0% 100%,
0% 0%,
100% 0%,
100% 50%,
50% 50%,
0% 100%,
0% 100%);
}
50% {
-webkit-clip-path: polygon(0% 50%,
0% 0%,
100% 0%,
100% 50%,
50% 50%,
0% 50%,
0% 50%);
clip-path: polygon(0% 50%,
0% 0%,
100% 0%,
100% 50%,
50% 50%,
0% 50%,
0% 50%);
}
62.5% {
-webkit-clip-path: polygon(0% 0%,
0% 0%,
100% 0%,
100% 50%,
50% 50%,
0% 0%,
0% 0%);
clip-path: polygon(0% 0%, 0% 0%, 100% 0%, 100% 50%, 50% 50%, 0% 0%, 0% 0%);
}
75% {
-webkit-clip-path: polygon(50% 0%,
50% 0%,
100% 0%,
100% 50%,
50% 50%,
50% 0%,
50% 0%);
clip-path: polygon(50% 0%,
50% 0%,
100% 0%,
100% 50%,
50% 50%,
50% 0%,
50% 0%);
}
87.5% {
-webkit-clip-path: polygon(100% 0%,
100% 0%,
100% 0%,
100% 50%,
50% 50%,
100% 0%,
100% 0%);
clip-path: polygon(100% 0%,
100% 0%,
100% 0%,
100% 50%,
50% 50%,
100% 0%,
100% 0%);
}
100% {
-webkit-clip-path: polygon(100% 50%,
100% 50%,
100% 50%,
100% 50%,
50% 50%,
100% 50%,
100% 50%);
clip-path: polygon(100% 50%,
100% 50%,
100% 50%,
100% 50%,
50% 50%,
100% 50%,
100% 50%);
}
}
@keyframes meter {
0% {
transform: rotate(90deg);
}
25% {
transform: rotate(179deg);
}
50% {
transform: rotate(269deg);
}
75% {
transform: rotate(360deg);
}
100% {
transform: rotate(450deg);
}
}
.progress .range {
margin-top: 20px;
transform: rotate(180deg);
}
.progress input[type="range"] {
-webkit-appearance: none;
width: 100%;
background: transparent;
}
.progress input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
}
.progress input[type="range"]:focus {
outline: none;
}
.progress input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
height: 16px;
width: 16px;
border-radius: 100%;
background: white;
cursor: pointer;
margin-top: -6px;
z-index: 9;
position: relative;
}
.progress input[type="range"]::-moz-range-thumb {
height: 16px;
width: 16px;
border-radius: 100%;
background: white;
cursor: pointer;
border: 0;
z-index: 9;
position: relative;
}
.progress input[type="range"]::-webkit-slider-runnable-track {
width: 100%;
height: 5px;
cursor: pointer;
background: white;
border-radius: 20px;
}
.progress input[type="range"]::-moz-range-track {
width: 100%;
height: 5px;
cursor: pointer;
background: white;
border-radius: 20px;
}
.kongzhi {
width: 100%;
height: 50px;
display: flex;
align-items: center;
justify-content: center;
}
.kongzhi div {
margin: 0 10px;
border-radius: 20px;
width: 50px;
border: 1px solid #f0f0f0;
color: #fff;
font-size: 14px;
cursor: pointer;
text-align: center;
}
</style>
</head>
<body>
<div class="progress">
<div class="precent">0 km/h</div>
<div class="circle"></div>
<div class="range">
<input type="range" min="0" max="1000" value="0" id="range">
<div class="filled"></div>
</div>
</div>
<div class="kongzhi">
<div class="shache">刹车</div>
<div class="jiasu">加速</div>
</div>
<script src="https://www.jq22.com/jquery/jquery-2.1.1.js"></script>
<script>
$(function () {
var startTime = null
var endTime = null
renderData()
$(document).on("input", "#range", function () {
clearInterval(startTime)
clearInterval(endTime)
renderData()
});
$('.shache').on('touchstart', function (event) {
startTime = setInterval(() => {
let val = $("#range").val()*1
val -= 1
$("#range").val(val)
renderData()
}, 5)
});
$('.shache').on('touchend', function (event) {
clearInterval(startTime)
})
$('.jiasu').on('touchstart', function (event) {
endTime = setInterval(() => {
let val = $("#range").val()*1
val += 1
$("#range").val(val)
renderData()
}, 5)
});
$('.jiasu').on('touchend', function (event) {
clearInterval(endTime)
})
function renderData() {
var ele = $("#range")[0]
var percent = ((ele.value - ele.min) / (ele.max - ele.min)) * 5;
var percentshow = Math.round(
((ele.value - ele.min) / (ele.max - ele.min)) * 100
)*10;
// if (ele.value <= ele.min) {
// clearInterval(startTime)
// }
// if (ele.value >= ele.max) {
// clearInterval(endTime)
// }
$("#meterstyle").remove();
if (percent < 5) {
$(".progress .circle").attr("style", "animation-delay:-" + percent + "s");
$("body").append(
"<div id='meterstyle'><style>.progress:after{animation-delay:-" +
percent +
"s;}</style></div>"
);
} else {
$(".progress .circle").attr("style", "animation-delay:5s");
$("body").append(
"<div id='meterstyle'><style>.progress:after{animation-delay:5s;}</style></div>"
);
}
$(".progress .precent").text(percentshow + " km/h");
}
});
</script>
</body>
</html>