Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Плавное сжимание изображения (https://javascript.ru/forum/misc/37408-plavnoe-szhimanie-izobrazheniya.html)

flasher167 18.04.2013 17:26

Плавное сжимание изображения
 
Есть круг. Он поделен на 4 сектора, нужно что бы при наведении на определенный сектор он начал сжиматься к центру.
Проблема в том что не знаю как сделать сжатие и как разместить изображения по кругу что бы выгладил круг.
<html> 
    <body> 
        <div style = "border: 1px solid gray; position: absolute; left: 0; top: 0; width: 402; height: 402;" onmousemove = "x = event.x; y = event.y" onmouseout = "x = y = 0"> 
            <script> 
                var n = 5;
                var x = 0, y = 0;
                var r = new Array(100, 100, 100, 100, 100);
                
                for (var i = 0; i < n; i++) document.writeln("<img id = div" + i + " style = 'border: 0px; position: absolute; left: 100; top: 100; width: 200; height: 200;' src = " + i + "_" + n + ".png>");
                
                window.setInterval("tick()", 10);
                
                function tick() {
                    var i = (Math.ceil(Math.atan2(x - 200, y - 200) / Math.PI / 2 * n) + n) % n;
                    var s = Math.sqrt((x - 200) * (x - 200) + (y - 200) * (y - 200));
                    if (s < r[i])
                        setRad(i, Math.min(r[i] + 3, 200));
                }
                
                function reset() {
                    for (var i = 0; i < n; i++)
                        setRad(i, 100)
                }
                
                function setRad(i, rad) {
                    r[i] = rad;
                    with (document.getElementById("div" + i).style) {
                        left = top = 200 - r[i];
                        width = height = 2 * r[i];
                    }
                }
            </script> 
        </div> 
        <input type = button onclick = "reset()" value = "Reset" style = "position: absolute; left: 10; top: 410"> 
    </body> 
</html>

изображения имеют имя 1_5.png 2_5.png и т.д

flasher167 19.04.2013 15:37

или можно как то по другому это сделать?

danik.js 19.04.2013 16:29

Например на svg?

tsigel 19.04.2013 16:31

Или на canvas

Dim@ 19.04.2013 17:01

tsigel,
SVG вроде лучше подходит для этих целей

tsigel 19.04.2013 17:06

Возможно. Честно говоря я не особо знаю как работать с svg, просто я заметил что некоторые вещи сделанные на нем не работают в некоторых версиях ie (хотя возможно что это по причине криворукости разработчиков), а canvas со скриптом для ie < 9 работает более-менее стабильно (если конечно не считать что скорость работы на ie < 9 оставляет желать лучшего).

Dim@ 19.04.2013 17:12

tsigel,
SVG в ИЕ ВООБЩЕ НЕТ - там есть аналог svg - vmg или что-то типо того

tsigel 19.04.2013 17:14

То-то оно не работает :haha:

Dim@ 19.04.2013 17:15

tsigel,
На ИЕ либо забивают, либо делают альтернативу;)

tsigel 19.04.2013 17:17

Dim@,
Спасибо, буду иметь в виду.

Dim@ 19.04.2013 17:19

tsigel,
незачто

flasher167 20.04.2013 20:00

ой ой ой а такого я не знаю и 1 раз слышу .. и код не напишу...

flasher167 22.04.2013 19:32

как сжатие сделать?

tsigel 23.04.2013 10:13

Вообщем если не хотите изучать всякие svg и canvas, то есть простой вариант.

При наведении на блок в котором лежит вся окружность слушайте событие mousemove. С помощью координат мыши вы сможете рассчитать когда курсор находится в круге и на каком он секторе (это придется считать самостоятельно без использования события hover, чисто математически это не сложно). Круг состоит из 4 картинок. При наведении на 1 из секторов пропорционально уменьшайте размер картинки и двигайте его к центру окружности. Вот и все.

Или читайте про svg/canvas и задавайте вопросы по ходу разработки.

flasher167 23.04.2013 17:57

Цитата:

Сообщение от tsigel
Вообщем если не хотите изучать всякие svg и canvas, то есть простой вариант.

При наведении на блок в котором лежит вся окружность слушайте событие mousemove. С помощью координат мыши вы сможете рассчитать когда курсор находится в круге и на каком он секторе (это придется считать самостоятельно без использования события hover, чисто математически это не сложно). Круг состоит из 4 картинок. При наведении на 1 из секторов пропорционально уменьшайте размер картинки и двигайте его к центру окружности. Вот и все.

Или читайте про svg/canvas и задавайте вопросы по ходу разработки.

а что... то что в 1 посте не правильно что ли?

tsigel 23.04.2013 18:26

А оно работает?) Не очень понятно написано, разбираться лень.
Выглядит так, как будто не работает. Особенно тут:
Цитата:

Сообщение от flasher167
<div style = "border: 1px solid gray; position: absolute; left: 0; top: 0; width: 402; height: 402;" onmousemove = "x = event.x; y = event.y" onmouseout = "x = y = 0">


flasher167 23.04.2013 19:32

