利用css3动画和border来实现圆形进度条

最近在学习前端的一些知识,发现border的功能十分强大啊!

首先来看看demo

就是这么一个圆形的进度条,在文本框中输入0-100的数值下面的进度条相应的转到多少

这个主要是利用border,旋转和css动画来实现的,主要思想是利用两个div来互相遮挡border形成的一个只有半圈有颜色的圆形,再利用旋转div的角度来调整显示

上代码:

html+css+js(这里引入了jquery)

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="KeyWord" content="cicle,learning">
        <meta name="description" content="cicle-learning">
        <meta name="Author" content="alsy">
        <title>圆形进度条</title>

        <!-- style-start -->

        <!-- style-end -->

        <style>
            .content {
                width: 400px;
                height: 400px;
                margin: 10px auto 100px;
            }
            .content .input{
                position: relative;
                margin: 40px auto;
            }
            .content .cicle {
                position: relative;
                margin: 100px auto;
                width: 100px;
                height: 100px;
                border-width: 20px;
                border-color: red;
                border-style: solid;
                border-radius: 50%;
            }
            .content .cicle .bar {
                position: absolute;
                width: 70px;
                height: 140px;
                overflow: hidden;
            }
            .content .cicle .bar-left {
                top: -20px;
                left: -20px;
            }
            .content .cicle .bar-left .bar-left-an{
                position: absolute;
                z-index: 10;
                width: 100px;
                height: 100px;
                border-width: 20px;
                border-color: transparent transparent green green;
                border-style: solid;
                border-radius: 50%;
                transform: rotate(-135deg);
            }
            .content .cicle .bar-right {
                top: -20px;
                left: 50px;
            }
            .content .cicle .bar-right .bar-right-an {
                position: absolute;
                left: -70px;
                z-index: 20;
                width: 100px;
                height: 100px;
                border-width: 20px;
                border-color: green green transparent transparent;
                border-style: solid;
                border-radius: 50%;
                transform: rotate(-135deg);
            }
            .content .cicle .tx {
                position: absolute;
                width: 100px;
                height: 100px;
                line-height: 100px;
                text-align: center;
                font-size: 20px;
                font-weight: 800;
                color: green;
            }
        </style>

    </head>
    <body>

    <div class="content">
        <div class="input">
            <label>进度条:</label><input type="text" id="inp"/>
        </div>
        <div class="cicle">
            <div class="bar bar-left">
                <div class="bar-left-an"></div>
            </div>
            <div class="bar bar-right">
                <div  class="bar-right-an"></div>
            </div>
            <div class="tx">0%</div>
        </div>
    </div>

        <!-- import-js -->
            <script type="text/javascript" src="js/jquery.js"></script>
        <!-- import-my-js -->

            <script type="text/javascript">
                $(document).ready(function() {
                    var cicle = cle = function() {

                        var oTx = $(".tx");

                        var cicleTransform = function(num, old_num) {
                            var b_l_a = $(".bar-left-an");
                            var b_r_a = $(".bar-right-an");
                            var c_num = num;
                            if(c_num > 50) {
                                b_r_a.css({
                                    "transform": "rotate(45deg)",
                                    "transition": "transform 1s linear"
                                });
                                setTimeout(function() {
                                    b_l_a.css({
                                        "transform": "rotate(" + (((c_num-50)/100*360)-135) + "deg)",
                                        "transition": "transform 1s linear"
                                    });
                                },1000);
                            } else {
                                if(old_num > 50) {
                                    setTimeout(function() {
                                        b_r_a.css({
                                            "transform": "rotate(" + ((c_num/100*360)-135) + "deg)",
                                            "transition": "transform 1s linear"
                                        });
                                    },1000);
                                    b_l_a.css({
                                        "transform": "rotate(-135deg)",
                                        "transition": "transform 1s linear"
                                    });
                                } else {
                                    b_r_a.css({
                                        "transform": "rotate(" + ((c_num/100*360)-135) + "deg)",
                                        "transition": "transform 1s linear"
                                    });
                                }

                            }
                        }

                        var setnum = function(num) {
                            oTx.text(num + "%");
                        }

                        var getnum = function() {
                            return parseInt(oTx.text());
                        }

                        var inputB = function() {
                            $("#inp").blur(function() {
                                var num = parseInt($.trim( $(this).val() ));
                                if(num>=0 && num <= 100){
                                    cicleTransform(num, getnum());
                                    setnum(num);
                                }else{
                                    alert("输入100以内的数值!");
                                }
                            });
                        }

                        return {
                            init: function() {
                                inputB();
                            }
                        }
                    }();
                    cicle.init();
                });
            </script>
    </body>
</html>
时间: 2024-12-16 02:36:49

利用css3动画和border来实现圆形进度条的相关文章

WPF利用动画实现圆形进度条

