23.06.10
Сегодня мы реализуем с помощью jQuery вот такое облако тегов, с виду представляющее из себя 3D-карусель:

А работает это вот так.
Для построения облака тегов мы будем использовать небольшой (4,5Кб) для jQuery. Собственно автор движка и является автором данного примера.
jQuery – выстраиваем 3D кольцо из меток
Наше 3D кольцо будет представлять из себя всего лишь массив трехмерных точек.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
var Ring = function (radius, numOfItems){
//Пробежимся по всем точкам кольца
for (var i = numOfItems - 1; i >= 0; i--)
{
//вычисляем, в какой точке каждый элемент касается кольца
var angle = i * Math.PI * 2 / numOfItems;
//Переводим эти координаты в плоскость экрана
var x = Math.sin(angle) * radius;
var y = Math.cos(angle) * radius;
var z = 0;
//И добавляем полученную точку в наш массив
this.pointsArray.push(this.make3DPoint(x,y,z));
}
};
//Остается только унаследовать DisplayObject3D.
Ring.prototype = new DisplayObject3D(); |
Класс Ring у нас имеет два параметра – радиус кольца и количество точек, размещенных на нем. Все точки расположены на одинаковом расстоянии друг от друга по периметру кольца.
HTML – создаем разметку для нашего облака тегов
Разметка у нас будет всего лишь простым неупорядоченным списком, содержащим наши теги:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<div id="item">
<ul>
<li>jQuery</li>
<li>JavaScript</li>
<li>HTML</li>
<li>PHP</li>
<li>3D</li>
<li>Ajax</li>
<li>CSS</li>
<li>Dev-4-web.ru</li>
<li>Experimental</li>
<li>Development</li>
<li>web</li>
<li>Руководство</li>
<li>.NET</li>
</ul>
</div> |
Добавим еще jQuery
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
$(document).ready(function() {
//инициализируем камеру
var camera = new Camera3D();
camera.init(0,0,0,300);
var container = $("#item");
//Устанавливаем элемент, который будет содержать наш 3D-контейнер
var item = new Object3D(container);
//Добавляем наше кольцо к этому элементу
//Первый аргумент - радиус кольца
//Второй аргумент - количество меток на кольце
//В нашем случае мы передаем количество элементов списка
item.addChild(new Ring(200, $("#item ul li").length));
//Создаем сцену (см 3D Engine)
var scene = new Scene3D();
//Добавляем наш 3D-объект на сцену
scene.addToScene(item);
var mouseX,mouseY = 0;
var offsetX = $("#item").offset().left;
var offsetY = $("#item").offset().top;
var speed = 6000;
//Обрабатываем перемещения мыши
$().mousemove(function(e){
mouseX = e.clientX - offsetX - (container.width() / 2);
mouseY = e.clientY - offsetY - (container.height() / 2);
});
//вращение кольца
axisRotation.x = 1.5;
var animateIt = function(){
if (mouseX != undefined){
//Когда пользователь двигает мышь влево-вправо
//вращаем кольцо вокруг оси У
axisRotation.y += (mouseX) / speed;
}
scene.renderCamera(camera);
};
setInterval(animateIt, 20);
}); |
Заключение
Вот это весь html-файл, который у нас получился:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
<html>
<head>
<title>3d engine</title>
<style type="text/css" media="screen">
#item{
width:100px;
height:100px;
margin:0 auto;
top:300px;
position: relative;
}
ul{
list-style-type: none;
}
body{
background-color: #111;
color: #69c;
font-family: Arial, "MS Trebuchet", sans-serif;
font-weight: bold;
font-size:1em;
}
</style>
</head>
<body>
<div id="item">
<ul>
<li>website</li>
<li>jQuery</li>
<li>JavaScript</li>
<li>HTML</li>
<li>PHP</li>
<li>3D</li>
<li>Ajax</li>
<li>CSS</li>
<li>Design</li>
<li>Flash</li>
<li>Experimental</li>
<li>Development</li>
<li>web</li>
<li>Tutorial</li>
<li>ASP</li>
</ul>
</div>
</body>
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script src="3DEngine.js" type="text/javascript" charset="utf-8"></script>
<script src="Ring.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
//<![CDATA[
$(document).ready(function() {
var camera = new Camera3D();
camera.init(0,0,0,300);
var container = $("#item");
var item = new Object3D(container);
item.addChild(new Ring(200, $("#item ul li").length));
var scene = new Scene3D();
scene.addToScene(item);
var mouseX,mouseY = 0;
var offsetX = $("#item").offset().left;
var offsetY = $("#item").offset().top;
var speed = 6000;
$().mousemove(function(e){
mouseX = e.clientX - offsetX - (container.width() / 2);
mouseY = e.clientY - offsetY - (container.height() / 2);
});
axisRotation.x = 1.5;
var animateIt = function(){
if (mouseX != undefined){
axisRotation.y += (mouseX) / speed;
}
scene.renderCamera(camera);
};
setInterval(animateIt, 20);
});
//]]>
</script>
</html> |
А это – Ring.js:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
var Ring = function (radius, numOfItems){
for (var i = numOfItems - 1; i >= 0; i--)
{
var angle = i * Math.PI * 2 / numOfItems;
var x = Math.sin(angle) * radius;
var y = Math.cos(angle) * radius;
var z = 0;
this.pointsArray.push(this.make3DPoint(x,y,z));
}
};
Ring.prototype = new DisplayObject3D(); |
Ну и традиционное:
Демо
Архив с исходниками
А мыслей, как эту тварь немного умедлить, нету?
строка 26: var speed=6000;
Люди, помогите если можете…Я учусь создовать свой сайт, мало-ли пригодится, да и что б время убить. Я решил поставить облако тегов и набрел на этот сайт, но что то неполучается постаивть его…Может кто помочь? если да то напишите мне в скайпе… dimon05091 -это мой скайп, помогите пожалуйста если несложно…
Все работает нормально, вот только по середине оси карусели выводятся 10 знаков + , вот такая штука +++++++++
Может быть вы что-то делаете неправильно?
У вас демо с сайта нормально работает? Какой у вас браузер?
Подскажите как уменьши размер облака, сильно широко оно расходится
В исходниках есть строка
item.addChild(new Ring(200, $(“#item ul li”).length));
200 – радиус (в исходниках посмотреть можно)
Очень полезная штука. А можно переделать эту карусель тегов на карусель фотографий? Подскажите пожалуйста
Ну кто вам мешает в список в каждый элемент картинку всунуть?
Thanks
Отличная вещь! Только мне одному кажется что вращение “по спирали”? Как его заставить вращаться в одной плоскости?
hey DONLINO
try to change string #78:
axisRotation.x = 1.8;
Play with this setting and you will succeed.
to warkat
пробовал менять значения, получается другой наклон эллипса. =(
Конфликтует с моим Сода-Слайдером … пол для уже мучаюсь ничего не получается
или то или то(