原创jQuery插件之loading

一个常用的小玩意儿,先上图


有图才有真相嘛

插件充分利用了:before和:after伪元素,这样,不会对原dom结构造成影响。

但是同样也会带来一定的弊端,就是如果此元素有用到:before和:after伪元素,就要慎用此插件了。

调用

插件调用很简单,图片里面都已经写得很清楚了。

描述一下各参数的意义以及可选值吧

speed:速度,可以是字符串slow、normal、fast,也可以是数值,表示动画进行的时间长度,单位是ms。默认值:normal

bgcolor:任何有意义的颜色字符串,默认值:green

height:进度条的高度,单位:px,默认值:1

mask:是否遮盖目标,如果遮盖目标,目标内的按钮等可交互元素不可交互(从图中可以看到,勾选mask然后loading,“停止动画”按钮不再可以点击),该遮盖层使用:after元素,默认值:false

zindex:20160819新加这个参数,设定动画的z序,防止被别的元素遮挡

哦,别忘了:可以使用$('selector').loading('stop')停止动画效果

源代码

<!DOCTYPE html>
<html>
<head>
    <meta name="renderer" content="webkit">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>jquery.loading</title>
</head>
<body>
    <style type="text/css">
        html, body { height: 100%; padding: 0; margin: 0; }
        .form { width: 550px; margin: 100px auto; padding: 15px; box-shadow: #ccc 1px 1px 10px; }
        .form > div { margin-top: 15px; }
    </style>
    <div class="form">
        <div>
            <label for="speed">speed</label>
            <select id="speed">
                <option>slow</option>
                <option>normal</option>
                <option>fast</option>
            </select>
        </div>
        <div>
            <label for="bgcolor">bgcolor</label>
            <input type="color" id="bgcolor" />
        </div>
        <div>
            <label for="height">height</label>
            <input type="number" id="height" />
        </div>
        <div>
            <label for="mask">mask</label>
            <input type="checkbox" value=true id="mask" />
        </div>
        <div>
            <button id="bstart">开始动画</button>
            <button id="bstop">停止动画</button>
        </div>
        <div>
            <code>
                $('.form').loading()
            </code>
        </div>
    </div>
    <script src="Scripts/jquery-2.2.3.js"></script>
    <script>
        $.fn.extend({
            loading: function (opts) {
                if (opts === 'stop') {
                    this.each(function () {
                        var $el = $(this)
                        var uniqueStr = $el.data('cloadinguniquestr')
                        if (!uniqueStr)
                            return
                        $el.removeClass(uniqueStr).removeData('cloadinguniquestr')
                        if (!$el.attr('class'))
                            $el.removeAttr('class')
                        $('#' + uniqueStr).remove()
                    })
                    return
                }
                var _opts = {
                    speed: 'normal',
                    bgcolor: 'green',
                    height: 1,
                    mask: false,
                    zindex: 1
                }
                opts = $.extend(_opts, opts)
                this.each(function () {
                    var $el = $(this)
                    var uniqueStr = $el.data('cloadinguniquestr')
                    if (uniqueStr)
                        return
                    var elOffset = $el.offset()
                    var uniqueStr = 'cloading' + elOffset.top.toString().replace('.', '') + elOffset.left.toString().replace('.', '') + $.now()
                    $el.data('cloadinguniquestr', uniqueStr)
                    var elClass = uniqueStr
                    $el.addClass(elClass)
                    var elAnimationName = uniqueStr
                    var loadingCssPosition = $el[0].tagName === 'BODY' ? 'fixed' : 'absolute'
                    var elWidth = $el.width()
                    var duration = 4000
                    if (opts.speed === 'slow')
                        duration = elWidth * 12
                    else if (opts.speed === 'normal')
                        duration = elWidth * 8
                    else if (opts.speed === 'fast')
                        duration = elWidth * 4
                    else {
                        if ($.isNumeric(opts.speed))
                            duration = opts.speed
                        else
                            throw 'speed的值只能是slow,normal,fast或者数值'
                    }
                    var styleId = uniqueStr
                    var style = ''
                    style += '<style id="' + styleId + '">'
                    var oldCssPosiztion = $el.css('position')
                    if (oldCssPosiztion === 'static') {
                        style += '.' + elClass + '{ position: relative; }'
                    }
                    style += '.' + elClass + ':before { background-color: ' + opts.bgcolor + '; width: 0; height: ' + opts.height + 'px; display: block; content: ""; z-index: ' + opts.zindex + '; top: 0; animation: ' + elAnimationName + ' ' + duration + 'ms linear infinite; position: ' + loadingCssPosition + '; }'
                    style += '@keyframes ' + elAnimationName + ' {'
                    style += '0% { width: 0; left: 0; }'
                    style += '50% { width: 100%; left: 0; }'
                    style += '100% { width: 0; left: 100%; }'
                    style += '}'
                    if (opts.mask) {
                        style += '.' + elClass + ':after { z-index: ' + (opts.zindex + 1) + '; left: 0; top: 0; width: 100%; height: 100%; opacity: 0; content: ""; position: ' + loadingCssPosition + '; }'
                    }
                    style + '</style>'
                    $('body').append(style)
                })
            }
        })
    </script>
    <script>
        $('input, select').on('change', function () {
            var opts = {
                speed: speed.value,
                bgcolor: bgcolor.value,
                height: height.value || 1,
                mask: mask.checked
            }
            $('code').text('$(\'.form\').loading(' + JSON.stringify(opts) + ')')
        })
        $('#bstart').click(function () {
            var opts = {
                speed: speed.value,
                bgcolor: bgcolor.value,
                height: height.value || 1,
                mask: mask.checked
            }
            $('.form').loading(opts)
        })
        $('#bstop').click(function () {
            $('.form').loading('stop')
        })
    </script>
</body>
</html>

兼容性

引用的jQuery版本是2.2.3,其他版本没有测过。

浏览器测试了IE11、edge、Firefox、chrome、Opera,都可以正常运行。其他浏览器可以自行测试。

更新日志

20160904 在添加了zindex后,发现在此属性chrome不生效,但是在firefox没问题。

我本以为chrome不支持在动态添加的style使用zindex属性,我把这个属性删除,结果top属性又失效了。

现在我怀疑chrome有这样的bug,position属性要放在最后,不然,他后面的属性不能生效。

不知道是chrome有这个bug还是我不会用,有清楚这个的还请不吝赐教,先谢谢了。

所以,现在我把position属性放到最后,这样,zindex属性也能生效了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jQuery是一种流行的JavaScript库,它可以简化编写JavaScript代码的过程。在这里,我将向你介绍如何使用jQuery创建一个简单的日历插件。 首先,我们需要在HTML文件中引入jQuery库和我们自己的脚本文件: ```html <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script src="calendar.js"></script> ``` 接下来,我们需要在HTML文件中创建一个空的`<div>`元素,用于容纳我们的日历: ```html <div id="calendar"></div> ``` 现在,我们已经准备好开始编写JavaScript代码了。在我们的脚本文件中,我们将定义一个名为`Calendar`的对象,该对象将具有以下属性和方法: ```javascript var Calendar = { // 初始化日历 init: function(selector) { // ... }, // 绘制日历 draw: function(year, month) { // ... }, // 获取指定月份的天数 getDaysInMonth: function(year, month) { // ... }, // 获取指定月份的第一天是星期几 getFirstDayOfWeek: function(year, month) { // ... } }; ``` 现在,我们来看看这个对象的实现细节。首先是初始化方法: ```javascript init: function(selector) { var now = new Date(); var year = now.getFullYear(); var month = now.getMonth() + 1; $(selector).data('year', year); $(selector).data('month', month); this.draw(year, month); } ``` 在这里,我们获取当前的年份和月份,然后将它们存储在`<div>`元素的数据属性中。然后,我们调用`draw`方法来绘制日历。 接下来是绘制方法: ```javascript draw: function(year, month) { var daysInMonth = this.getDaysInMonth(year, month); var firstDayOfWeek = this.getFirstDayOfWeek(year, month); var html = '<table>'; html += '<tr><th>日</th><th>一</th><th>二</th><th>三</th><th>四</th><th>五</th><th>六</th></tr>'; var day = 1; for (var i = 0; i < 6; i++) { html += '<tr>'; for (var j = 0; j < 7; j++) { if (i === 0 && j < firstDayOfWeek) { html += '<td></td>'; } else if (day > daysInMonth) { html += '<td></td>'; } else { html += '<td>' + day + '</td>'; day++; } } html += '</tr>'; if (day > daysInMonth) { break; } } html += '</table>'; var selector = '#calendar'; $(selector).html(html); } ``` 在这里,我们首先获取指定月份的天数和该月份的第一天是星期几。然后,我们使用一个表格来绘制日历。我们遍历6行和7列,并根据当前日期填充单元格。如果日期超出了该月份的天数,我们就停止绘制。 最后,我们将HTML代码插入到`<div>`元素中。 最后是获取指定月份的天数和第一天是星期几的方法: ```javascript getDaysInMonth: function(year, month) { return new Date(year, month, 0).getDate(); }, getFirstDayOfWeek: function(year, month) { return new Date(year, month - 1, 1).getDay(); } ``` 这些方法分别使用JavaScript的`Date`对象来计算指定月份的天数和第一天是星期几。 现在,我们已经完成了一个简单的日历插件的开发。你可以在HTML文件中使用以下代码来初始化日历: ```javascript $(document).ready(function() { Calendar.init('#calendar'); }); ``` 当然,你还可以根据自己的需要对插件进行扩展和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值