CSS3 制作圆环进度条

发布于 2024-12-05 12:55:47 字数 3425 浏览 3 评论 0

移动端做一个 loadiing 加载的图标,跟以往沿用的都不太一样,是一个圆环进度条,圆环进度条也就罢了,还得能用百分比控制。

示例:https://wenjiangs.com/runcode?slug=AaEWM3gu

刚开始写这个圆环的时候是参照帖子上给出的 css 代码代入,然后根据自己的需求改,发现圆环可以完美转动了,但是好像没法用百分比控制,所以放弃了随便 copy 一个现成的想法,该动动脑子还是有必要的。

实现原理

css 实现圆环的方法很多,我看大部分都是采用边框(border)+ 裁剪(clip: rect())来实现的,所以我也准备采用这种方式。

主要是布局问题,我看大部分圆环进度条都大同小异,就是布局和转动方式不同

// html 

<div class="loading">
  <div class="circle">
    <div class="percent left"></div>
    <div class="percent right wth0"></div>
  </div>
  <div class="per"></div>
</div>

// css 

.loading {
  position: fixed;
  top: 50%;
  left: 50%;
  overflow: hidden;
  z-index: 9999;
  -webkit-transform: translate(-50%,-50%);
      transform: translate(-50%,-50%);
}
.circle{
  -webkit-box-sizing: border-box;
   -moz-box-sizing: border-box;
      box-sizing: border-box;
  border:10px solid #fff;
  clip:rect(0,100px,100px,50px);
}
.clip-auto{
  clip:rect(auto, auto, auto, auto);
}
.percent{
  -webkit-box-sizing: border-box;
   -moz-box-sizing: border-box;
      box-sizing: border-box;
  top:-10px;
  left:-10px;
}
.left{
  -webkit-transition:-webkit-transform ease;
  transition:-webkit-transform ease;
  transition:transform ease;
  border:10px solid #E54B00;
  clip: rect(0,50px,100px,0);
}
.right{
  border:10px solid #E54B00;
  clip: rect(0,100px,100px,50px);
}
.wth0{
  width:0;
}

// js


$('.left').animate({
  deg: per*3.6
}, {
  step: function(n, fx) {
    if(per>180){
      $('.circle').addClass('clip-auto');
      $('.right').removeClass('wth0');
    }
    $(this).css({
      "-webkit-transform":"rotate("+n+"deg)",
      "-moz-transform":"rotate("+n+"deg)",
      "transform":"rotate("+n+"deg)"
    });
  },
  duration:500
})

通过对 .circle (左右两侧圆环的父元素) 的裁剪只显示左侧的圆环,右侧的圆环的宽度直接为 0 ,当进度条进行到 50%的时候,即左侧圆环转动角度为 transform: rotate(180deg) ,将 .circle 的裁剪去掉 (.clip-auto) ,右侧圆环的宽度恢复。基本就是这个套路。

jQuery 的 动画方法 animate() 的 step 属性

如果仅用

$(this).css({
  "-webkit-transform":"rotate("+n+"deg)",
  "-moz-transform":"rotate("+n+"deg)",
  "transform":"rotate("+n+"deg)"
});

来控制角度的转动,没有丝毫动画显得比较生硬,这时候就要考虑给它加个动画了,而 jq 提供的 animate 对只有数字值可创建动画,而字符串类型的值无法创建动画。

这时候需要用到 animate 的 step 属性了。

step 介绍

animate 的 progress 属性是我们经常用的,对数字值的属性进行操作,但是字符串值的属性却并不能用它进行操作,这时候就需要 step 属性了。

step 顾名思义就是对一段动画进行步骤分解,在 animate 方法中,每一步具体是怎么分解的,不是由我们设定的 CSS 属性值和动画时长来决定的,是由系统来决定的。

$(".left").animate({left:50},{
  duration:100,
  step:function(now,fx){
    console.log(now) //控制台输出,看看这个动画被分解成了几个片段
  }
});

这个地方主要是解释为什么在这里给角度赋值,顺便说明一下它到底将该值分成多少个片段并不是由我们人为控制的。

step 方法的第二个参数——fx

$(".demo").animate({
  first:2,
  second:10
}, {
  step:function(n,fx){
    // 动画元素的每个动画属性每一次动画效果的执行都将调用的函数。第 1 个参数是当前动画正在改变的属性的实时值(每 1 次动画过程中,属性值的实时反馈呈现);第 2 个参数为修改 Tween 对象提供了一个机会来改变 animate 第 1 个参数中设置的属性在动画结束时的值。
    // fx: jQuery.fx 原型对象的一个引用,其中包含了多项属性,比如
    // 执行动画的元素:elem;
    // 动画正在改变的属性:prop;
    // 正在改变属性的当前值:now;
    // 正在改变属性的结束值:end;
    // 正在改变属性的单位:unit;等
    
    // 可在这里改变 animate 第 1 个参数中设置的属性 second 在动画结束时的值
    if(fx.prop=="second"){fx.end=5}
    console.log(fx.prop+": "+n);
  },
  duration:2000
})

结束

做这个动画遇到了自己两个知识盲点,clip 的运用以及 jq 的 step 属性,写这篇文章主要目的还是加深理解,以及分享。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

且行且努力

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

胡图图

文章 0 评论 0

zt006

文章 0 评论 0

z祗昰~

文章 0 评论 0

冰葑

文章 0 评论 0

野の

文章 0 评论 0

天空

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文