利用jQuery实现漂亮的圆形进度条倒计时插件

来一份详细的攻略。

标题

利用 jQuery 实现漂亮的圆形进度条倒计时插件

插件需求

  • 能够支持自定义倒计时时长
  • 能够在倒计时过程中实时更新进度条
  • 能够在倒计时结束时触发回调事件

插件设计思路

插件设计基于 SVG 实现,SVG 是用于描述二维矢量图形的 XML 格式,提供了完整的图形描述能力,包括形状、路径、文字、图像等元素。

插件 HTML 结构

插件的 HTML 结构包含两个部分:倒计时圆环和倒计时文本。

<div class="countdown-wrapper">
  <svg class="countdown-svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200">
    <g>
      <circle class="countdown-progress" cx="100" cy="100" r="90" />
      <circle class="countdown-remaining" cx="100" cy="100" r="90" />
    </g>
  </svg>
  <div class="countdown-text">30:00</div>
</div>

其中 countdown-svg 是 SVG 元素,countdown-progress 表示圆形进度条的已完成部分,countdown-remaining 表示圆形进度条的未完成部分,countdown-text 表示倒计时文本。

插件 CSS 样式

在 CSS 样式中,设置圆形进度条的颜色、宽度、文本对齐等样式。

.countdown-wrapper {
  position: relative;
  display: inline-block;
}

.countdown-svg {
  display: block;
  margin: auto;
}

.countdown-progress {
  fill: none;
  stroke: #e74c3c;
  stroke-width: 15;
  stroke-linecap: round;
}

.countdown-remaining {
  fill: none;
  stroke: #eee;
  stroke-width: 15;
  stroke-linecap: round;
  stroke-dasharray: 565.5;
  stroke-dashoffset: 0;
  transform: rotate(-90deg);
  transform-origin: center;
  transition: stroke-dashoffset 0.5s ease-in-out;
}

.countdown-text {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  font-size: 36px;
  font-weight: bold;
  text-align: center;
}

其中,.countdown-progress.countdown-remaining 中的 stroke 属性表示圆形进度条的颜色,stroke-width 表示圆形进度条的宽度,stroke-linecap 表示圆形进度条两端的形状,stroke-dasharray 表示圆形进度条的总长度,stroke-dashoffset 表示圆形进度条未完成部分的长度,transform 表示圆形进度条逆时针旋转 90 度,transform-origin 表示圆形进度条的旋转点位置。.countdown-text 表示倒计时文本的样式。

插件 JavaScript 代码

插件的 JavaScript 代码主要分为两个部分:初始化和倒计时。

初始化

当插件被加载时,需要进行初始化设置,包括:

  1. 获取插件容器;
  2. 获取 SVG 元素、圆形进度条元素、倒计时文本元素;
  3. 获取倒计时开始时间和结束时间;
  4. 计算倒计时时间差;
  5. 计算圆形进度条未完成部分的长度;
  6. 设置未完成部分的长度为总长度,使圆形进度条隐藏。
(function($) {
  $.fn.countdown = function(options) {
    var settings = $.extend({
      start: 0,
      end: 0,
      callback: function() {},
    }, options);

    return this.each(function() {
      var $wrapper = $(this);
      var $svg = $wrapper.find('.countdown-svg');
      var $progress = $wrapper.find('.countdown-progress');
      var $remaining = $wrapper.find('.countdown-remaining');
      var $text = $wrapper.find('.countdown-text');

      var startTime = settings.start;
      var endTime = settings.end;
      var timeDiff = (endTime - startTime) * 1000;
      var remainingLength = $remaining[0].getTotalLength();

      $remaining[0].style.strokeDashoffset = remainingLength;
      $remaining[0].style.strokeDasharray = remainingLength;
      $remaining.hide();
    });
  };
})(jQuery);

倒计时

在插件初始化完成之后,需要进行倒计时处理,包括:

  1. 计算倒计时剩余时间;
  2. 转换倒计时剩余时间为分秒格式;
  3. 更新圆形进度条未完成部分的长度;
  4. 更新倒计时文本;
  5. 当倒计时剩余时间小于等于 0 时,触发回调事件。
(function($) {
  $.fn.countdown = function(options) {
    var settings = $.extend({
      start: 0,
      end: 0,
      callback: function() {},
    }, options);

    return this.each(function() {
      var $wrapper = $(this);
      var $svg = $wrapper.find('.countdown-svg');
      var $progress = $wrapper.find('.countdown-progress');
      var $remaining = $wrapper.find('.countdown-remaining');
      var $text = $wrapper.find('.countdown-text');

      var startTime = settings.start;
      var endTime = settings.end;
      var timeDiff = (endTime - startTime) * 1000;
      var remainingLength = $remaining[0].getTotalLength();

      $remaining[0].style.strokeDashoffset = remainingLength;
      $remaining[0].style.strokeDasharray = remainingLength;
      $remaining.hide();

      var countdownInterval = setInterval(function() {
        var remainingTimeDiff = endTime - Math.floor(Date.now() / 1000);

        if (remainingTimeDiff <= 0) {
          clearInterval(countdownInterval);
          settings.callback.call(this);
        } else {
          var minutes = Math.floor(remainingTimeDiff / 60).toString().padStart(2, '0');
          var seconds = Math.floor(remainingTimeDiff % 60).toString().padStart(2, '0');
          var time = minutes + ':' + seconds;

          var progress = (1 - remainingTimeDiff / timeDiff) * 100;
          var dashOffset = remainingLength - progress / 100 * remainingLength;

          $remaining.show();
          $remaining[0].style.strokeDashoffset = dashOffset;
          $text.text(time);
        }
      }, 250);
    });
  };
})(jQuery);

