美文网首页
圆形进度条

圆形进度条

作者: 海娩 | 来源:发表于2018-03-18 22:37 被阅读0次

    平常我们在加载的时候经常看到一些进度条,提高了用户体验。但是,其实呢,可能看到的不是我们看的那样哦,眼见不一定为实,嘿嘿。一般情况下,是我们做出来的一个假的,迷惑大家嘿嘿嘿。

    首先先做静态DOM结构。我们这里用的技术是通过rotate属性来实现旋转的。所以我们用的是两个半圆和一个圆,实现一个圆环。

     <div class="ui-container">
        <div class="ui-circle is-left">
            <span class="circle__left" id="circle1"></span>
        </div>
        <div class="ui-circle is-right">
            <span class="circle__right" id="circle2"></span>
        </div>
        <div class="ui-center"></div>
    </div>
    
    <button onclick="onLoadTap()">开始加载</button>
    <button onclick="reloadTap()">关闭</button>
    

    接着是css属性,我们构造需要用到的是

     <style>
        .ui-container {
            position: absolute;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            margin: auto;
            width: 100px;
            height: 100px;
        }
    
        .ui-circle {
            position: absolute;
            overflow: hidden;
            width: 50px;
            height: 100px;
        }
    
        .is-left {
            left: 0;
        }
    
        .is-right {
            left: 50%;
        }
    
        .ui-center {
            width: 90px;
            height: 90px;
            background: #fff;
            border-radius: 999px;
            position: absolute;
            top: 0;
            bottom: 0;
            left: 0;
            right: 0;
            margin: auto;
        }
    
        .circle__left {
            display: block;
            position: absolute;
            border-radius: 0 999px 999px 0;
            background: yellow;
            width: 100%;
            height: 100%;
            transform-origin: 0 50% 0;
            left: 100%;
            transition: transform .4s ease-in-out;
        }
    
        .circle__right {
            display: block;
            border-radius: 999px 0 0 999px;
            background: yellow;
            width: 100%;
            height: 100%;
            transform-origin: 100% 50% 0;
            position: absolute;
            left: -100%;
            transition: transform .4s ease-in;
        }
    </style>
    

    这里我们提一下这个border-radius属性,在这里我们的border-radius属性直接设置到了999px;一般来说设置这么大的原因是因为担心有时候撑不开不能形成圆,而且这个border-radius属性是动态分配的,比如说,如果有一个这样设置

         .ui-radius {
            width: 100px;
            height: 100px;
            border-radius: 999px 200px 200px 999px;
            background: #ccc;
        }
          <div class="ui-radius">
          </div>
    
    image.png

    另外,我们可以提到
    transform-origind的百分比是相对自身的。left百分比是相对父元素

    接下来就是script书写了。

    <script>
        var circle1 = document.getElementById('circle1');
        var circle2 = document.getElementById('circle2');
    
        function setProcess(data) {
            var isHalf = false;
            var process = data;
    
            circle2.addEventListener('transitionend', function () {
                if (circle2.style.transform == 'rotate(180deg)') {
                    isHalf = true;
                    circle1.style.transform = 'rotate(' + (process - 50) / 50 * 180 + 'deg)';
                }
            })
            if (circle2.style.transform == 'rotate(180deg)') {
                isHalf = true;
                circle1.style.transform = 'rotate(' + (process - 50) / 50 * 180 + 'deg)';
            }
            if (process < 50) {
                circle2.style.transform = 'rotate(' +  process / 50 * 180 +  'deg)';
                return;
            } else {
                circle2.style.transform = 'rotate(180deg)';
                if (isHalf) {
                    circle1.style.transform = 'rotate(' + (process - 50) / 50 * 180 + 'deg)';
                }
                else {
                    circle2.style.transform = 'rotate(180deg)'
                }
            }
        }
    
        var process = {
            time: 0
        };
    
        function onLoadTap() {
            circle1.style.opacity = 1;
            circle2.style.opacity = 1;
            if (process.time < 100) {
                setProcess(process.time);
                setTimeout(function () {
                    process.time += 5;
                    setProcess(process.time);
                    onLoadTap();
                }, 100);
            }
        }
    
        function reloadTap() {
            circle1.style.opacity = 0;
            circle2.style.opacity = 0;
            if (circle1.style.transform) {
                circle1.style.transition = '';
                circle1.style.transform = '';
            }
            if (circle2.style.transform) {
                circle2.style.transition = '';
                circle2.style.transform = '';
            }
            if (process.time) process.time = 0;
            // onLoadTap();
        }
    </script>
    

    在这里,我是通过每次加一定的进度值来达到旋转一周的。这里用到了transitioned事件的监听,当左边的半圆旋转180°时右边的才会开始旋转,当左半圆旋转完成后,才可以进行右半圆的旋转。
    关闭的部分我为了让其不要出现动画效果,直接设置opacity为0,再进行之后的操作,其实这样的操作本人觉得不是很好,但简单粗暴。
    主要是思路上的操作,细节方面如命名由于与之前想要的效果不一样,没有改命名,觉得还是欠缺一些的。
    其实也可以加上个数字,让更加真实一些的哈哈。

    相关文章

      网友评论

          本文标题:圆形进度条

          本文链接:https://www.haomeiwen.com/subject/fcpdqftx.html