Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.03.2014, 17:51
Интересующийся
Отправить личное сообщение для SeMiTr Посмотреть профиль Найти все сообщения от SeMiTr
 
Регистрация: 28.11.2013
Сообщений: 12

Проблема с захватом мышью
Стал решать задачу с этого сайта, где картинку нужно таскать за правый нижний угол, изменяя её размер. Для этого в углу создаётся элемент для захвата. Но при выходе за его пределы mousedown не срабатывает, а срабатывает лишь при повторном нажатии. Изучение решения на сайте не помогло, т. к. оно существенно отличается от моего. Помогите, пожалуйста. Текст ниже. Картинки присоединяю.

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>

<div style="width:503px;height:285px;background-color:grey;position:relative" id="skin">
	<img style="width:500px;height:282px;position:absolute" id="heroes" src="heroes.jpg">
    <img style="position:absolute;right:0;bottom:0" id="corner" src="handle-se.png">
</div>
<div id="info"></div>

<script>
function Resizeable(options) {
  var elem = options.elem;
  elem.move=false;
  
  elem.on('mousedown', capture);
  elem.on('mousemove', cursorMove);
  elem.on('mouseup', release);
  
  function capture(e){
	if($(e.target).attr('id')=='corner' && elem.move==false){
		elem.move=true;
		getCoords(e);
		console.log(elem.x+' '+elem.y);
	}
  }
  function cursorMove(e){
    if(elem.move==true){
	  size($('#skin'), e);
	  size($('#heroes'), e);
	}
	getCoords(e);
  }
  function release(e){
	elem.move=false;
  }
  function size(rect, e){
	rect.css('height',rect.height()-(elem.y-e.pageY))
		.css('width',rect.width()-(elem.x-e.pageX));
  }
  function getCoords(e){
	elem.x=e.pageX;
	elem.y=e.pageY;
  }
}

</script>

</body>
</html>
Изображения:
Тип файла: jpg heroes.jpg (133.9 Кб, 2 просмотров)
Тип файла: png handle-se.png (3.5 Кб, 18 просмотров)
Ответить с цитированием
  #2 (permalink)  
Старый 07.03.2014, 19:00
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Моя попытка:

