Рисование строки SVG по диагонали через содержащий ее DIV (и сохранение при изменении размера DIV)

javascript #html #css #svg

#javascript #HTML #css #svg

Вопрос:

Я пытаюсь нарисовать линию SVG по диагонали через div следующим образом:

введите описание изображения здесь

Я могу создать div со строкой SVG внутри:

 <div id="my_div" class="rectangle">
    <svg id="my_line" width='100%' height='100%' viewBox='0 0 2000 2000' preserveAspectRatio='none'><line style='red; stroke-width:2' /></svg>
</div>
 

Поскольку я могу изменять размер содержащего прямоугольника div, мне нужно, чтобы строка SVG перемещалась вместе с прямоугольником div по мере его изменения, всегда касаясь верхнего левого и нижнего правого углов.

Я пытаюсь использовать getBoundingClientRect для установки позиций строк:

 var rect_box = document.getElementById("my_div").getBoundingClientRect();

$("#my_line").attr("x1", rect_box.left)
$("#my_line").attr("y1", rect_box.top)
$("#my_line").attr("x2", rect_box.right)
$("#my_line").attr("y2", rect_box.bottom)
 

Но это не работает. Есть ли способ установить окно просмотра или применить CSS таким образом, чтобы строка SVG всегда оставалась фиксированной по диагонали содержащего ее div?

Примечание: существует также такой подход, который использует CSS clip path, и он остается фиксированным к его углам во время изменения размера, но толщина линии изменяется при изменении ее размера. Мне нужно, чтобы толщина линии оставалась постоянной.

Ответ №1:

Javascript не требуется.

 #my_div {
  outline: 1px solid;
  height: 200px;
} 
 <div id="my_div">
  <svg width='100%' height='100%' viewBox='0 0 100 100' preserveAspectRatio='none'>
       <line x1="0" y1="0" x2="100" y2="100" vector-effect="non-scaling-stroke" stroke="red" />
    </svg>
</div> 

Комментарии:

1. Красиво, работает отлично. Спасибо. Я думал, что значения x2 и y2 предотвратили бы изменение длины, но они изменяются идеально.

2. Спасибо, vector-effect="non-scaling-stroke это было то, чего мне не хватало, чтобы сохранить одинаковую ширину строки независимо от размера.