在许多网站上,开始出现对称切出小区域的旋转圆圈的效果。看起来不错。如何复制这种效果?
我设法使用属性剪切了一段stroke-dasharray
下面的代码:
.txt1 {fill:white; pointer-events:none;}
.rect {fill:gray;}
.txt1:hover {fill:white;}
.rect:hover {fill:black; transition:fill 0.5s all;}
<svg id="svg1" version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" width="320" height="60" viewBox="0 0 350 60" >
<g id="gr1" >
<rect class="rect" x="62" y="11" rx="10" width="250" height="40" />
<text class="txt1" x="75" y="40" font-size="22" > SPECIAL OPERATIONS </text>
<circle id="crc1" cx="30" cy="30" r="20" stroke='grey' stroke-width="3" fill='transparent'
stroke-dasharray="115.66 10" stroke-dashoffset="-35.41" >
</circle>
</g>
</svg>
将鼠标悬停在标签上时如何剪切第二个对称段并使其旋转?
更新
添加了新答案:
选项 - 仅 HTML 和 CSS @UModeL
比赛附加条件:
使用实现动画的解决方案来获得答案会非常有趣,就像 SVG 的CSS动画答案一样JS
- 单段旋转
- 创建具有两个以上段的形状动画的技术
- 从一点对称填充形状的动画
在决策平等的情况下,将优先选择带有良好注释代码的答案。
不接受使用插件、第三方库作为竞争性答案的答案。
2019 年 2 月 24 日更新
恭喜 UModel 竞赛获胜者
比赛的所有困难条件都满足了!
我相信很多人最终会一次又一次地回到这个话题来使用答案作者的原始解决方案。整个代码以非常详细和易于访问的方式进行注释,这使得更容易感知和掌握各种解决方案技术的有趣组合。
只有 HTML 和 CSS。边框颜色和旋转伪元素
我将立即预订 SVG 在形状和动画方面提供了更多机会(从相邻的答案中可以看出)。确实,有几个缺点——这是标记代码的权重(同时没有人取消样式和脚本)和对 SVG 的研究(虽然“入门门槛”不高,但它不是在旅途中很容易理解)。
对于简单的形状,最少的 HTML 标记就足够了,其他一切都通过 CSS 实现:
装载机
创作可以分为几个阶段:
<div class="spin"></div>;.spin, .spin:after {}并添加以下属性:width和height- 为宽度和高度指定相同的值;box-sizing: border-box;- 这样框架的厚度不会影响周围的元素;border: 3px solid grey;- 实际上,一个带有厚度指示的框架;border-radius: 50%;- 使元素的角变圆,从而转动 围成一圈;border-color: grey transparent grey transparent;。.spin {}具有属性的规则:position: relative;- 用于伪元素的正确定位;transform: rotate(0deg);- 块初始位置的旋转角度;transition: 1.5s ease;- 我们设置了过渡,以便发生平滑的旋转动画,而不是从初始位置到最终位置的急剧跳跃.spin:after {}和属性:position: absolute; z-index: 1; top: -3px; left: -3px;- 相对于主块放置和对齐伪元素;transform: rotate(65deg);设置伪元素的旋转角度,从而改变间隙的宽度。如果您运行下面的示例并移动滑块,则原理会变得更加清晰:
按钮
该按钮是通过 tag 实现的,通过使用具有进一步样式
<label>的属性将其转换为块元素。display: block;使用
<label>不是偶然的,而是由于在实现这样一个简单的任务时希望放弃特定示例中的脚本。并且还演示了使用此标签的方法之一。在此示例中,标签
<label>(每个标签)用于“远程”控制元素的状态<input>。那些。标签本身可以位于页面上的任何位置(同时,在<input>与之关联的标签旁边根本没有必要)。标签和与for<input>属性相关联,其值指定托管元素的id :此外,可以有多个标签指向同一个元素,它们可以放置在文档中的任意位置并具有不同的样式:
重要的!受控元素影响其相邻元素及其状态的唯一条件
<input>必须放置在所需元素之前的标记中,并且在 CSS 中您需要使用相邻元素选择器 -+:同时,
<input>您需要自己隐藏它,例如,通过在样式中指定:为什么不
display: none;呢?因为在某些浏览器中,以这种方式隐藏元素的标签链接停止工作。选项
一段
通过仅更改一个参数 -
border-color: grey grey grey transparent;,您可以获得仅一个间隙的旋转:三段
Чтобы получить три зазора, понадобится добавить ещё один псевдоэлемент
.spin:before { }, продублировав для него свойства из.spin:after { }. Затем, у основного блока и псевдоэлементов задать свойствоtransform: rotate( );с разницей в 120deg. Также, нужно применить нашу "магию" следующим образом -border-color: grey transparent transparent transparent;:Варианты с другим количеством сегментов, резко увеличивают количество кода и усложняют разметку, поэтому реализация HTML+CSS будет нецелесообразной и лучше использовать другой способ.
Анимация появления рамки
Без сомнения, при творческом подходе, возможно создать почти любые эффекты, только средствами CSS. Но, нужно задуматься - "стоит ли овчинка выделки?" Возможно, реализация задумки, где с помощью другой технологии, можно обойтись парой-тройкой строк, не стоит "простыни" кода:
20pxC = 2 * 3.1415 * 20 = 125.66半圆的长度是
62,83如果我们取切割段的长度等于10pxstroke-dasharray 公式,它会是这样的:stroke-dasharray="52.83 10"公式中的第一个数字
52.83是破折号的长度,第二个10是空格。实际上,我们不旋转圆,而是使用动画移动线段的开头
stroke-dashoffset当您将鼠标悬停在光标上时,该事件将起作用,
begin="gr1.mouseover"圆圈将向一个方向旋转。当光标离开铭文时,
begin="gr1.mouseout"圆圈将向相反方向旋转。当您将鼠标悬停在标题上时动画开始
第二个选项
分段垂直排列
Варианты анимаций
Вращение одного сегмента
Также используем атрибут
stroke-dasharrayсначала для вырезания сегмента. При полной длине окружности равной125,66и размере вырезаемого сегмента10pxполучаем:stroke-dasharray="115.66 10"Анимация реализуется изменением
stroke-dashoffsetот максимума до минимума.Запуск анимации при наведении курсора
Второй вариант
Движение по видимой круговой траектории
К предыдущему коду добавляется вторая окружность, которая рисует траекторию движения сегмента.
Техника создания анимаций фигур с количеством сегментов больше двух
Для более углубленного изучения есть топик на нашем сайте, прочитав который, вы в совершенстве будете владеть данной техникой.
Три сегмента
Допустим нам необходимо создать три вращающихся сегмента.
делим полную длину окружности -
125.66 / 3 = 41.88В одном сегменте
41,88pxдолжны уместится черта 33.88 + пробел8pxИтого получилось -
stroke-dasharray="33.88 8"Четыре сегмента
125,66 / 4 = 31,415stroke-dasharray="23.415 8"Пять сегментов
125,66 / 5 = 25.13stroke-dasharray="15.13 10"Анимация симметричного заполнения фигур из одной точки
В этой технике используется четыре параметра атрибута
stroke-dasharrayПроще понять на отрезке прямой, у которой в отличии от окружности не смыкаются конечные точки.
Допустим имеем такую запись
stroke-dasharray="10 20"Она означает, что чередуются на всей длине линии черта
10pxи пробел20pxТеперь добавляем ещё два параметра
stroke-dasharray="10 20 40 40"В этом варианте 10 - черта, 20 - пробел, 40 черта, 40 пробел и снова 10 - черта 20 - пробел и так до конца линии.
Анимация линии из средней точки
Линия длиной
340px, половина линии, средняя точка170pxfrom="0 170 0 170"начало анимации - черта - 0, пробел длиною 170 px, черта - 0, пробел длиною 170 px то есть вся линия спрятана.to="0 0 340 0"- черта длиною0пробел длиною0, черта 340px, пробел - ноль. Так как на трех позициях нули, а одна черта имеет максимальную длину равную полной длине линии, то линия будет показана полностью.На этом принципе действуют остальные примеры рисования из средней точки
Анимация рисования бордюра из средней точки
Анимация вертикального эллипса
Горизонтальный эллипс
От меня, как и в прошлый раз WebGL изврат в 100 строчек кода вместе с разметкой и с небольшим бонусом в виде displacement'a
Все это математика во фрагментном шейдере и те же самые signed distance fields, о которых я уже писал в посте по ссылке в начале
Если коротко то вся соль, вот тут: