Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Помогите с dasharray и dashoffset

#css #css3 #svg


Никак не могу понять как правильно выставить stroke-dasharray и stroke-dashoffset.
у меня результат на картинке сверху, снизу показано как нужно, и различия наложения(
позиция чуть не та (нужно больше против часовой, и визуально нужно чуть больше оранжевого
и меньше томатного цвета) никак не могу осознать что нужно вбить  



  

  

  

  

  



svg {
  border: 1px solid #dddddd;
}

    


Ответы

Ответ 1



Посмотрите примеры c stroke-dasharray, совсем немного строчек кода: Анимация бордюра из средней точки Весь секрет действия в этой строчке: attributeName="stroke-dasharray" from="0 152.2 0 152.2" to="0 0 304.4 0" Трафарет лоадера с бегунком Всё действие в этой строчке: Пример реализации stroke-dasharray с помощью JS Пример универсального решения, когда изменяя значения переменных в скрипте можно получить любое количество сегментов на окружности Анимация CSS начинается после наведения курсора const SVG_NS = 'http://www.w3.org/2000/svg'; let R = 40; let perimeter = 2*Math.PI*R let dash = .8*perimeter/6; let gap = .2*perimeter/6; let dasharray = document.createElementNS(SVG_NS, 'circle'); dasharray.setAttributeNS(null, "r", R); dasharray.setAttributeNS(null, "stroke-dasharray", `${dash}, ${gap}`); svg.appendChild(dasharray); circle { stroke-width:20px; stroke:purple; fill:transparent; } circle:hover { stroke:dodgerblue; -webkit-animation: rotate 6s linear infinite; animation: rotate 6s linear infinite; } @-webkit-keyframes rotate { 100% {-webkit-transform: rotate(360deg); -ms-transform: rotate(360deg); transform: rotate(360deg);} } @keyframes rotate { 100% {-webkit-transform: rotate(360deg); -ms-transform: rotate(360deg); transform: rotate(360deg);} } Это всё лирика, вернемся к практике. Вопрос автора в итоге - разбивка окружности на равные сектора и расположение одного из секторов относительно вертикальной координаты. На видимый конечный результат влияют четыре фактора: Радиус окружности stroke-dashoffset - сдвиг начала линии. Чтобы исключить его влияние установим stroke-dashoffset="0" Положение начальной точки, именно от неё будет рисоваться первый сектор прерывистой линии. Для окружности это положительная ось "Х". Чтобы отсчет вести от вертикальной линии, повернем окружность против часовой стрелки на 90 градусов. transform=" rotate(-90 175 175)" stroke-dasharray Как всё же просчитать параметры Stroke-dasharray? stroke-dasharray="30 35" "30" - длина черточки, "35" длина пробела. При равенстве значений можно писать только одну цифру. stroke-dasharray="30 35 30 5" Две пары значений, как в примере с бордюром см. выше В этом случае - Длина черты - длина пробела - длина черты - длина пробела Подробнее здесь, здесь и здесь Два сектора Допустим нам надо разбить круг на два равных сектора. Первый сектор займет черта, второй сектор - пробел. Длина всей окружности при радиусе = 50px составит с=2 х 3.14 х 50 = 314 px. Длина сектора = 157px или 180° stroke-dasharray="157 157" Развертка окружности в линию Ручка к мишени Блок цветных кругов Начальная метка stroke-dashoffset Поясняющий текст Circle / "2" Line stroke-dasharray="157 157" circle - "darkorange" stroke-dasharray="157 157" stroke-dashoffset="0" Линии (grey) проходящие через центр полотна SVG Линия длиной 314px над кругом,- это развертка круга с длиной окружности -314px Цветные точки - начальные точки рисования. На окружности от начальной точки по часовой стрелке отрисован первый сектор - (черта stroke-dasharray) - оранжевого цвета и второй сектор томатного цвета это,- пробел stroke-dasharray Вверху по линии от начальной точки, первый оранжевый сектор - черта, томатный отрезок - пробел. Три сектора Длина сектора = 314 / 3 = 104,7 или 120° stroke-dasharray="104.7 104.7" Развертка окружности в линию Ручка к мишени Блок цветных кругов Начальная метка stroke-dashoffset Поясняющий текст Circle / "3" Line stroke-dasharray="104.7 104.7" circle - "darkorange" stroke-dasharray="104.7 104.7" stroke-dashoffset="0" Линии (grey) проходящие через центр полотна SVG Я не случайно добавил в примерах линию длиной равную длине окружности. Без неё уже был бы непонятен результат. Ожидали увидеть три сектора окружности одной длины, а получили два сектора, разной длины. Сейчас понятно, что два соседних сектора окружности сомкнулись. Четыре сектора Длина сектора = 314 / 4 = 78,5 или 90° stroke-dasharray="78.5 78.5" Развертка окружности в линию Ручка к мишени Блок цветных кругов Начальная метка stroke-dashoffset Поясняющий текст Circle / "4" Line stroke-dasharray="78.5 78.5" circle - "darkorange" stroke-dasharray="78.5 78.5" stroke-dashoffset="0" Линии (grey) проходящие через центр полотна SVG Здесь всё просто,- каждый сектор занял свою четверть окружности (90°) Две черты и два пробела stroke-dasharray Шесть секторов Длина сектора = 314 / 6 = 52,3 или 60° stroke-dasharray="52.3 52.3" Развертка окружности в линию Ручка к мишени Блок цветных кругов Начальная метка stroke-dashoffset Поясняющий текст Circle / "6" Line stroke-dasharray="52.3 52.3" circle - "darkorange" stroke-dasharray="52.3 52.3" stroke-dashoffset="0" Линии (grаy) проходящие через центр полотна SVG Начал проясняться алгоритм для секторов с равными промежутками,- Удваиваем количество закрашенных секторов, находим длину одного сектора и подставляем в stroke-dasharray Проверяем на примере автора вопроса. Надо 5 закрашенных секторов итого вместе с равными промежутками нужно делить длину окружности на 10 частей. 10 секторов Длина дуги сектора = 314 / 10 = 31,4 или 36° stroke-dasharray="31.4 31.4" Линии повторяющая расцветку двух кругов Ручка к мишени Блок цветных кругов Начальная метка stroke-dashoffset Поясняющий текст Circle / "10" Line stroke-dasharray="31.4 31.4" circle - "darkorange" stroke-dasharray="31.4 31.4" stroke-dashoffset="0" Линии (grey) проходящие через центр полотна SVG Нам нужно повернуть против часовой стрелки верхний оранжевый сектор, чтобы вертикальная линия делила его по середине. Можно сделать это двумя способами: Повернуть на 108° градусов против часовой стрелки оранжевый круг. Расчет: В крайнем примере у нас уже повернуто на 90° градусов и доворачиваем до середины сектора ещё 18° градусов (весь сектор 36°) итого: Вариант с поворотом сектора Ручка к мишени Блок цветных кругов Начальная метка stroke-dashoffset Поясняющий текст Circle / 10 transform="rotate(-108 175 175)" circle - "darkorange" stroke-dasharray="31.4 31.4" stroke-dashoffset="0" Линии (grey) проходящие через центр полотна SVG Вариант с отступом Во всех предыдущих примерах мы имели нулевой отступ и начало сектора совпадало с вертикальной линией. Теперь, чтобы сдвинуть сектор на половину его дуги = 31.4 / 2 = 15.7 Используем - stroke-dashoffset="15.7" Ручка к мишени Блок цветных кругов Начальная метка stroke-dashoffset Поясняющий текст Circle / 10 stroke-dashoffset="15.7" circle - "darkorange" stroke-dasharray="31.4 31.4" stroke-dashoffset="15.7" Линии (grey) проходящие через центр полотна SVG Решение вопроса автора stroke-dasharray="31.4 31.4" и stroke-dashoffset="31.4" Вот если бы я сразу дал такой ответ, что вам нужно вбить? Это помогла бы? Да, но один раз, и следующая подобная задача вызвала бы без знания теории точно такие же мучения, как были с первым примером. Не поленитесь, прочитайте пожалуйста "много буков" выше.

Ответ 2



Хотелось ещё добавить информации по анимации, вдруг кому-нибудь она будет полезна и подвигнет сделать на основе примеров, что-то своё.* Вращение по часовой стрелке В пример "10 секторов" из первого ответа добавлена всего одна команда, реализующая вращение по часовой стрелке: Ниже полный код: Линии повторяющая расцветку двух кругов Блок цветных кругов Начальная метка stroke-dashoffset Линии (grey) проходящие через центр полотна SVG Вращение против часовой стрелки Обратите внимание, сравнивая с первым примером анимации,- в атрибуте анимации "values" параметры 314;0 поменялись местами. Линии повторяющая расцветку двух кругов Блок цветных кругов Начальная метка stroke-dashoffset Линии (grey) проходящие через центр полотна SVG Вращение в обе стороны с паузой Пауза достигается повторением начальных и конечных значений stroke-dashoffset Линии повторяющая расцветку двух кругов Блок цветных кругов Начальная метка stroke-dashoffset Линии (grey) проходящие через центр полотна SVG

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

Отправить комментарий