23.06.10

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

А работает это вот так.
Для построения облака тегов мы будем использовать небольшой (4,5Кб) 3D-движок для jQuery. Собственно автор движка и является автором данного примера.

jQuery – выстраиваем 3D кольцо из меток

Наше 3D кольцо будет представлять из себя всего лишь массив трехмерных точек.

JavaScript
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 – создаем разметку для нашего облака тегов

Разметка у нас будет всего лишь простым неупорядоченным списком, содержащим наши теги:

XHTML
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

JavaScript
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-файл, который у нас получился:

XHTML
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:

JavaScript
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();

Ну и традиционное:
Демо
Архив с исходниками

Комментарии

  1. dog:

    А мыслей, как эту тварь немного умедлить, нету?

  2. строка 26: var speed=6000;

  3. Dezmunt:

    Люди, помогите если можете…Я учусь создовать свой сайт, мало-ли пригодится, да и что б время убить. Я решил поставить облако тегов и набрел на этот сайт, но что то неполучается постаивть его…Может кто помочь? если да то напишите мне в скайпе… dimon05091 -это мой скайп, помогите пожалуйста если несложно…

  4. juda:

    Все работает нормально, вот только по середине оси карусели выводятся 10 знаков + , вот такая штука +++++++++

  5. Может быть вы что-то делаете неправильно?
    У вас демо с сайта нормально работает? Какой у вас браузер?

  6. Подскажите как уменьши размер облака, сильно широко оно расходится

  7. Zadira:

    Очень полезная штука. А можно переделать эту карусель тегов на карусель фотографий? Подскажите пожалуйста

  8. DonLino:

    Отличная вещь! Только мне одному кажется что вращение “по спирали”? Как его заставить вращаться в одной плоскости?

  9. hey DONLINO

    try to change string #78:

    axisRotation.x = 1.8;

    Play with this setting and you will succeed.

  10. DonLino:

    to warkat
    пробовал менять значения, получается другой наклон эллипса. =(

  11. Конфликтует с моим Сода-Слайдером … пол для уже мучаюсь ничего не получается
    или то или то(

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>