как сделать 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. что делаю нет так? |
cyber,
При зуме нужно фиксировать текущую координату мыши от лево - и верха Окна Самой внешней обертки overlow Поэтому расчитываете координаты и относительно wrapper и обертки overlow, - и wrapper cдвигаете - top и -left на величину разницу - между старыми координатами мыши от угла overlow и приращением ширины и высоты (*или уменьшением - тогда получецо авто плюс) |
раз 3 прочитал и не совсем понял
Цитата:
чет я как то запутался=( |
cyber,
Координаты мыши от лева и тоp (cоррь |
Цитата:
|
Цитата:
|
т.е top , left - Да
|
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 координаты курсора я твой алгоритм вроде частично понял (как то запутано написано:)), но не пойму что именно у меня не так |
cyber,
Сплю - завтра к после обеда наверно |
да сам засыпаю,спокойной ночи)))
|
Цитата:
|
cyber,
Мну тут прикинул - шо про координаты курсора - не АЙС - ща схему набросаю |
Нам нужно фиксировать положение центральной точки (желтое O) относительно центра Окна ( хотя в Гугле - обычно фиксируется положение Пойнтера*выделенной метки, если он есть в текущем окне)
![]() Занчит вычисляешь отступы текущего центра и при зумме увеличиваешь на половину приращения ширины lеft(или высоты для top) Вычисляем приращение: widthOld = $("#wrapper").width() /это текущая ширина widthNew = $("#wrapper").width()*zoom /это будущая DeltaX(Приращение по Left) = (widthOld - widthNew)/2 (знак будет автоматический Итог вставляем в wrapper{"margin-left":""+DeltaX +"px" } |
хм...
спасибо за подсказку, но у тебя не правильно, потому что ты опеределяеш центр относительно 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' }) } |
cyber,
Центр должен быть относительно визуального Окна просмотра - а центр wrapper может быть вообще за кадром (при большой ширине и просмотре картинки у левого края (или, наоборот - у края правого) |
Цитата:
|
вот как работает 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,
По моему - так var left = ((getWidth + step.width) - (getWidth * zoomX))/2; var top = ((getHeight + step.height) - (getHeight * zoomY))/2; И всё таки тут не left - a margin - left - Движение от зума - лучше делать независимым (для начала |
Цитата:
если getWidth/Height это размеры после увелечения, значит getHeight - step.height это уже старый размер. Цитата:
|
cyber,
Ксать я не вижу чобы у тебя серьезно менялся Left - при кручении - колеса походу что то его перебивает |
хм...
щас по ишу. а почему гугл юзает -webkit-transform: translate(-552px, -64px) scale(1); а не top/left || margin ? |
cyber,
Потому шо удобно разделять Я ж говорил про маргин и Lеft Он наверняка left делает по сдвигу карты а по зумм - это Наверно есть еще и третий вариант сдвига |
у гугла при зуме загружается новая картинка.так что у них меняется только
-webkit-transform: translate() |
самое странное что у точки не меняются координаты при зуме
|
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 теперь сильно уежает Цитата:
|
Цитата:
если расчитуем относительно предыдущей? значит и зум нужно относительно предыдущей ширины |
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' }) } |
а что за 1200?
|
не не правильно работает, при зуме уежает в одну точку и увеличивает в том месте
|
cyber,
:write: У мну мысли ночью нулевые - ток гадалки... Понимашь - нужно сначало Алгоритмы потом - скрипты - а нас походу всё наоборот... ни наю пока что нужно сделать |
Цитата:
я только учусь:cray: а насчет того что думается тяжело ты прав, пошел я спать=) спокойно ночи:) |
был такой алгоритм:
определяю центр блока и позицию мыши во время увеличения потом (left/top + ( центр - позиция мыши))* zoom но что у меня не получилось реализовать, работало криво |
cyber,
Седни пас - завал по работе |
Цитата:
|
блин не хрена не получается=(
|
cyber,
У тьву крайние сроки есть ? (ток не говори что - вчера) |
Часовой пояс GMT +3, время: 08:33. |