Хотите ли вы, чтобы изображение всегда расширялось, чтобы заполнить серое поле? https://jsfiddle.net/alexander_L/u607w315/12/ (версия 12 для увеличения изображения)
Кроме того, вы добавляете теги <def/>
каждый раз, когда происходит событие fires:
Это быстро выходит из-под контроля.
Вы должны либо присоединить <def/>
к некоторому фиктивному массиву из одного элемента данных и используйте шаблон обновления d3. js или проще, вы можете просто создать тег <def/>
в своем исходном коде и каждый раз обновлять атрибут этого же тега.
Вы можете сделать это один раз на начало:
var def = svg.append('defs')
.append('clipPath')
.attr('id', 'clip2')
.append('rect')
.attr('x', 0)
.attr('y', 0)
.attr('width', 200)
.attr('height', 200);
А затем используйте эту переменную и обновляйте во время вашего события:
def.attr('x', 0)
.attr('y', 0)
.attr('width', event.rect.width)
.attr('height', event.rect.height);
Тогда вы избежите этой проблемы.
https://jsfiddle.net/alexander_L/u607w315/11/ (версия 11 для обрезки изображения)
Хотите ли вы это поведение:
Изображение обрезается, когда серый прямоугольник меньше в одном измерении, чем изображение?
ОБНОВЛЕНИЕ
Поскольку OP обнаружил ошибку в исходном коде, из-за которой серое поле всегда отображалось Вернувшись хотя бы к высоте или ширине изображения, я также попытался решить эту проблему.
Тем не менее, я также заметил странное поведение: верхний левый угол рамки не может быть расширен дальше или левее, поэтому я исправил это сначала: https://jsfiddle.net/alexander_L/u607w315/25/
Смотрите .gif нового поведения и старой ошибки, упомянутой ОП: