Центрирования divа в контейнере при использовании в css transform scale
Всем привет.
Дано: div#view контейнер (на нем весят все события), в котором находится еще один div#map с огромной матрицей divиков.cells внутри. Задача: сделать #map перетаскиваемым и зумящимся с колесика мышки. Проблема: я очень долго тупил над вопросом, что делать после применения к #map css trasform scale. Куда, насколько и что конкретно двигать. Решение: Главная проблема была тут: checkborders: function(){ this.border.left = 200 - (( window.innerWidth - (window.innerWidth * this.zoomdelta) ) / 2) / this.zoomdelta; this.border.top = 200 - (( window.innerHeight - (window.innerHeight * this.zoomdelta) ) / 2) / this.zoomdelta; this.border.right = -200-30*114+window.innerWidth + (( window.innerWidth - (window.innerWidth * this.zoomdelta) ) / 2) / this.zoomdelta; this.border.bottom= -200-20*66+window.innerHeight + (( window.innerHeight - (window.innerHeight * this.zoomdelta) ) / 2) / this.zoomdelta; } 200 - реальный желаемый отступ по краям. 30*114 дивы в одной строчке на их ширину 20*66 строчки на высоту дивов Рабочий пример для Firefox, Opera, Chrome: _http://mogame.org/test2.php js, css, scale, transform, zoom, zooming, scaling, position div, mapping |
morg4n,
у вас вопрос или презентация? и почему бы недоделать для ie |
У меня был вопрос, но перед отправкой решил слегка упростить код и решение нашлось само собой. Я пытался найти информацию по этому вопросу в сети - у меня не вышло, поэтому решил поделиться, может кому пригодится.
В принципе вопрос совместимости с последними IE не так уж и плох, когда я допилю, выложу обновленный код. Но на текущем этапе разработки поддержка IE не является главной целью. |
morg4n,
:write: :) для ie и нетолько ... http://learn.javascript.ru/play/vEZYec |
Эта часть, я так понимаю:
view.element.style.transform = "scale("+this.zoomdelta+","+this.zoomdelta+")"; view.element.style.webkitTransform = "scale("+this.zoomdelta+","+this.zoomdelta+")"; view.element.style.msTransform = "scale("+this.zoomdelta+","+this.zoomdelta+")"; view.element.style.mozTransform = "scale("+this.zoomdelta+","+this.zoomdelta+")"; view.element.style.oTransform = "scale("+this.zoomdelta+","+this.zoomdelta+")"; У меня на деле отрисовка карты, тоже идет через js. IE ее вообще не рисует. element: document.createElement("div"), ..... build: function(){ //map cells json с координатами, айди, и прочей лабудой (далее нужны координаты) a = map.cells; for(key in a){ if (a.hasOwnProperty(key) && /^0$|^[1-9]\d*$/.test(key) && key <= 4294967294){ var row; if(a[key][3] == 1){ row = document.createElement("div"); row.className = "row"; map.element.appendChild(row); } element = document.createElement("div"); //watter grass mountain из массива с вариантами текстур element.className = map.terrain[a[key][8]][2]; element.className += " cell"; element.setAttribute("data-row",a[key][2]); element.setAttribute("data-col",a[key][3]); row.appendChild(element); map.cells[key].element = element; } } } |
morg4n,
а консоль в ie что шепчет? |
ie11. win81.
Ничего в консоли нет. было б че в консоли :) |
Вложений: 1
Я что-то очень сильно туплю с зум эффектом. Сейчас при наведение на ячейку прямоугольную 128*64 пикселя (но так как они у меня накладываются друг на друга, рабочая область 128х32 обведена черной линией), я проверяю попадаю ли я в изометрическую часть ячейки, или на ее соседей (если левее или правее белых линий).
Вся магия в функции getBoundingClientRect(). Я, чесслово, не понимаю, по видимому, как работает гугл. Потому, что 'js element screen position' далеко не сразу привел меня к этой чудесной функции. Они мне все твердили про: scrollLeft, clientLeft, offsetLeft! Идиоты. cellmouseover: function(e){ if(!e) e = event || window.event; var cell = e.target; //чудо функция! положение ячейки, "начало координат" var pos = cell.getBoundingClientRect(); var cellx=parseInt(cell.getAttribute("data-x")), celly=parseInt(cell.getAttribute("data-y")); this.currentdiv = cell.id; zd = view.zoomdelta; posx = pos.left + e.pageX; posy = pos.top + e.pageY; posx = posleft + e.pageX; posy = postop + e.pageY; //левее первой белой линии if(posy < (64*zd - posx) / 2){ celly--; } //правее второй белой линии else if(posy < (1/2)*(posx - 64*zd)){ cellx++; } //предыдущая и текущая ячейки beforecell = this.currentcell; this.currentcell = cellx+"-"+celly; //снять выделение с прошлой и одеть на новую ячейки if(beforecell != this.currentcell && beforecell != 0) $(beforecell).classList.remove('selected'); $(this.currentcell).classList.add('selected'); } |
Часовой пояс GMT +3, время: 12:08. |