Круг SVG, каков процент радиуса?

У меня есть следующий код:

.container{
    
    width: 100px;
    height: 200px;
    
    background-color: red;
    
    resize: both;     /* Just to make it... */
    overflow: hidden; /* ...resizable for testing. */
    
}
<div class = "container">
    <svg width = "100%" height = "100%">
        <circle cx = "50%" cy = "50%" r = "25%" fill = "black"></circle>
    </svg>
</div>

Изменяя размер .container, я легко вижу следующее:

  • cx — процент ширины
  • cy — процент высоты

Но я не могу понять, что такое r в процентах. Что такое r процент?

MDN: Атрибут SVG r «Когда значение установлено в процентах, оно относится к нормализованной диагонали текущего окна просмотра SVG».
Roko C. Buljan 02.09.2024 18:30

Большое спасибо. Я проверил документацию MDN на наличие круга , но не понял, что можно нажать r, чтобы прочитать об этом больше 🤦

Peppe L-G 03.09.2024 14:52
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
2
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как прокомментировал Роко К. Бульян, при использовании единиц % относительное значение относится к нормализованной длине диагонали.

См. спецификацию W3C SVG 2 (рабочий проект) "8.9. Единицы измерения"

Для любого другого значения длины, выраженного в процентах от SVG. области просмотра, процент должен рассчитываться как процент от нормализованная диагональ «viewBox», примененная к этому экрану просмотра. Если нет указывается viewBox, то нормализованная диагональ SVG необходимо использовать область просмотра. Нормализованная длина диагонали должна быть рассчитано с помощью sqrt((width)**2 + (height)**2)/sqrt(2).

вот пример

let w = 100;
let h = 200;
let c = Math.sqrt(w ** 2 + h ** 2) / Math.sqrt(2)
let rAbsolute = c * 0.25

// get absolute radius via baseVal
let r = c1.r.baseVal.value
console.info(rAbsolute, r)
.container {
  width: 100px;
  height: 200px;
  background-color: red;
}
<div class = "container">
  <svg width = "100%" height = "200px">
        <circle id = "c1" cx = "50%" cy = "50%" r = "25%" fill = "#ccc"></circle>
        <circle cx = "50%" cy = "50%" r = "39.52847075210474" fill = "none" stroke = "blue" />
    </svg>
</div>

Вы также можете проверить свои расчеты, используя свойство baseVal из интерфейса SVGAnimatedLength.

Если вам действительно нужен более предсказуемый масштаб круга, вы также можете добавить квадрат viewBox. В этом случае атрибут saveAspectRatio (в примере ниже значение по умолчанию «xMidYMid meet») будет влиять на выравнивание и масштабирование.

.container {
  width: 100px;
  height: 200px;
  background-color: red;
  resize: both;
  overflow: hidden;
}
<div class = "container">
    <svg width = "100%" height = "100%" viewBox = "0 0 100 100" preserveAspectRatio = "xMidYMid meet">
      <rect width = "100%" height = "100%" fill = "none" stroke = "#ccc"/>
        <circle cx = "50%" cy = "50%" r = "25%" fill = "black" />
    </svg>
</div>

Как вы можете видеть, радиус круга остается на уровне 25% относительно размера 100x100 viewBox (то есть круг остается шириной 50%).

Большое спасибо! Сначала я проверил спецификацию <круг>, и там ничего не упоминалось о том, как следует рассчитывать процентный радиус. По моему мнению, немного плохо, что нужно прочитать совершенно другую часть спецификации, чтобы получить эту информацию без какой-либо ссылки на нее. Но нет проблем, ведь мне помогут вы, замечательные ребята :D

Peppe L-G 03.09.2024 14:57

Я пишу на случай, если другие ищут то же, что и я.

Мне нужно было, чтобы радиус был выражен в процентах от наименьшей ширины и высоты элемента SVG. Я не знаю, насколько хорошо это поддерживают браузеры, но использование новой функциональности контейнера в CSS с модулем cqmin мне помогло (протестировано в Firefox и Chrome).

.container{
    
    width: 100px;
    height: 200px;
    
    background-color: red;
    
    resize: both;     /* Just to make it... */
    overflow: hidden; /* ...resizable for testing. */
    
    container-type: size; /* Add this one. */
    
}
<div class = "container">
    <svg width = "100%" height = "100%">
        <circle cx = "50%" cy = "50%" r = "25cqmin" fill = "black"></circle>
    </svg>
</div>

Другие вопросы по теме