он работает.. я проверял но там не то что мне нужно... в коде сектора расширяются, ну а мне нужно сужение ...

flasher167 23.04.2013 19:43

Вложений: 1
вот как сделано
опять же повторюсь нужно разместить их по кругу (как нормальный круг разбитый на сектора) и не расширение а сжатие реализовать

tsigel 24.04.2013 09:27

<body> 
        <div style="border: 1px solid gray; position: absolute; left: 0; top: 0; width: 402; height: 402;" onmousemove="x = event.x; y = event.y" onmouseout="x = y = 0"> 
            <script> 
                var n = 5;
                var x = 0, y = 0;
                var r = new Array(100, 100, 100, 100, 100);
                
                for (var i = 0; i < n; i++) document.writeln("<img id = div" + i + " style = 'border: 0px; position: absolute; left: 100; top: 100; width: 200; height: 200;' src = " + i + "_" + n + ".png>");
                
                window.setInterval("tick()", 10);
                
                function tick() {
                    var i = (Math.ceil(Math.atan2(x - 200, y - 200) / Math.PI / 2 * n) + n) % n;
                    var s = Math.sqrt((x - 200) * (x - 200) + (y - 200) * (y - 200));
                    if (s < r[i])
                        setRad(i, Math.min(r[i] + 3, 200));
                }
                
                function reset() {
                    for (var i = 0; i < n; i++)
                        setRad(i, 100)
                }
                
                function setRad(i, rad) {
                    r[i] = rad;
                    with (document.getElementById("div" + i).style) {
                        left = top = 200 - r[i];
                        width = height = 2 * r[i];
                    }
                }
            </script><img id="div0" style="border: 0px; position: absolute; left: 100px; top: 100px; width: 200px; height: 200px;" src="0_5.png">
<img id="div1" style="border: 0px; position: absolute; left: 199px; top: 0px; width: 200px; height: 200px;" src="http://tsigelization.narod.ru/temp/1_5.png">
<img id="div2" style="border: 0px; position: absolute; left: 1px; top: 0px; width: 200px; height: 200px;" src="http://tsigelization.narod.ru/temp/2_5.png">
<img id="div3" style="border: 0px; position: absolute; left: 197px; top: 199px; width: 200px; height: 200px;" src="http://tsigelization.narod.ru/temp/3_5.png">
<img id="div4" style="border: 0px; position: absolute; left: -1px; top: 200px; width: 200px; height: 200px;" src="http://tsigelization.narod.ru/temp/4_5.png">
 
        </div> 
        <input type="button" onclick="reset()" value="Reset" style="position: absolute; left: 10; top: 410"> 
     
</body>


Оформляйте свои задачи так. Никому не охота лазить в ваши архивы. Расставить картинки чтобы получился круг можно с помощью css. Дальше все зависит от того на сколько точно вам нужно выполнить наведение. Если вас устраивает погрешность при наведении (я имею в виду ту область тега img где нет картинки, а просто фон), то можно сделать 4 функции с hover. Или 2 функции.

tsigel 24.04.2013 09:53

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"></script>

<body>
<div style="border: 1px solid gray; position: absolute; left: 0; top: 0; width: 402; height: 402;">
    <script>          
        $(function () {
            $('#div1').hover(function () {
                $(this).stop().animate({
                    'width': '180px',
                    'height': '180px',
                    'top': '20px'
                }, 300)
            }, function () {
                $(this).stop().animate({
                    'width': '200px',
                    'height': '200px',
                    'top': '0px'
                }, 300)
            });
            $('#div2').hover(function () {
                $(this).stop().animate({
                    'width': '180px',
                    'height': '180px',
                    'left': '20px',
                    'top': '20px'
                }, 300)
            }, function () {
                $(this).stop().animate({
                    'width': '200px',
                    'height': '200px',
                    'left': '0px',
                    'top': '0px'
                }, 300)
            });             
            $('#div3, #div4').hover(function () {
                $(this).stop().animate({
                    'width': '180px',
                    'height': '180px'
                }, 300)
            }, function () {
                $(this).stop().animate({
                    'width': '200px',
                    'height': '200px'
                }, 300)
            });
        });
    </script>
    <img id="div1" style="border: 0px; position: absolute; left: 199px; top: 0px; width: 200px; height: 200px;"
         src="http://tsigelization.narod.ru/temp/1_5.png">
    <img id="div2" style="border: 0px; position: absolute; left: 1px; top: 0px; width: 200px; height: 200px;"
         src="http://tsigelization.narod.ru/temp/2_5.png">
    <img id="div3" style="border: 0px; position: absolute; left: 197px; top: 199px; width: 200px; height: 200px;"
         src="http://tsigelization.narod.ru/temp/3_5.png">
    <img id="div4" style="border: 0px; position: absolute; left: -1px; top: 200px; width: 200px; height: 200px;"
         src="http://tsigelization.narod.ru/temp/4_5.png">

</div>
<input type="button" onclick="reset()" value="Reset" style="position: absolute; left: 10; top: 410">
</body>

C нижними сами доделаете.


Часовой пояс GMT +3, время: 22:33.