Ajax Loader
HTML
<div class="cp">
1
<div class="cp">
2
  <canvas width="140" class="nob" data-value="0" data-change="test();"></canvas>
3
</div>
4
 
5
<div class="cp">
6
  <canvas width="40" class="nob" data-value="0"></canvas>
7
  <canvas width="40" class="nob" data-value="81"></canvas>
8
  <canvas width="40" class="nob" data-value="42"></canvas>
9
  <canvas width="40" class="nob" data-value="100"></canvas>
10
</div>
11
 
 
CSS
html,
1
html,
2
body {
3
  background: #EEE;
4
  height: 90%;
5
  font: 13px Arial;
6
  color: #888;
7
}
8
.cp {
9
  background: #EEE;
10
  position: relative;
11
  top: 80px;
12
  left: 350px;
13
  width: 280px;
14
  text-align: center;
15
  padding: 25px 0px 20px 0px;
16
  
17
  border: #DDD 1px solid;
18
  border-radius: 11px;
19
  box-shadow: 0px 1px 3px #BBB,
20
        inset 0px 1px 0px #FFF,
21
        0px 1px 0px #999;
22
}
23
canvas {
24
  margin: 0px 10px 0px 10px;
25
}
 
JavaScript
// Written by Hakan Bilgin
1
// Written by Hakan Bilgin
2
// https://github.com/hbi99/Canvas-nob
3
 
4
(function(window, document) {
5
    
6
    'use strict';
7
    
8
    var nob = {
9
        el: false,
10
        clickY: 0,
11
        clickX: 0,
12
        init: function() {
13
            var nobs = document.getElementsByClassName('nob');
14
            for (var i=0, cvs; cvs=nobs[i]; i++) {
15
                cvs.height = cvs.width * 0.9;
16
                nob.draw(cvs, true);
17
                cvs.addEventListener('mousedown', nob.doEvent, true);
18
                cvs.addEventListener('selectstart', nob.doEvent, false);
19
            }
20
            window.addEventListener('mousemove', nob.doEvent, true);
21
            window.addEventListener('mouseup', nob.doEvent, true);
22
        },
23
        doEvent: function(event) {
24
            var _nob = nob,
25
                bodyStyle = document.body.style;
26
            switch (event.type) {
27
                case 'selectstart':
28
                    event.preventDefault();
29
                    event.stopPropagation();
30
                    return false;
31
                case 'mousedown':
32
                    _nob.el = event.target || event.srcElement;
33
                    _nob.clickY = event.clientY;
34
                    _nob.clickX = event.clientX;
35
                    _nob.orgValue = _nob.el.getAttribute('data-value');
36
                    bodyStyle.cursor = 'none';
37
                    event.preventDefault();
38
                    break;
39
                case 'mousemove':
40
                    if (!_nob.el) return;
41
                    _nob.el.setAttribute('data-value', (Math.min(Math.max(_nob.clickY-event.clientY + (_nob.orgValue - 50), -50), 50) + 50));
42
                    _nob.draw( _nob.el );
43
                    break;
44
                case 'mouseup':
45
                    if (!_nob.el) return;
46
                    _nob.el = false;
47
                    bodyStyle.cursor = '';
48
                    break;
49
            }
50
        },
51
        draw: function(cvs, isInit) {
52
            var ctx  = cvs.getContext('2d'),
53
                d = cvs.width,
54
                lw = d * 0.1,
55
                r = d/2,
56
                radius = r - lw,
57
                val = cvs.getAttribute('data-value'),
58
                deg = (Math.min(Math.max(val/100, 0), 1) * 1.5) + 0.75,
59
                startAngle = 0.745 * Math.PI,
60
                midAngle = deg * Math.PI,
61
                endAngle = 0.251 * Math.PI;
62
                
63
            // Clear canvas and defaults
64
            ctx.clearRect(0, 0, d, d);
65
            ctx.strokeStyle = '#F90';
66
            ctx.lineWidth = lw;
67
            ctx.lineCap = 'round';
68
            
69
            // Orange line
70
            if (val > 0) {
71
                ctx.beginPath();
72
                ctx.arc(r, r, radius, startAngle, midAngle, false);
73
                ctx.stroke();
74
            }
75
 
76
            // Gray line
77
            ctx.strokeStyle = '#888';
78
            ctx.beginPath();
79
            ctx.moveTo(r, r);
80
            ctx.arc(r, r, radius, midAngle, endAngle, false);
81
            ctx.stroke();
82
 
83
            // 
84
            if (isInit) return;
85
            var onchange = cvs.getAttribute('data-change'),
86
                parts, fn;
87
            if (onchange) {
88
                if (cvs.fnStr !== onchange) {
89
                    parts = onchange.slice(0,onchange.indexOf('(')).split('.');
90
                    fn = window;
91
                    for (var i=0, il=parts.length-1; i<il; i++) {
92
                        if (!fn[parts[i]]) return;
93
                        if (parts[i].indexOf('(') > -1) break;
94
                        fn = fn[parts[i]];
95
                    }
96
                    cvs.fnStr = onchange;
97
                    cvs.fnObj = fn;
98
                    cvs.fn = fn[parts[i]];
99
                }
100
                cvs.fn.call(cvs.fnObj, val);
101
            }
102
        }
103
    };
104
    nob.init();
105
 
106
})(window, document);
 

Nobs - Ableton Live-style

CSSDeck G+