<!DOCTYPE html>
<style>
	.resizeable{
		padding: 10px;
		position: relative;
		-moz-box-sizing: border-box;
		box-sizing: border-box;
	}
	.resizeable .resizer{
		position: absolute;
		bottom: 0;
		right: 0;
		width: 16px;
		height: 16px;
		background: url(http://javascript.ru/forum/attachments/jquery/2137d1394200133-problema-s-zakhvatom-myshyu-handle-se-png);
		cursor: se-resize;
	}
	.resizeable img{
		width: 100%;
		height: 100%;
	}
</style>
<div class="resizeable" style="width: 750px; height: 258px">
	<img src="http://upload.wikimedia.org/wikipedia/commons/a/aa/Logo_Google_2013_Official.svg" alt="" />
</div>
<script>
	function Resizeable(element) {
		this.element = element;
		this.resizer = document.createElement('div');
		this.resizer.className = 'resizer';
		this.element.appendChild(this.resizer);
		this.resizer.addEventListener('mousedown', this);
		this.startMousePosition = null;
		this.startElementDimension = null;
	}

	Resizeable.prototype.handleEvent = function(event) {
		this['handle' + event.type.charAt(0).toUpperCase() + event.type.slice(1) + 'Event'](event);
	};

	Resizeable.prototype.handleMousedownEvent = function(event) {
		if (this.element.setCapture)
			this.element.setCapture();
		window.addEventListener('mousemove', this);
		window.addEventListener('mouseup', this);
		this.startMousePosition = {x: event.pageX, y: event.pageY};
		this.startElementDimension = {width: this.element.offsetWidth, height: this.element.offsetHeight};
		event.preventDefault();
	};

	Resizeable.prototype.handleMousemoveEvent = function(event) {
		var offset = {
			x: event.pageX - this.startMousePosition.x,
			y: event.pageY - this.startMousePosition.y,
		};
		console.log(event);
		this.element.style.width = this.startElementDimension.width + offset.x + 'px';
		this.element.style.height = this.startElementDimension.height + offset.y + 'px';
	};

	Resizeable.prototype.handleMouseupEvent = function(event) {
		window.removeEventListener('mousemove', this);
		window.removeEventListener('mouseup', this);
		if (this.element.releaseCapture)
			this.element.releaseCapture();
		this.startMousePosition = null;
	};

	new Resizeable(document.querySelector('.resizeable'));
</script>


Для работы в IE8 нужен костыль для addEventListener
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #3 (permalink)  
Старый 08.03.2014, 12:31
Интересующийся
Отправить личное сообщение для SeMiTr Посмотреть профиль Найти все сообщения от SeMiTr
 
Регистрация: 28.11.2013
Сообщений: 12

Рабочий вариант есть и на сайте. Хотелось бы понять, почему мой вариант не работает в Mozilla. У меня пока небольшой опыт работы с jQuery

Последний раз редактировалось SeMiTr, 08.03.2014 в 12:34.
Ответить с цитированием
  #4 (permalink)  
Старый 08.03.2014, 14:10
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от SeMiTr
У меня пока небольшой опыт работы с jQuery
Мой код вообще работает без jQuery
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #5 (permalink)  
Старый 08.03.2014, 15:35
Аватар для Zuenf
Кандидат Javascript-наук
Отправить личное сообщение для Zuenf Посмотреть профиль Найти все сообщения от Zuenf
 
Регистрация: 27.01.2012
Сообщений: 134

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>

<div style="width:503px;height:285px;background-color:grey;position:relative" id="skin">
	<img style="width:500px;height:282px;position:absolute" id="heroes" src="http://javascript.ru/forum/attachments/jquery/2136d1394200133t-problema-s-zakhvatom-myshyu-heroes-jpg">
    <img style="position:absolute;right:0;bottom:0" id="corner" src="http://javascript.ru/forum/attachments/jquery/2137d1394200133-problema-s-zakhvatom-myshyu-handle-se-png">
</div>
<div id="info"></div>

<script>
function Resizeable(options) {
  var elem = options.elem;
  elem.move=false;
  
  elem.on('mousedown', capture);
*!*
//mousemove и mouseup нужно отслеживать на документе а не конкретно на этом элементе.
  $(document).on('mousemove', cursorMove);
  $(document).on('mouseup', release);
*/!*

  function capture(e){
	if($(e.target).attr('id')=='corner' && elem.move==false){
		elem.move=true;
		getCoords(e);
		console.log(elem.x+' '+elem.y);
        return false;
	}
  }
  function cursorMove(e){
    if(elem.move==true){
	  size($('#skin'), e);
	  size($('#heroes'), e);
	}
	getCoords(e);
  }
  function release(e){
	elem.move=false;
  }
  function size(rect, e){
	rect.css('height',rect.height()-(elem.y-e.pageY))
		.css('width',rect.width()-(elem.x-e.pageX));
  }
  function getCoords(e){
	elem.x=e.pageX;

	elem.y=e.pageY;
}
}
*!*



//тут строчку нужно было дописать
*/!*
Resizeable({'elem': $('#corner')});

</script>

</body>
</html>

Последний раз редактировалось Zuenf, 08.03.2014 в 18:14.
Ответить с цитированием
  #6 (permalink)  
Старый 08.03.2014, 15:39
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

Zuenf,
неплохобы return false поставить в строку 38 а то браузер картинку копирует
Ответить с цитированием
  #7 (permalink)  
Старый 08.03.2014, 15:41
Аватар для Zuenf
Кандидат Javascript-наук
Отправить личное сообщение для Zuenf Посмотреть профиль Найти все сообщения от Zuenf
 
Регистрация: 27.01.2012
Сообщений: 134

рони, поправил.
Ответить с цитированием
  #8 (permalink)  
Старый 08.03.2014, 15:59
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108


ещё можно убрать строку 35 и стиль из строки 10 и заменить на
<style type="text/css">
  #skin #heroes{
      width: 100%;
		height: 100%;
  }
  </style>
Ответить с цитированием
  #9 (permalink)  
Старый 08.03.2014, 16:24
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Если уж так хочется jQuery, то есть готовое: http://jqueryui.com/resizable/
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #10 (permalink)  
Старый 08.03.2014, 17:31
Интересующийся
Отправить личное сообщение для SeMiTr Посмотреть профиль Найти все сообщения от SeMiTr
 
Регистрация: 28.11.2013
Сообщений: 12

Zuenf, вот как раз такой вариант у меня в Mozille и не работает. Я зацепляю мышью за угол, сдвигаю, отпускаю мышь, после этого размер резко меняется, и дальше меняется плавно, хотя мышь не зажата; а хотелось бы без этого бага. А насчёт строчки
Resizeable({'elem': $('#corner')});
- по ошибке удалил при отправке сообщения. У меня была
Resizeable({'elem': $('html')});
danik.js, спасибо, но хочется для начала освоить базовый js без надстроек.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с радио кнопками px379 Общие вопросы Javascript 8 29.07.2013 09:30
Регулярные выражения - получение только группы с захватом RUVATA Общие вопросы Javascript 5 12.06.2012 15:44
Проблема с Popup окном vovuslik jQuery 5 12.06.2010 16:12
Проблема с дизайном после отправки xmlhttprequest, Проблема с дизайном после отправки cyberx AJAX и COMET 3 01.05.2010 17:07
Проблема, в менюшке Большой джо Элементы интерфейса 0 12.07.2009 17:12