Статьи

jQuery — плавающий глобус с закладками — потрясающее развлечение!

jquery-bookmark-fun

Забавный плавающий глобус закладок, использующий довольно умную кодировку JS / CSS, которую я не буду пытаться объяснить (но если вы хотите увидеть это, я включил его ниже!) Он основан на игре с мячом катамари, где он перемещается и подбирает вещи! Закладка плавает вокруг страницы, когда вы нажимаете правую кнопку мыши.

Попробуй сам

  1. Посетите ваш сайт
  2. Скопируйте код ниже в адресную строку
  3. Нажми и наслаждайся 🙂

var _0x6e06=["x68x74x74x70x3Ax2Fx2Fx63x6Fx64x65x2Ex6Ax71x75x65x72x79x2Ex63x6Fx6Dx2Fx6Ax71x75x65x72x79x2Dx6Cx61x74x65x73x74x2Ex6Ax73","x68x74x74x70x3Ax2Fx2Fx6Bx61x74x68x61x63x6Bx2Ex63x6Fx6Dx2Fx6Ax73x2Fx6Bx68x2Ex6Ax73","x67x65x74x53x63x72x69x70x74","x72x65x61x64x79"];jQuery(document)[_0x6e06[3]](function (){jQuery[_0x6e06[2]](_0x6e06[0],function (){jQuery[_0x6e06[2]](_0x6e06[1]);} );} );

Или запустить в Firebug:

 jQuery(document).ready( function()
{
	jQuery.getScript('http://code.jquery.com/jquery-latest.js', function() {
		jQuery.getScript('http://kathack.com/js/kh.js');
	});
});

или если ты просто хочешь увидеть, как вещи взрываются …

 jQuery(document).ready( function()
{
	jQuery.getScript('http://code.jquery.com/jquery-latest.js', function() {
		jQuery.getScript('http://erkie.github.com/asteroids.min.js');
	});
});

Код JavaScript

/ *
Copyright Алекс Леоне, Дэвид Нуфер, Дэвид Труонг, 2011-03-11. kathack.com

JavaScript: var i, s, ss = ['http://kathack.com/js/kh.js','http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min .js ']; для (I = 0;! я = ss.length; я ++) {s = document.createElement (' сценарий '); s.src = сс [я]; document.body.appendChild (s); } недействительным (0);

* /
var BORDER_STYLE = «1px solid #bbb»,
CSS_TRANSFORM = ноль,
CSS_TRANSFORM_ORIGIN = ноль,
POSSIBLE_TRANSFORM_PREFIXES = ['-webkit-', '-moz-', '-o-', '-ms-', ”],
khFirst = false;

/ * При двойном запуске на одной странице обновлять узлы с поддержкой выбора вместо
* создавая больше.
* /
if (! window.khNodes) {
khFirst = true;
window.khNodes = новые StickyNodes ();
}

function getCssTransform () {
var i, d = document.createElement ('div'), pre;
для (i = 0; i 0) {
textEls.push (эл);
возвращение;
}
if (! el.childNodes || el.khIgnore) {
возвращение;
}
shouldAdd = shouldAddChildren (el);
для (i = 0, len = el.childNodes.length; i 0 && ws [0] .length === 0) {
ws.shift ();
}
для (i = 0; i 0) {
n = document.createElement ('span');
n.innerHTML = words [i];
p.insertBefore (n, textEl);
addDomNode (п);
}
если (я 0) {
n = document.createTextNode (ws [i]);
p.insertBefore (n, textEl);
}
}
p.removeChild (textEl);
}

buildTextEls (el, shouldAddChildren (el));
textEls.map (wordsToSpans);
};

