Паукообразный скрипт
Здравствуйте!
Когда-то видел на сайте очень красивый скрипт, чем-то напоминающий паука. Попытался изобразить на картинке: ![]() А сейчас найти не получается ничего похожего. Смысл в том, что есть точки и когда ведешь мышью над этими точками, вблизи курсора возникают нити, которые приклеиваются к курсору. Может, кто-то знает что-то подобное? Или хотя бы как это называется:) А если делать самому, то с чего начать? Вижу тут несколько проблем: - как выбрать точки, которые находятся рядом с курсором (перебрать массив из точек и сравнивать координаты 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:17. |