Паукообразный скрипт
Здравствуйте!
Когда-то видел на сайте очень красивый скрипт, чем-то напоминающий паука. Попытался изобразить на картинке: ![]() А сейчас найти не получается ничего похожего. Смысл в том, что есть точки и когда ведешь мышью над этими точками, вблизи курсора возникают нити, которые приклеиваются к курсору. Может, кто-то знает что-то подобное? Или хотя бы как это называется:) А если делать самому, то с чего начать? Вижу тут несколько проблем: - как выбрать точки, которые находятся рядом с курсором (перебрать массив из точек и сравнивать координаты x и y?). - ну хорошо, если даже так, то что представляют собой эти нити? Прозрачная png картинка или что? - поворот нитей осуществляется с помощью transform rotate? |
void(), это наверняка было полотно canvas или svg
|
Nexus,
о, блин - до этих тем я еще не добрался. Вообще-то да - наверняка даже canvas... |
void(),
Здесь есть нечто похожее |
void(),
там был canvas, где тоже не помню ... варианты на тему http://javascript.ru/forum/showthrea...768#post444775 http://javascript.ru/forum/showthrea...976#post405988 |
Dilettante_Pro,
рони, wow! Спасибо вам - это то, что надо! |
|
рони,
Класс) Эх, буду пытаться повторить) |
Rise,
Упс, странный все-таки этот google photos. Для меня картинка отображалась. Похоже остальные включили телепатические способности))) ![]() |
Rise,
тогда воспользуюсь старым добрым piccy.info. Спасибо, что обратили на это внимание, а то я бы так и постил картинки, а их никто бы не видел. Капец :lol: Да тут картинка - это сильно звучит) каракули, только чтобы понять смысл. ![]() |
void(),
У меня в хроме вполне видны. В ИЕ - тоже. Теперь все три. |
Rise,
видно? ![]() |
void(),
<!DOCTYPE HTML>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
html, body{
height: 100%;
}
body{
position: relative;
background-color: #FFD700;
}
hr.connection{
position: absolute;
width: 0px;
height: 1px;
background-color: #00008B;
padding: 0;
margin: 0;
z-index: 2;
transition: width .8s linear;
}
.one {
background-color: #A0522D;
position: absolute;
width: 5px;
height: 5px;
border-radius: 50%;
}
.two{
border-radius: 8px;
border: 6px solid #006400;
position: absolute;
top: 30%;
left: 50%;
background-color: #228B22;
z-index: 1;
width: 128px;
height: 128px;
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script>
(function($) {
$.fn.connectionItem = function(options) {
var defaults = {
to: $(window)
};
var settings = $.extend({}, defaults, options);
return this.each(function() {
var from = $(this);
var x0, y0;
var x, y, x1, y1, r;
var to = $(settings.to);
var hr = $("<hr/>", {
"class": "connection",
css: {
position: "absolute"
}
}).appendTo("body");
hr.css("transform-origin", 0);
hr.css("-moz-transform-origin", 0);
hr.css("-webkit-transform-origin", 0);
hr.css("-o-transform-origin", 0);
function fn(event) {
var pos = from.offset();
x0 = pos.left - 6;
y0 = pos.top - 6;
x1 = event.pageX - 8;
y1 = event.pageY - 8;
x = x1 - x0;
y = y1 - y0;
var w = Math.sqrt(x * x + y * y);
w > 150 && (w = 0);
r = 180 - 180 / Math.PI * Math.atan2(y, x);
hr.css({
left: x1,
top: y1,
width: w
});
hr.css("transform", "rotate(-" + r + "deg)");
hr.css("-moz-transform", "rotate(-" + r + "deg)");
hr.css("-webkit-transform", "rotate(-" + r + "deg)");
hr.css("-o-transform", "rotate(-" + r + "deg)")
}
$(document).on({
mousemove: fn
})
})
}
})(jQuery);
$(function(){
function rand(a) {
return 5 + Math.floor(Math.random() * a)
}
$.each(Array(40),function(indx, element){
$('<div>',{css : {top : rand(80)+"%",left : rand(80)+"%"} , "class" : "one"})
.appendTo('body')
});
$(".one").connectionItem();//
});
</script>
</head>
<body>
</body>
</html>
|
:write:
Все забрал - пошел разбираться и писать код. Rise, Спасибо за формулу, класс! рони - все-таки нереально крутой. нет слов) :thanks: |
void(),
на всякий случай, сделано из прошлого варианта, некоторые строки лишние , нет оптимизации, можно попробовать убрать строку 26 |
рони,
ок. |
void(),
количество ножек "паучка" можно указать в строке 121 :)
<!DOCTYPE HTML>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
html, body{
height: 100%;
}
body{
position: relative;
background-color: #FFD700;
}
hr.connection{
position: absolute;
width: 0px;
height: 1px;
background-color: #00008B;
padding: 0;
margin: 0;
z-index: 2;
}
.one {
background-color: #A0522D;
position: absolute;
width: 5px;
height: 5px;
border-radius: 50%;
}
.two{
border-radius: 8px;
border: 6px solid #006400;
position: absolute;
top: 30%;
left: 50%;
background-color: #228B22;
z-index: 1;
width: 128px;
height: 128px;
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script>
(function($) {
$.fn.connectionItem = function(options) {
var defaults = {
num: 5
};
var settings = $.extend({}, defaults, options);
var elems = $(this).get();
var num = Math.min(settings.num, elems.length);
var line = $.map(Array(num), function(indx, element) {
var hr = $("<hr/>", {
"class": "connection",
css: {
position: "absolute"
}
}).appendTo("body");
hr.css("transform-origin", 0);
hr.css("-moz-transform-origin", 0);
hr.css("-webkit-transform-origin", 0);
hr.css("-o-transform-origin", 0);
return hr
});
function extraction(event) {
var k = elems.map(function(el) {
var x0,
y0, x, y, x1, y1, r, w, pos;
pos = $(el).offset();
x0 = pos.left - 6;
y0 = pos.top - 6;
x1 = event.pageX - 8;
y1 = event.pageY - 8;
x = x1 - x0;
y = y1 - y0;
w = Math.sqrt(x * x + y * y);
r = 180 - 180 / Math.PI * Math.atan2(y, x);
return {
left: x1,
top: y1,
width: w,
transform: "rotate(-" + r + "deg)"
}
}).sort(function(a, b) {
return a.width - b.width
}).slice(0, num).forEach(function(css, i) {
line[i].css(css)
})
}
$(document).on({
mousemove: extraction
});
return this
}
})(jQuery);
$(function(){
function rand(a) {
return 5 + Math.floor(Math.random() * a)
}
$.each(Array(47),function(indx, element){
$('<div>',{css : {top : rand(80)+"%",left : rand(80)+"%"} , "class" : "one"})
.appendTo('body')
});
$(".one").connectionItem({num : 6});//
});
</script>
</head>
<body>
</body>
</html>
|
рони,
я в шоке!! Как??? :) А за счет чего в прошлой версии падала производительность? Я пытался оптимизировать, но до такого вообще и близко не дотянул) А, все - я понял) Это "бомба"! |
Цитата:
|
Rise,
здорово! :thanks: |
Rise,
клааас. Мега-круто! Даже визуально код выглядит, как стихи - я поражаюсь... Надеюсь, недели 2 мне хватит, чтобы выкупить, что в этом скрипте происходит :D А потом, научившись на этих примерах, я уже и сам тоже начну думать мозгом) :thanks: |
Rise,
:thanks: :)
<canvas width="400" height="200" style="outline:1px solid black;cursor:none;"></canvas>
<script>
"use strict"
class Point {
constructor(x, y, radius) {
this.x = x;
this.y = y;
this.radius = radius;
this.color = "#0000FF";
}
render(game) {
game.ctx2d.beginPath();
game.ctx2d.fillStyle = this.color;
game.ctx2d.arc(this.x, this.y, this.radius, 0, 7);
game.ctx2d.fill();
}
}
class Cursor extends Point {
constructor(x, y, radius, length, filter) {
super(x, y, radius);
this.length = length;
this.filter = filter;
this.color = "#" + ("000000" + (Math.random() * 0xffffff | 0).toString(16)).slice(-6);
this.points = new Set();
}
search(points) {
this.points.clear();
for (let point of points) {
point.color = "#0000FF";
if (this.filter(this, point)) {
point.color = "#7FFF00";
this.points.add(point);
}
}
}
render(game) {
this.search(game.points);
game.ctx2d.beginPath();
game.ctx2d.strokeStyle = this.color;
for (let point of this.points) {
game.ctx2d.moveTo(this.x, this.y);
game.ctx2d.lineTo(point.x, point.y);
}
game.ctx2d.closePath();
game.ctx2d.stroke();
super.render(game);
}
}
class Game {
constructor(canvas, cursor, points) {
this.ctx2d = canvas.getContext('2d');
this.cursor = cursor;
this.points = new Set(points);
this.render();
canvas.onmousemove = (e) => {
this.cursor.x = e.offsetX;
this.cursor.y = e.offsetY;
this.render();
};
}
render() {
this.ctx2d.clearRect(0, 0, 400, 200);
for (let point of this.points)
point.render(this);
this.cursor.render(this);
}
}
const theGame = new Game(
document.querySelector('canvas'),
new Cursor(200, 100, 2, 50, (A, B) => B.x > A.x - A.length && B.x < A.x + A.length && B.y > A.y - A.length && B.y < A.y + A.length),
new Array(10 * 20).fill(0).map((v, i) => new Point(20 * (i % 20) + 10, 20 * (i / 20 | 0) + 10, 2))
);
</script>
|
Rise,
:) :victory: |
| Часовой пояс GMT +3, время: 13:40. |