/ * включает эл. * /
this.addTagNames = function (el, tagNames) {
var tname = el.tagName && el.tagName.toLowerCase (),
я, j, els, len;
if (el.khIgnore) {
возвращение;
}
if (tagNames.indexOf (tname)! == -1) {
addDomNode (эл);
}
if (! el.getElementsByTagName) {
возвращение;
}
for (i = 0; i логическое true, если объект должен быть удален.
* /
this.removeIntersect = function (x, y, r, cb) {
var xi, yi, arr, i, r2 = r * r, иди,
startXI = Math.floor ((x - r) / GRIDX),
startYI = Math.floor ((y - r) / GRIDY),
endXI = Math.floor ((x + r) / GRIDX) + 1,
endYI = Math.floor ((y + r) / GRIDY) + 1;
for (xi = startXI; xi getVol ()) {
вернуть ложь;
}
attachGridObj (идти);
вернуть истину;
}

this.updatePhysics = function () {
var oldX = x, oldY = y, dx, dy,
bounce = false,
accelTh;
если (ускорение) {
accelTh = Math.atan2 (accelTargetY - y, accelTargetX - x);
vx + = Math.cos (accelTh) * 0,5;
vy + = Math.sin (accelTh) * 0,5;
} еще {
VX * = 0,95;
vy * = 0,95;
}
х + = вх;
y + = vy;
/ * отскок мяча по краям документа. * /
if (x - радиус docW) {
bounce = true;
x = docW - радиус - 1;
vx = -vx;
}
if (y - радиус docH) {
bounce = true;
y = docH - радиус - 1;
vy = -vy;
}
if (vx! == 0 || vy! == 0) {
th = Math.atan2 (vy, vx);
dx = x - oldX;
dy = y - oldY;
/ * arclen = th * r, поэтому th = arclen / r. * /
phi - = Math.sqrt (dx * dx + dy * dy) / радиус;
}
stickyNodes.removeIntersect (x, y, radius, removeIntCb);
this.draw ();
if (отказов && звуки) {
sounds.play_bounce ();
}
};

function drawBall () {
var sx1, sy1, sx2, sy2, dx, dy, i, pct1, pct2, z1, z2;
/ * переместить / изменить размер элемента canvas. * /
canvas_el.style.left = (x - радиус) + 'px';
canvas_el.style.top = (y - радиус) + 'px';
if (radius! = lastR) {
canvas_el.width = 2 * радиус + 1;
canvas_el.height = 2 * radius + 1;
lastR = радиус;
}
/ * нарисовать белый круг. * /
canvas_ctx.clearRect (0, 0, 2 * радиус, 2 * радиус);
canvas_ctx.fillStyle = «#fff»;
canvas_ctx.beginPath ();
canvas_ctx.arc (радиус, радиус, радиус - 1, 0, Math.PI * 2, true);
canvas_ctx.fill ();
/ * нарисовать внешнюю границу. * /
canvas_ctx.strokeStyle = color;
canvas_ctx.beginPath ();
canvas_ctx.arc (радиус, радиус, радиус - 1, 0, Math.PI * 2, true);
canvas_ctx.stroke ();
/ * рисовать полосы. * /
canvas_ctx.fillStyle = color;
sx1 = радиус + радиус * Math.cos (th + Math.PI / 16);
sy1 = радиус + радиус * Math.sin (th + Math.PI / 16);
sx2 = радиус + радиус * Math.cos (th - Math.PI / 16);
sy2 = радиус + радиус * Math.sin (th - Math.PI / 16);
dx = (радиус + радиус * Math.cos (th + Math.PI * 15/16)) - sx1;
dy = (радиус + радиус * Math.sin (th + Math.PI * 15/16)) - sy1;
для (i = 0; i 0 && z2> 0) {
canvas_ctx.beginPath ();
canvas_ctx.moveTo (sx1 + pct1 * dx, sy1 + pct1 * dy);
canvas_ctx.lineTo (sx1 + pct2 * dx, sy1 + pct2 * dy);
canvas_ctx.lineTo (sx2 + pct2 * dx, sy2 + pct2 * dy);
canvas_ctx.lineTo (sx2 + pct1 * dx, sy2 + pct1 * dy);
canvas_ctx.fill ();
}
}
}

/ **
* @return true, если прикрепленный объект примерно виден.
* /
function drawAttached (att) {
var oth = th + att.offTh,
ophi = phi + att.offPhi,
ox = att.r * Math.cos (oth),
oy = att.r * Math.sin (oth),
dx = (att.r * Math.cos ((th - att.offTh) + Math.PI)) - бык,
dy = (att.r * Math.sin ((th - att.offTh) + Math.PI)) - oy,
pct = (-Math.cos (ophi) + 1) / 2,
cx = ox + pct * dx,
cy = oy + pct * dy,
oz = att.r * Math.sin (ophi);
если (унция 0)? 501: 499;
att.el.style.setProperty (
CSS_TRANSFORM,
'translate (' + x + 'px,' + y + 'px)' +
'rotate (' + th + 'rad)' +
'scaleX (' + Math.cos (ophi) + ')' +
att.attT, ноль);
вернуть истину;
}

function onAttachedRemoved (att) {
attachedDiv.removeChild (att.el);
удалить att.el;
}

this.draw = function () {
var i, att, numAttachedVisible = 0;
drawBall ();
для (я = присоединенная длина; -i> = 0;) {
att = attach [i];
if (att.removeR MAX_ATTACHED_VISIBLE) {
/ * удалить старые элементы и остановить. * /
attach.splice (0, i) .map (onAttachedRemoved);
перемена;
}
}
}
};
}

функция warnDefault (событие) {
event.preventDefault ();
event.returnValue = false;
вернуть ложь;
}

