CSS打造的动感loading效果

本文将推荐一款纯CSS打造的动感loading效果,做轻应用或游戏时常常能用得到。

本效果的实现不需要用到任何图片,让我们一起看下代码。

HTML代码:

<div id="container" class="loader">
  <div class="round0 init"></div>
  <div class="round1"></div>
  <div class="round2"></div>
  <div class="round3"></div>
  <div class="round4"></div>
  <div class="round5"></div>
  <div class="round6"></div>
  <div class="round7"></div>
  <div class="round8"></div>
  <div class="round9"></div>
  <div class="round10"></div>
</div>

CSS代码:
html,body{
  margin:0;
  padding:0;
  background:#32ce55;
  position:absolute;
  width:100%;
  height:100%;
}
 
.loader{
  position:absolute;
  width:100px;
  height:100px;
  /*background:rgba(20,20,20,0.5);
  border-radius:50px;*/
  left:50%;
  top:50%;
  margin-top:-50px;
  margin-left:-50px;
}
 
.loader>div{
  position:absolute;
  width:20px;
  height:20px;
  border-radius:15px;
  background:white;
  left:50%;
  top:50%;
  margin-top:-10px;
  margin-left:-10px;
}
 
.loader>div:not(.init){
  width:0px;
  height:0px;
  margin:0px;
  animation-duration: 2.7s;
  animation-iteration-count: infinite;
  animation-timing-function: ease-in-out;
}
 
.loader>.round1{
  animation-name: round1;
  animation-delay:0s;
}
 
.loader>.round2{
  animation-name:round2;
  animation-delay:.1s;
}
 
.loader>.round3{
  animation-name:round3;
  animation-delay:.2s;
}
 
.loader>.round4{
  animation-name:round4;
  animation-delay:.3s;
}
 
.loader>.round5{
  animation-name:round5;
  animation-delay:.4s;
}
 
.loader>.round6{
  animation-name:round6;
  animation-delay:.5s;
}
 
.loader>.round7{
  animation-name:round7;
  animation-delay:.9s;
}
 
.loader>.round8{
  animation-name:round8;
  animation-delay:.8s;
}
 
.loader>.round9{
  animation-name:round9;
  animation-delay:.7s;
}
 
.loader>.round10{
  animation-name:round10;
  animation-delay:.6s;
}
 
@keyframes round1
{
  0%, 55%, 100% {
    margin:0px;
    width:0px;
    height:0px;
  }
  5%, 50% {
    margin-left:-10px;
    margin-top:-50px;
    width:20px;
    height:20px;
  }
}
 
@keyframes round2
{
  0%, 55%, 100% {
    margin:0px;
    width:0px;
    height:0px;
  }
  5%, 50% {
    margin-left:14px;
    margin-top:-43px;
    width:20px;
    height:20px;
  }
}
 
@keyframes round3
{
  0%, 55%, 100% {
    margin:0px;
    width:0px;
    height:0px;
  }
  5%, 50% {
    margin-left:29px;
    margin-top:-24px;
    width:20px;
    height:20px;
  }
}
 
@keyframes round4
{
  0%, 55%, 100% {
    margin:0px;
    width:0px;
    height:0px;
  }
  5%, 50% {
    margin-left:29px;
    margin-top:0px;
    width:20px;
    height:20px;
  }
}
 
@keyframes round5
{
  0%, 55%, 100% {
    margin:0px;
    width:0px;
    height:0px;
  }
  5%, 50% {
    margin-left:15px;
    margin-top:22px;
    width:20px;
    height:20px;
  }
}
 
@keyframes round6
{
  0%, 55%, 100% {
    margin:0px;
    width:0px;
    height:0px;
  }
  5%, 50% {
    margin-left:-10px;
    margin-top:30px;
    width:20px;
    height:20px;
  }
}
 
@keyframes round7
{
  0%, 55%, 100% {
    margin:0px;
    width:0px;
    height:0px;
  }
  5%, 50% {
    margin-left:-34px;
    margin-top:-43px;
    width:20px;
    height:20px;
  }
}
 
@keyframes round8
{
  0%, 55%, 100% {
    margin:0px;
    width:0px;
    height:0px;
  }
  5%, 50% {
    margin-left:-49px;
    margin-top:-24px;
    width:20px;
    height:20px;
  }
}
 
@keyframes round9
{
  0%, 55%, 100% {
    margin:0px;
    width:0px;
    height:0px;
  }
  5%, 50% {
    margin-left:-49px;
    margin-top:0px;
    width:20px;
    height:20px;
  }
}
 
@keyframes round10
{
  0%, 55%, 100% {
    margin:0px;
    width:0px;
    height:0px;
  }
  5%, 50% {
    margin-left:-35px;
    margin-top:22px;
    width:20px;
    height:20px;
  }
}
Javascript代码:

!
function() {
	function e(e, r) {
		return [].slice.call((r || document).querySelectorAll(e))
	}
	if (window.addEventListener) {
		var r = window.StyleFix = {
			link: function(e) {
				try {
					if ("stylesheet" !== e.rel || e.hasAttribute("data-noprefix")) return
				} catch(t) {
					return
				}
				var n,
				i = e.href || e.getAttribute("data-href"),
				a = i.replace(/[^\/]+$/, ""),
				o = (/^[a-z]{3,10}:/.exec(a) || [""])[0],
				s = (/^[a-z]{3,10}:\/\/[^\/]+/.exec(a) || [""])[0],
				l = /^([^?]*)\??/.exec(i)[1],
				u = e.parentNode,
				p = new XMLHttpRequest;
				p.onreadystatechange = function() {
					4 === p.readyState && n()
				},
				n = function() {
					var t = p.responseText;
					if (t && e.parentNode && (!p.status || p.status < 400 || p.status > 600)) {
						if (t = r.fix(t, !0, e), a) {
							t = t.replace(/url\(\s*?((?:"|')?)(.+?)\1\s*?\)/gi,
							function(e, r, t) {
								return /^([a-z]{3,10}:|#)/i.test(t) ? e: /^\/\//.test(t) ? 'url("' + o + t + '")': /^\//.test(t) ? 'url("' + s + t + '")': /^\?/.test(t) ? 'url("' + l + t + '")': 'url("' + a + t + '")'
							});
							var n = a.replace(/([\\\^\$*+[\]?{}.=!:(|)])/g, "\\$1");
							t = t.replace(RegExp("\\b(behavior:\\s*?url\\('?\"?)" + n, "gi"), "$1")
						}
						var i = document.createElement("style");
						i.textContent = t,
						i.media = e.media,
						i.disabled = e.disabled,
						i.setAttribute("data-href", e.getAttribute("href")),
						u.insertBefore(i, e),
						u.removeChild(e),
						i.media = e.media
					}
				};
				try {
					p.open("GET", i),
					p.send(null)
				} catch(t) {
					"undefined" != typeof XDomainRequest && (p = new XDomainRequest, p.onerror = p.onprogress = function() {},
					p.onload = n, p.open("GET", i), p.send(null))
				}
				e.setAttribute("data-inprogress", "")
			},
			styleElement: function(e) {
				if (!e.hasAttribute("data-noprefix")) {
					var t = e.disabled;
					e.textContent = r.fix(e.textContent, !0, e),
					e.disabled = t
				}
			},
			styleAttribute: function(e) {
				var t = e.getAttribute("style");
				t = r.fix(t, !1, e),
				e.setAttribute("style", t)
			},
			process: function() {
				e("style").forEach(StyleFix.styleElement),
				e("[style]").forEach(StyleFix.styleAttribute)
			},
			register: function(e, t) { (r.fixers = r.fixers || []).splice(void 0 === t ? r.fixers.length: t, 0, e)
			},
			fix: function(e, t, n) {
				for (var i = 0; i < r.fixers.length; i++) e = r.fixers[i](e, t, n) || e;
				return e
			},
			camelCase: function(e) {
				return e.replace(/-([a-z])/g,
				function(e, r) {
					return r.toUpperCase()
				}).replace("-", "")
			},
			deCamelCase: function(e) {
				return e.replace(/[A-Z]/g,
				function(e) {
					return "-" + e.toLowerCase()
				})
			}
		}; !
		function() {
			setTimeout(function() {},
			10),
			document.addEventListener("DOMContentLoaded", StyleFix.process, !1)
		} ()
	}
} (),
function(e) {
	function r(e, r, n, i, a) {
		if (e = t[e], e.length) {
			var o = RegExp(r + "(" + e.join("|") + ")" + n, "gi");
			a = a.replace(o, i)
		}
		return a
	}
	if (window.StyleFix && window.getComputedStyle) {
		var t = window.PrefixFree = {
			prefixCSS: function(e, n) {
				var i = t.prefix;
				if (t.functions.indexOf("linear-gradient") > -1 && (e = e.replace(/(\s|:|,)(repeating-)?linear-gradient\(\s*(-?\d*\.?\d*)deg/gi,
				function(e, r, t, n) {
					return r + (t || "") + "linear-gradient(" + (90 - n) + "deg"
				})), e = r("functions", "(\\s|:|,)", "\\s*\\(", "$1" + i + "$2(", e), e = r("keywords", "(\\s|:)", "(\\s|;|\\}|$)", "$1" + i + "$2$3", e), e = r("properties", "(^|\\{|\\s|;)", "\\s*:", "$1" + i + "$2:", e), t.properties.length) {
					var a = RegExp("\\b(" + t.properties.join("|") + ")(?!:)", "gi");
					e = r("valueProperties", "\\b", ":(.+?);",
					function(e) {
						return e.replace(a, i + "$1")
					},
					e)
				}
				return n && (e = r("selectors", "", "\\b", t.prefixSelector, e), e = r("atrules", "@", "\\b", "@" + i + "$1", e)),
				e = e.replace(RegExp("-" + i, "g"), "-"),
				e = e.replace(/-\*-(?=[a-z]+)/gi, t.prefix)
			},
			property: function(e) {
				return (t.properties.indexOf(e) ? t.prefix: "") + e
			},
			value: function(e) {
				return e = r("functions", "(^|\\s|,)", "\\s*\\(", "$1" + t.prefix + "$2(", e),
				e = r("keywords", "(^|\\s)", "(\\s|$)", "$1" + t.prefix + "$2$3", e)
			},
			prefixSelector: function(e) {
				return e.replace(/^:{1,2}/,
				function(e) {
					return e + t.prefix
				})
			},
			prefixProperty: function(e, r) {
				var n = t.prefix + e;
				return r ? StyleFix.camelCase(n) : n
			}
		}; !
		function() {
			var e = {},
			r = [],
			n = getComputedStyle(document.documentElement, null),
			i = document.createElement("div").style,
			a = function(t) {
				if ("-" === t.charAt(0)) {
					r.push(t);
					var n = t.split("-"),
					i = n[1];
					for (e[i] = ++e[i] || 1; n.length > 3;) {
						n.pop();
						var a = n.join("-");
						o(a) && -1 === r.indexOf(a) && r.push(a)
					}
				}
			},
			o = function(e) {
				return StyleFix.camelCase(e) in i
			};
			if (n.length > 0) for (var s = 0; s < n.length; s++) a(n[s]);
			else for (var l in n) a(StyleFix.deCamelCase(l));
			var u = {
				uses: 0
			};
			for (var p in e) {
				var f = e[p];
				u.uses < f && (u = {
					prefix: p,
					uses: f
				})
			}
			t.prefix = "-" + u.prefix + "-",
			t.Prefix = StyleFix.camelCase(t.prefix),
			t.properties = [];
			for (var s = 0; s < r.length; s++) {
				var l = r[s];
				if (0 === l.indexOf(t.prefix)) {
					var c = l.slice(t.prefix.length);
					o(c) || t.properties.push(c)
				}
			}
			"Ms" != t.Prefix || "transform" in i || "MsTransform" in i || !("msTransform" in i) || t.properties.push("transform", "transform-origin"),
			t.properties.sort()
		} (),
		function() {
			function e(e, r) {
				return i[r] = "",
				i[r] = e,
				!!i[r]
			}
			var r = {
				"linear-gradient": {
					property: "backgroundImage",
					params: "red, teal"
				},
				calc: {
					property: "width",
					params: "1px + 5%"
				},
				element: {
					property: "backgroundImage",
					params: "#foo"
				},
				"cross-fade": {
					property: "backgroundImage",
					params: "url(a.png), url(b.png), 50%"
				}
			};
			r["repeating-linear-gradient"] = r["repeating-radial-gradient"] = r["radial-gradient"] = r["linear-gradient"];
			var n = {
				initial: "color",
				"zoom-in": "cursor",
				"zoom-out": "cursor",
				box: "display",
				flexbox: "display",
				"inline-flexbox": "display",
				flex: "display",
				"inline-flex": "display",
				grid: "display",
				"inline-grid": "display",
				"min-content": "width"
			};
			t.functions = [],
			t.keywords = [];
			var i = document.createElement("div").style;
			for (var a in r) {
				var o = r[a],
				s = o.property,
				l = a + "(" + o.params + ")"; ! e(l, s) && e(t.prefix + l, s) && t.functions.push(a)
			}
			for (var u in n) {
				var s = n[u]; ! e(u, s) && e(t.prefix + u, s) && t.keywords.push(u)
			}
		} (),
		function() {
			function r(e) {
				return a.textContent = e + "{}",
				!!a.sheet.cssRules.length
			}
			var n = {
				":read-only": null,
				":read-write": null,
				":any-link": null,
				"::selection": null
			},
			i = {
				keyframes: "name",
				viewport: null,
				document: 'regexp(".")'
			};
			t.selectors = [],
			t.atrules = [];
			var a = e.appendChild(document.createElement("style"));
			for (var o in n) {
				var s = o + (n[o] ? "(" + n[o] + ")": ""); ! r(s) && r(t.prefixSelector(s)) && t.selectors.push(o)
			}
			for (var l in i) {
				var s = l + " " + (i[l] || ""); ! r("@" + s) && r("@" + t.prefix + s) && t.atrules.push(l)
			}
			e.removeChild(a)
		} (),
		t.valueProperties = ["transition", "transition-property"],
		e.className += " " + t.prefix,
		StyleFix.register(t.prefixCSS)
	}
} (document.documentElement);

转载请注明出处 AE博客|墨渊 » CSS打造的动感loading效果

发表评论

路人甲

网友评论(0)