示例

下面提供两个使用示例。

示例一

<div id="countdown"></div>
$('#countdown').countdown({
  start: 0,
  end: 1800,
  callback: function() {
    alert('倒计时结束!');
  },
});

示例二

<div class="countdown-wrapper">
  <svg class="countdown-svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200">
    <g>
      <circle class="countdown-progress" cx="100" cy="100" r="90" />
      <circle class="countdown-remaining" cx="100" cy="100" r="90" />
    </g>
  </svg>
  <div class="countdown-text"></div>
</div>
$('.countdown-wrapper').countdown({
  start: 0,
  end: 600,
  callback: function() {
    $('.countdown-wrapper').css('border', '5px solid green');
  },
});

以上就是实现一个漂亮的圆形进度条倒计时插件的完整攻略了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:利用jQuery实现漂亮的圆形进度条倒计时插件 - Python技术站

(1)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 如何使用jQuery Mobile插件设计可编辑的列表视图

    使用jQuery Mobile插件设计可编辑的列表视图的完整攻略如下: 首先,在HTML文件中引入jQuery Mobile库和jQuery Mobile插件。可以通过以下代码实现: <head> meta name="viewport" content="width=device-width, initial-sc…

    jquery 2023年5月11日
    00
  • Highcharts 非常实用的Javascript统计图demo示例

    Highcharts是一个非常流行的Javascript图表库,可以用来创建各种类型的动态统计图表,包括线图、柱状图、饼图等。下面我们来介绍如何使用Highcharts创建一些常见的图表。 基本步骤 要使用Highcharts创建图表,需要进行以下几个基本步骤: 引入Highcharts库文件,可以在Highcharts官网上下载。 创建一个容器元素来存放图…

    jquery 2023年5月27日
    00
  • EasyUI jQuery validateBox小工具

    以下是关于 EasyUI jQuery validateBox 小工具的详细攻略: EasyUI jQuery validateBox 小工具 validateBox 小工具是 EasyUI jQuery 中的一个小部件,用于验证用户输入的文本。它可以设置验证规则、提示信息、验证事件等属性,还可以自定义验证规则和提示信息。 语法 $(selector).va…

    jquery 2023年5月11日
    00
  • jQuery event.stopPropagation()方法

    jQuery event.stopPropagation()方法用于阻止事件的进一步传播。该方法通常用于在事件处理程序中防止事件冒泡到父元素或文档中。 以下是jQuery event.stopPropagation()方法的详细攻略: 语法 event.stopPropagation() 参数 无 示例1:阻止事件冒泡到元素 以下示例演示了如何使用jQuer…

    jquery 2023年5月9日
    00
  • jquery序列化表单去除指定元素示例代码

    当我们使用jQuery向后台提交表单数据时,经常需要对表单进行序列化。jQuery提供了方便的序列化表单的方法serialize(),但有时我们需要在序列化表单时去除某些不需要的元素,可以使用jQuery的not()方法来过滤掉指定元素。 下面是基础的jQuery序列化表单代码: $(‘form’).submit(function(e) { e.preven…

    jquery 2023年5月27日
    00
  • jQuery UI Button disable()方法

    jQuery UI 的 Button 组件提供了一个 disable() 方法,该方法用于禁用已创建的 Button 实例。在本教程中,我们将详细介绍 Button 的 disable() 方法的使用方法。 disable() 方法基本语法如下: $( ".selector" ).button( "disable" )…

    jquery 2023年5月11日
    00
  • JQuery deferred.then()方法

    JQuery deferred.state()方法 JQuery的deferred.state()方法用于获取deferred对象的当前状态,返回值为字符串”pending”、”resolved”或”rejected”。本文将详细介绍deferred.state()方法的语法和用法,并提供两个示例说明。 语法 以下是deferred.state()方法的基本…

    jquery 2023年5月9日
    00
  • jQWidgets jqxDropDownList clearFilter()方法

    jQWidgets jqxDropDownList clearFilter()方法详解 jQWidgets是一个基于jQuery的UI组件库,提供了丰富UI件和工具包。jqxDropDownList是Widgets组件现下组件。本文将详细介绍jqxDropDownList的clearFilter()方法,包括用、语法和示例。 clearFilter()的基本…

    jquery 2023年5月10日
    00
合作推广
合作推广
分享本页
返回顶部