适合用来做前台页面还是后台的管理页面?使用过的来说点吧!
------解决方案--------------------
已经更名为 JX,看那特效,主要是服务于前端的
项目主页: http://alloyteam.github.com/JX/
例子:
- HTML code
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8" /> <title>Jx About</title> <meta http-equiv="imagetoolbar" content="no"> <style type="text/css"> html { overflow: hidden; width: 100%; height: 100%; } body { background: -webkit-gradient(linear, 0 0, 0 900, from(#025695), to(#ADD1E3)) repeat scroll 0 0 transparent; background: -moz-linear-gradient(center top, #025695, #ADD1E3) repeat scroll 0 0 transparent; background: -o-linear-gradient(top, #025695, #ADD1E3); filter:progid:DXImageTransform.Microsoft.Gradient(startColorStr='#025695',endColorStr='#ADD1E3',gradientType='0'); width: 100%; height: 100%; color: #fff; margin: 0; padding: 0; } .full { width: 100%; height: 100%; } #frm { position: absolute; width: 100%; height: 100%; left: 5%; top: 60px; font-size: 2em; font-weight: bold; font-family: verdana, arial; overflow: hidden; padding: 0.5em; } #frm span { position: relative; text-align: center; z-index: 1; } #mtxform { position: relative; z-index: 10; } .hidden { visibility: hidden; } h1 { font-size: 2.5em; font-weight: bold; font-family: verdana, arial; color: #fff; border-bottom: 1px solid #eee; width: 90%; line-height: 1.8; margin: 0 auto; } </style> <script type="text/javascript"> var mtx = function () { /* ==== private variables & methods ==== */ var stop = false; var frm, lineDelay, charDelay; var colorText, colorMatch, colorGhost, elapsedTime; var lineIndex = 0; var lineChar = []; var animStack = []; var colorStack = []; /* ==== rgb color ==== */ function colorRGB (c) { return 'rgb(' +Math.round(Math.min(255, Math.max(0, c[0])))+',' +Math.round(Math.min(255, Math.max(0, c[1])))+',' +Math.round(Math.min(255, Math.max(0, c[2])))+')'; } /* ==== Easing functions ==== */ function Ease () {} Ease.prototype = { ease : function () { this.m += this.s; this.x0 += (this.d * this.m * .0025); if (this.m == 20) this.s = -1; return this.x0; }, init : function (x0, x1) { this.m = 0; this.s = 1; this.d = x1 - x0; this.x0 = x0; } } /* ==== Load Lines ==== */ function loadLines () { // read text from HTML form text = document.forms.mtxform.text.value.split("\n"); // loop through all lines for (var j = 0; j < text.length; j++) { var t = text[j]; if (t) { var n = t.length; lineChar[j] = []; // first pass: create characters capture RELATIVE offset coordinates for (var i = 0; i < n; i++) lineChar[j][i] = new Character(t.charAt(i), j); // second pass: convert to absolute position for (var i = 0, o; o = lineChar[j][i]; i++) { if (o.c == "|") { // remove spaces lineChar[j].splice(i, 1); frm.removeChild(o.o); i--; } else { // convert to absolute position and render o.o.style.position = "absolute"; o.o.style.color = colorRGB(colorText); o.moveHTML(); // push first line in animation stack if (j == 0) pushAnim (o, charDelay * i); } } } } } /* ==== Character Constructor ==== */ function Character (c, line) { if (c == " ") c = "|"; this.c = c; // create HTML element and append the the container this.o = document.createElement("span"); this.o.innerHTML = c; this.o.style.zIndex = 2; frm.appendChild(this.o); // capture relative offset positions ! this.x0 = this.o.offsetLeft; this.y0 = -this.o.offsetHeight * 1.5; this.x1 = this.x0; this.x2 = this.x0; this.y1 = (line + 1) * this.o.offsetHeight; this.y2 = frm.offsetHeight; this.mx = new Ease(); this.my = new Ease(); this.c0 = [colorText[0], colorText[1], colorText[2]]; } /* ==== Character functions ==== */ Character.prototype = { // ---- character animation ---- anim : function (i) { // temporization if (this.delay > 0) { if (elapsedTime) this.delay -= new Date().getTime() - elapsedTime; } else { // moving this.x0 = this.mx.ease(); this.y0 = this.my.ease(); this.moveHTML(); if (!this.my.m && !this.mx.m) { // remove from stack animStack.splice(i, 1); // remove dead characters if (this.off) frm.removeChild(this.o); } } }, // ----- color fading ------ color : function (i) { this.c0[0] += this.cr[0]; this.c0[1] += this.cr[1]; this.c0[2] += this.cr[2]; this.ci++; this.o.style.color = colorRGB(this.c0); if (this.ci >= this.cs) colorStack.splice(i, 1); }, // ----- HTML positioning ----- moveHTML : function () { this.o.style.left = Math.round(this.x0) + "px"; this.o.style.top = Math.round(this.y0) + "px"; }, // ----- init color fading ------ colorFade : function (c1, steps) { this.cs = steps; this.cr = [(c1[0] - this.c0[0]) / steps, (c1[1] - this.c0[1]) / steps, (c1[2] - this.c0[2]) / steps]; if (this.cr[0] != 0 || this.cr[1] != 0 || this.cr[2] != 0){ this.ci = 0; colorStack.push (this); } } } /* ==== push character in the animation stack ==== */ function pushAnim (o, delay) { // init ease o.mx.init(o.x0, o.x1); o.my.init(o.y0, o.y1); o.delay = delay; // push stack animStack.push(o); } /* ==== next line ==== */ function nextLine () { if (lineIndex < lineChar.length - 1) { // display shadow text for (var i = 0, o; o = lineChar[lineIndex][i]; i++) { var s = o.o.cloneNode(true); s.style.zIndex = 1; s.style.color = colorRGB(colorGhost); frm.appendChild(s); } // matching next line characters for (var i = 0, t; t = lineChar[lineIndex + 1][i]; i++) { for (var j = 0, o; o = lineChar[lineIndex][j]; j++) { if (o.c == t.c) { // colors t.colorFade(colorMatch, o.match ? 1 : 40); t.match = true; // swap characters t.x0 = o.x0; t.y0 = o.y0; t.moveHTML(); // remove redundant character frm.removeChild(o.o); lineChar[lineIndex].splice(j, 1); break; } } } // take off redundant characters for (var i = 0, o; o = lineChar[lineIndex][i]; i++) { // set target position (off frame) o.y1 = frm.offsetHeight; o.off = true; o.match = false; o.colorFade (colorText, 40); // push in animation stack pushAnim (o, (lineDelay * .8) + charDelay * i); } } // push next line in animation stack lineIndex++; if (lineIndex < lineChar.length) { for (var i = 0, o; o = lineChar[lineIndex][i]; i++) pushAnim (o, lineDelay + charDelay * i); } } /* ==== main animation loop ==== */ function main() { // characters var n = animStack.length; if (n) { var i = n; while (i--) animStack[i].anim(i); } else nextLine (); // colors var i = colorStack.length; while (i--) colorStack[i].color(i); // get elapsed time and loop elapsedTime = new Date().getTime(); setTimeout(main, 16); } /* //////////// ==== public methods ==== //////////// */ return { /* ==== initialize script ==== */ init : function (cont, t1, t2, c1, c2, c3) { // container frm = document.getElementById(cont); lineDelay = t1; charDelay = t2; colorText = c1; colorMatch = c2; colorGhost = c3; loadLines(); main(); }, changeText : function () { document.getElementById("show").className = ""; document.getElementById("inputext").className = "hidden"; lineChar = []; animStack = []; colorStack = []; frm.innerHTML = ""; lineIndex = 0; elapsedTime = 0; loadLines(); frm.focus(); } } }(); /* ==== init text ==== */ onload = function () { document.getElementById('frm').style['height'] = document.documentElement.clientHeight - 60 + 'px'; // mtx.init( el, linesDelay, charsDelay, cText, cMatch, cGhost); mtx.init("frm", 800, 150, [255,255,255], [255,64,0], [44,44,44]); } </script> </head> <body> <div id="doc" class="doc full"> <h1>About</h1> <div id="frm"></div> <form id="mtxform" name="mtxform"> <span id="inputext" class="hidden"> <textarea rows="6" cols="46" id="text" name="text"> JX Javascript eXtension tools Don't Repeat Yourself! --by Alloy Team </textarea> </span> </form> </div> </body> </html>