Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Центрирования divа в контейнере при использовании в css transform scale (https://javascript.ru/forum/events/49062-centrirovaniya-diva-v-kontejjnere-pri-ispolzovanii-v-css-transform-scale.html)

morg4n 28.07.2014 06:15

Центрирования 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

рони 28.07.2014 11:01

morg4n,
у вас вопрос или презентация? и почему бы недоделать для ie

morg4n 28.07.2014 23:25

У меня был вопрос, но перед отправкой решил слегка упростить код и решение нашлось само собой. Я пытался найти информацию по этому вопросу в сети - у меня не вышло, поэтому решил поделиться, может кому пригодится.
В принципе вопрос совместимости с последними IE не так уж и плох, когда я допилю, выложу обновленный код. Но на текущем этапе разработки поддержка IE не является главной целью.

рони 28.07.2014 23:53

morg4n,
:write: :) для ie и нетолько ... http://learn.javascript.ru/play/vEZYec

morg4n 29.07.2014 00:14

Эта часть, я так понимаю:
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;
    			}
		}
		}

рони 29.07.2014 00:28

morg4n,
а консоль в ie что шепчет?

morg4n 29.07.2014 00:32

ie11. win81.
Ничего в консоли нет. было б че в консоли :)

morg4n 29.07.2014 06:11

Вложений: 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.