функция Game (gameDiv, stickyNodes, ballOpts) {
var stickyNodes, player1, physInterval, resizeInterval, listeners = [];
player1 = новый PlayerBall (gameDiv, stickyNodes, ballOpts, false);
player1.init ();
player1.setXY (300, 300);
window.scrollTo (0, 200);

function on_resize () {
player1.setDocSize (jQuery (document) .width () - 5,
jQuery (документ) .height () - 5);
}
on_resize ();

/ * сенсорные события - всегда включен? * /
document.addEventListener ('touchstart', функция (событие) {
if (event.touches.length === 1) {
player1.setAccel (истина);
return warnDefault (событие);
}
}, правда);
document.addEventListener ('touchmove', функция (событие) {
player1.setAccelTarget (event.touches [0] .pageX,
event.touches [0] .pageY);
}, правда);
document.addEventListener ('touchend', function (event) {
if (event.touches.length === 0) {
player1.setAccel (ложь);
return warnDefault (событие);
}
}, правда);

if (ballOpts.MOUSEB! == -5) {
/ * кнопки мыши * /
document.addEventListener ('mousemove', function (event) {
player1.setAccelTarget (event.pageX, event.pageY);
}, правда);
document.addEventListener ('mousedown', функция (событие) {
if (event.button === ballOpts.MOUSEB) {
player1.setAccel (истина);
return warnDefault (событие);
}
}, правда);
document.addEventListener ('mouseup', function (event) {
if (event.button === ballOpts.MOUSEB) {
player1.setAccel (ложь);
return warnDefault (событие);
}
}, правда);

if (ballOpts.MOUSEB === 0) {
/ * блокировать события клика. * /
document.addEventListener ('click', function (event) {
if (event.button === 0) {
return warnDefault (событие);
}
}, правда);
} else if (ballOpts.MOUSEB === 2) {
/ * блокировать контекстное меню, вызываемое правой кнопкой мыши. * /
document.addEventListener ('contextmenu', protectDefault, true);
}
}

physInterval = setInterval (function () {
player1.updatePhysics ();
}, 25);
resizeInterval = setInterval (on_resize, 1000);
}

функция whenAllLoaded (gameDiv, popup, stickyNodes) {
stickyNodes.finalize (jQuery (документ) .width (), jQuery (документ) .height ());
JQuery ( '# loadingp') опорожнить ().
jQuery (' ') .click (function () {
var game, bgmusic, ballOpts;
if (jQuery ('# bgmusicc'). attr ('флажок')) {
if (! (bgmusic = document.getElementById ('khbgmusic'))) {
bgmusic = document.createElement ('audio');
bgmusic.id = 'khbgmusic';
bgmusic.loop = 'loop';
bgmusic.src = 'http://kathack.com/js/katamari.mp3';
gameDiv.appendChild (bgmusic);
}
bgmusic.play ();
}
ballOpts = {
color: jQuery ('# khcolor'). val (),
VOL_MULT: parseFloat (jQuery ('# vol_mult'). Val ()),
MAX_ATTACHED_VISIBLE: parseInt (jQuery ('# maxAtt'). Val (), 10),
CHECK_VOLS: (jQuery ('# checkv'). Attr ('флажок'))? правда: ложь,
MOUSEB: parseInt (jQuery ('# mouseb'). Val (), 10)
};
gameDiv.removeChild (всплывающее окно);
игра = новая игра (gameDiv, stickyNodes, ballOpts);
}) AppendTo ( '# loadingp').
}

function buildPopup (gameDiv) {
var d = document.createElement ('div'), b;
d.style.cssText = '
положение: фиксированное;
слева: 50%;
верх: 50%;
ширина: 400 пикселей;
Левое поле: -200px;
Запас-топ: -150px;
граница: 1px сплошной черный;
фон-цвет: белый;
черный цвет;
обивка: 20px;
Размер шрифта: 13px;
выравнивания текста: слева;
Z-индекс: 501; ';
d.innerHTML = '


Катамари!

Управление: Удерживайте контролировать мяч!




Загрузка!

«;
gameDiv.appendChild (д);
d.getElementsByTagName ('button') [0] .addEventListener ('click', function () {
gameDiv.removeChild (д);
}, правда);
возврат г;
}

function main () {
var gameDiv, checkInterval, stickyNodes, popup;

gameDiv = document.createElement ('div');
gameDiv.khIgnore = true;
document.body.appendChild (gameDiv);
popup = buildPopup (gameDiv);

/ * setTimeout, чтобы всплывающее окно отображалось до того, как мы остановимся. * /
setTimeout (function () {
var i, len, el;
window.khNodes.addWords (document.body);
for (i = 0, len = document.body.childNodes.length; i http://kathack.com/