这是我的第一篇随笔,最近因为工作需要,开始学习WPF相关技术,自己想实现以下圆形进度条的效果,逛了园子发现基本都是很久以前的文章,实现方式一般都是GDI实现的,想到WPF中动画效果不错,于是自己研究了一下,还真让我做出来了,废话不多说了,先上效果. 这个效果是不是还不错?这里面实现了数字实时显示以及根据进度进行自动渐变的效果.实现原理其实很简单,利用WPF动画,其中主要元素有border(实现里外层圆的效果),Arc扇面(就是用来实现外层填充效果的),Label(用来显示进度百分比). 1.实现

纯CSS3制作圆形进度条所遇到的问题

近日在开发的页面中,需要制作一个动态的圆形进度条,首先想到的是利用两个矩形,宽等于直径的一半,高等于直径,两个矩形利用浮动贴在一起,设置overflow:hidden属性,作为盒子,内部有一个与其宽高相等的子盒子,左侧的子盒子左上角和左下角以及右侧子盒子的右上角和右下角利用border-radius:半径,这样两个矩形便组成了一个完整的圆形. 我们让左侧的子盒子绕着右边的中点旋转180°,这样左侧的半圆就隐藏了,右侧半圆同理.这个地方设置旋转中心是用的transform-origin属性,第一个

HTML5动画(二):Canvas 实现圆形进度条并显示数字百分比

实现效果 1.首先创建html代码 <canvas id="canvas" width="500" height="500" style="background:#000;"></canvas> 2.创建canvas环境 var canvas = document.getElementById('canvas'), //获取canvas元素 context = canvas.getContext('2d

基于CAShapeLayer和贝塞尔曲线的圆形进度条动画【装载】

初次接触CAShapeLayer和贝塞尔曲线,看了下极客学院的视频.对初学者来说感觉还不错.今天来说一个通过CAShapeLayer和贝塞尔曲线搭配的方法,创建的简单的圆形进度条的教程先简单的介绍下CAShapeLayer1,CAShapeLayer继承自CALayer,可使用CALayer的所有属性2,CAShapeLayer需要和贝塞尔曲线配合使用才有意义.Shape:形状贝塞尔曲线可以为其提供形状,而单独使用CAShapeLayer是没有任何意义的.3,使用CAShapeLayer与贝塞尔

HTML5 canvas带渐变色的圆形进度条动画

query-circle-progress是一款带渐变色的圆形进度条动画特效jQuery插件.该圆形进度条使用的是HTML5 canvas来绘制圆形进度条及其动画效果,进度条使用渐变色来填充,效果非常的酷. 效果演示:http://www.htmleaf.com/Demo/201505271919.html 下载地址:http://www.htmleaf.com/html5/html5-canvas/201505271918.html

Google Chrome 圆形进度条

Conmajia ? 2012 Updated on Feb. 21, 2018 Google Chrome 的圆形进度条. Demo 功能 显示百分比(0-100).如果进度值达到 100%,则将闪烁指定次数. 属性 BlinkCount,结束后闪烁几次.0 为不闪烁,默认 2. BlinkSpeed,闪烁速度,0-255,默认 10. Image,中央图标 SpokeColor,辐条颜色 SpokeCount,辐条数量 Value,进度百分比 事件 没有加入进度变化或完成事件. 原理和结构

CAShapeLayer实现圆形进度条效果

一.CAShapeLayer简介: 1.CAShapeLayer继承至CALayer,可以使用CALayer的所有属性值 2.CAShapeLayer需要与贝塞尔曲线配合使用才有意义 3.使用CAShapeLayer与贝塞尔曲线可以实现不在view的drawRect方法中画出一些想要的图形 4.CAShapeLayer属于CoreAnimation框架,其动画渲染直接提交到手机的GPU当中,相较于view的drawRect方法使用CPU渲染而言,其效率极高,能大大优化内存使用情况 五角星动画 #

WPF 实现圆形进度条

项目中用到圆形进度条,首先就想到使用 ProgressBar 扩展一个,在园子里找到 迷途的小榔头 给出的思路和部分代码,自己加以实现.在此感谢 迷途的小榔头! 进度小于60显示红色,大于60则显示绿色.效果如下: 基本思路: 本质上是一个进度条,只是外观有别于矩形进度条,所以需要修改ProgressBar的ControlTemplate. 进度条部分实际是一个扇形,用WPF动态绘出(原理参考迷途的小榔头讲解). 要将进度条的值(Value依赖属性)转换为进度条,需要一个Converter. 根

一个不是那么优美的圆形进度条续(基本还原原应用里面的效果)

之前帮别人写了一个不是那么优美的圆形进度条,效果图大家也看过了.但是后某人不满意,说原应用是倒计时时间最后5s,才开始显示数字的,同时转完一圈需要的时间只能是30s左右.然后我掐时间看了一下虽然总时间设置的是30s,但是总共转完一圈却耗费了50多秒的样子. 问题出来了: 1. 转圈总时间30s不正确 2. 数字显示时间不正确 3. 数字1的动画没原应用的好(2144手机令牌) 花了一个小时搞了一下,忍不住终于射出来了什么东西,解决了上面的3个问题(请看1从有到无):国际惯例效果图先行,先看下改善