Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   как сделать img zoom (https://javascript.ru/forum/events/30784-kak-sdelat-img-zoom.html)

cyber 15.08.2012 19:35

как сделать img zoom
 
делаю зум как тут http://rvolve.com/zoom_pic.php, только там на канве, а у меня нет.Так вот делаю так:
function fixedZoom (x,y) {

var top = getHeight / height;//zoom
var left = getWidth / width; 	//zoom

var centerX = elem.width()/2;//центр по Х
var centerY = elem.height()/2;//центр по Y

x = x - coord_elem.left;//координаты мыши относительно блока по X
y = y - coord_elem.top;//координаты мыши относительно блока по Y

x = centerX - x;
y = centerY - y;
console.log(x*left)	 
	 
	 wrapper.css({
		 top: style().top + y*top + 'px',
		 left: style().left + x*left+'px'
		 		
		 })
	
	}


только увелечение не по клику а колесиком
но что как то не так работает http://cyberua.16mb.com/files/zoom.html.
что делаю нет так?

Deff 15.08.2012 19:53

cyber,
При зуме нужно фиксировать текущую координату мыши от лево - и верха Окна Самой внешней обертки overlow
Поэтому расчитываете координаты и относительно wrapper и обертки overlow, - и wrapper cдвигаете - top и -left на величину разницу - между старыми координатами мыши от угла overlow и приращением ширины и высоты (*или уменьшением - тогда получецо авто плюс)

cyber 15.08.2012 20:23

раз 3 прочитал и не совсем понял
Цитата:

координату мыши от лево - право
т.е отступ с лева - отступ с права?

чет я как то запутался=(

Deff 15.08.2012 21:08

cyber,
Координаты мыши от лева и тоp (cоррь

cyber 15.08.2012 22:17

Цитата:

Сообщение от Deff (Сообщение 197824)
cyber,
При зуме нужно фиксировать текущую координату мыши от лево - и верха Окна Самой внешней обертки overlow
Поэтому расчитываете координаты и относительно wrapper и обертки overlow, - и wrapper cдвигаете - top и -left на величину разницу - между старыми координатами мыши от угла overlow и приращением ширины и высоты (*или уменьшением - тогда получецо авто плюс)

блин, я наверно запутался но я вроде так и делаю=(

cyber 15.08.2012 22:36

Цитата:

Сообщение от Deff (Сообщение 197824)
cyber,
а
Поэтому расчитываете координаты и относительно wrapper

т.е top , left?

Deff 15.08.2012 22:39

т.е top , left - Да

cyber 15.08.2012 23:49

function fixedZoom (x,y) {

var top = getHeight / height;//zoom
var left = getWidth / width; 	//zoom

var centerX = elem.width()/2;//центр по Х
var centerY = elem.height()/2;//центр по Y

x = x - coord_elem.left;//координаты мыши относительно блока по X
y = y - coord_elem.top;//координаты мыши относительно блока по Y

x = centerX - x;
y = centerY - y;
console.log(x*left)	 
	 
	 wrapper.css({
		 top: style().top + y*top + 'px',
		 left: style().left + x*left+'px'
		 		
		 })
	
	}

style().left/top
это значение left/top для wrapper
y/x координаты курсора
я твой алгоритм вроде частично понял (как то запутано написано:)), но не пойму что именно у меня не так

Deff 16.08.2012 00:24

cyber,
Сплю - завтра к после обеда наверно

cyber 16.08.2012 00:38

да сам засыпаю,спокойной ночи)))

cyber 16.08.2012 15:14

Цитата:

Сообщение от Deff (Сообщение 197824)
cyber,
между старыми координатами мыши от угла overlow и приращением ширины и высоты (*или уменьшением - тогда получецо авто плюс)

а что имеется в виду под старым координатами?

Deff 16.08.2012 15:16

cyber,
Мну тут прикинул - шо про координаты курсора - не АЙС - ща схему набросаю

Deff 16.08.2012 15:31

Нам нужно фиксировать положение центральной точки (желтое O) относительно центра Окна ( хотя в Гугле - обычно фиксируется положение Пойнтера*выделенной метки, если он есть в текущем окне)



Занчит вычисляешь отступы текущего центра и при зумме увеличиваешь на половину приращения ширины lеft(или высоты для top)

Вычисляем приращение:

widthOld = $("#wrapper").width() /это текущая ширина
widthNew = $("#wrapper").width()*zoom /это будущая

DeltaX
(Приращение по Left) = (widthOld - widthNew)/2 (знак будет автоматический

Итог вставляем в wrapper{"margin-left":""+DeltaX +"px" }

cyber 16.08.2012 17:36

хм...
спасибо за подсказку, но у тебя не правильно, потому что ты опеределяеш центр относительно wrapper а в моем случае мне нужно центр относительно внешнего блока overflow.
пытался сделать так но что то все едит в верх
function fixedZoom () {

var zoomY = getHeight / (getHeight - step.height);
var zoomX = getWidth / (getWidth - step.width); 	

	var left = style().left*zoomX;
	var top = style().top*zoomY;
	
	 wrapper.css({
		 top: -top  + 'px',
		 left: -left+'px'
		 		
		 })
	
	}

Deff 16.08.2012 18:20

cyber,
Центр должен быть относительно визуального Окна просмотра - а центр wrapper может быть вообще за кадром (при большой ширине и просмотре картинки у левого края (или, наоборот - у края правого)

cyber 16.08.2012 18:26

Цитата:

Сообщение от Deff (Сообщение 198049)
cyber,
Центр должен быть относительно визуального Окна просмотра - а центр wrapper может быть вообще за кадром (при большой ширине и просмотре картинки у левого края (или, наоборот - у края правого)

да, но у тебя получается что расчищается центр wrapper

cyber 16.08.2012 18:33

вот как работает http://cyberua.16mb.com/files/zoom.html
вот функция
function fixedZoom () {

var zoomY = getHeight /(getHeight - step.height);
var zoomX = getWidth / (getWidth - step.width); 	

	var left = ((getWidth - step.width) - (getWidth * zoomX))/2;
	var top = ((getHeight - step.height) - (getHeight * zoomY))/2;
	
	 wrapper.css({
		 top: top  + 'px',
		 left: left+'px'
		 		
		 })
	
	}

cyber 16.08.2012 19:32

может я зум не правильно рассчитываю?!

Deff 16.08.2012 19:39

cyber,
По моему - так
var left = ((getWidth + step.width) - (getWidth * zoomX))/2;
var top = ((getHeight + step.height) - (getHeight * zoomY))/2;

И всё таки тут не left - a margin - left - Движение от зума - лучше делать независимым (для начала

cyber 16.08.2012 19:50

Цитата:

Сообщение от Deff (Сообщение 198074)
cyber,
По моему - так
var left = ((getWidth + step.width) - (getWidth * zoomX))/2;
var top = ((getHeight + step.height) - (getHeight * zoomY))/2;

почему так?
если getWidth/Height это размеры после увелечения, значит getHeight - step.height это уже старый размер.
Цитата:

Сообщение от Deff (Сообщение 198074)
И всё таки тут не left - a margin - left - Движение от зума - лучше делать независимым (для начала

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

Deff 16.08.2012 20:00

cyber,
Ксать я не вижу чобы у тебя серьезно менялся Left - при кручении - колеса походу что то его перебивает

cyber 16.08.2012 20:17

хм...
щас по ишу.
а почему гугл юзает

-webkit-transform: translate(-552px, -64px) scale(1);

а не top/left || margin ?

Deff 16.08.2012 20:20

cyber,
Потому шо удобно разделять

Я ж говорил про маргин и Lеft

Он наверняка left делает по сдвигу карты а по зумм - это
Наверно есть еще и третий вариант сдвига

cyber 16.08.2012 20:33

у гугла при зуме загружается новая картинка.так что у них меняется только
-webkit-transform: translate()

cyber 16.08.2012 20:34

самое странное что у точки не меняются координаты при зуме

Deff 16.08.2012 20:53

cyber,
Еще раз
1. зум - отношение текущей ширины - к изначальной (константе)
2. Выведи алертом (getWidth * zoomX))/2;
Delta X = ($("#wrapper").width() - $("#wrapper").width()*zoom)/2

Эту Дельту(c её знаком) нун добавлять к текущему значению Left

vadim5june 16.08.2012 21:07

Цитата:

Сообщение от cyber (Сообщение 198094)
у гугла при зуме загружается новая картинка.так что у них меняется только
-webkit-transform: translate()

значит у них на сервере все делается

cyber 16.08.2012 23:55

Цитата:

Сообщение от vadim5june (Сообщение 198101)
значит у них на сервере все делается

что делается на сервере, хоть поняли что сказали?

cyber 17.08.2012 00:54

Цитата:

Сообщение от Deff (Сообщение 198099)
cyber,
Еще раз
1. зум - отношение текущей ширины - к изначальной (константе)
2. Выведи алертом (getWidth * zoomX))/2;
Delta X = ($("#wrapper").width() - $("#wrapper").width()*zoom)/2

Эту Дельту(c её знаком) нун добавлять к текущему значению Left

зделал так
function fixedZoom () {

var zoomY = getHeight / height;
var zoomX = getWidth / width; 	

var left = ((getWidth - step.width) - (getWidth * zoomX))/2;
var top = ((getHeight - step.height) - (getHeight * zoomY))/2;
	
	 wrapper.css({
		 top: style().top + top  + 'px',
		 left: style().left+ left+'px'
		 		
		 })
	
	}

вот результат
http://cyberua.16mb.com/files/zoom.html
теперь сильно уежает

Цитата:

2. Выведи алертом (getWidth * zoomX))/2;
вывел в консоль

cyber 17.08.2012 01:19

Цитата:

1. зум - отношение текущей ширины - к изначальной (константе)
а почему к изначальной?
если расчитуем относительно предыдущей?
значит и зум нужно относительно предыдущей ширины

Deff 17.08.2012 01:22

cyber,
Вроде так - но при большом масштабе - зашкаливает
function fixedZoom () {

var zoomY = getHeight / height;
var zoomX = getWidth / width; 	

	var left =1200*(1 - zoomX)/2;
var top = 1200*(1 - zoomX)/2;

//console.loggetWidth *(1- zoomX)/2)	
	 
	 wrapper.css({
		 top: style().top = top  + 'px',
		 left: style().left= left+'px'
		 		
		 })
	
	}

cyber 17.08.2012 01:30

а что за 1200?

cyber 17.08.2012 01:33

не не правильно работает, при зуме уежает в одну точку и увеличивает в том месте

Deff 17.08.2012 01:46

cyber,
:write: У мну мысли ночью нулевые - ток гадалки...
Понимашь - нужно сначало Алгоритмы потом - скрипты - а нас походу всё наоборот... ни наю пока что нужно сделать

cyber 17.08.2012 01:53

Цитата:

Сообщение от Deff (Сообщение 198192)
cyber,
:write: У мну мысли ночью нулевые - ток гадалки...
Понимашь - нужно сначало Алгоритмы потом - скрипты - а нас походу всё наоборот... ни наю пока что нужно сделать

да все мои алгоритм пошли коту под хвост, что я только не пробывал..
я только учусь:cray:
а насчет того что думается тяжело ты прав, пошел я спать=)
спокойно ночи:)

cyber 17.08.2012 15:07

был такой алгоритм:
определяю центр блока и позицию мыши во время увеличения
потом
(left/top + ( центр - позиция мыши))* zoom
но что у меня не получилось реализовать, работало криво

Deff 17.08.2012 16:40

cyber,
Седни пас - завал по работе

cyber 17.08.2012 20:36

Цитата:

Сообщение от Deff (Сообщение 198286)
cyber,
Седни пас - завал по работе

да сам за день на мотался, желания 0 уже=)

cyber 19.08.2012 15:21

блин не хрена не получается=(

Deff 19.08.2012 15:23

cyber,
У тьву крайние сроки есть ? (ток не говори что - вчера)


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