【问题标题】:Rotate dashes of SVG stroke-dasharray旋转 SVG stroke-dasharray 的虚线
【发布时间】:2014-04-02 22:43:00
【问题描述】:

我正在寻找动画 SVG stroke-dasharray 的单个破折号的旋转,有没有人知道怎么做,因为它是可能的?

我意识到我可以使用 CSS'transform:rotate() 旋转 SVG 元素的整个对象,但是有什么方法可以旋转单个破折号吗?我也意识到我可以使用单个元素重新创建它并旋转它们,但出于性能和简洁的原因,这不是我想要做的

Here's a demo 如果您想拥有一个。我希望方块在它们的位置保持直立,而不是在它们沿圆形路径旋转时旋转。我正在寻找重新创建this gif

附:我知道圆圈没有完全对齐,I asked about that before

【问题讨论】:

    标签: css svg rotation css-animations stroke-dasharray


    【解决方案1】:

    我做了样品。

    http://jsdo.it/defghi1977/sQOc

    Robert Longson 的“标记”方法非常好!谢谢!

    <?xml version="1.0" standalone="no"?>
    <svg width="400px" height="400px" viewBox="-200 -200 400 400" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" style="background-color:black;">
    <defs>
        <rect id="markerShape" x="-1" y="-1" width="2" height="2" fill="yellow">
            <animateTransform attributeName="transform" type="rotate" to="360,0,0" begin="0s" dur="30s" repeatCount="indefinite"/>
        </rect>
    
        <marker id="marker1" markerUnits="strokeWidth" viewBox="-1 -1 2 2" overflow="visible" markerWidth="1" markerHeight="1">
            <use xlink:href="#markerShape" transform="scale(0.02,0.02)"/><!--NOTE: =1/50-->
            <animate attributeName="orient" from="0" to="-30" begin="0s" dur="5s" repeatCount="indefinite"/>
        </marker>
        <marker id="marker2" markerUnits="strokeWidth" viewBox="-1 -1 2 2" overflow="visible" markerWidth="1" markerHeight="1">
            <use xlink:href="#markerShape" transform="scale(0.01428,0.01428)"/><!--NOTE: =1/70-->
            <animate attributeName="orient" from="0" to="-60" begin="0s" dur="5s" repeatCount="indefinite"/>
        </marker>
        <marker id="marker3" markerUnits="strokeWidth" viewBox="-1 -1 2 2" overflow="visible" markerWidth="1" markerHeight="1">
            <use xlink:href="#markerShape" transform="scale(0.01111,0.01111)"/><!--NOTE: =1/90-->
            <animate attributeName="orient" from="0" to="-90" begin="0s" dur="5s" repeatCount="indefinite"/>
        </marker>
        <marker id="marker4" markerUnits="strokeWidth" viewBox="-1 -1 2 2" overflow="visible" markerWidth="1" markerHeight="1">
            <use xlink:href="#markerShape" transform="scale(0.00909,0.00909)"/><!--NOTE: =1/110-->
            <animate attributeName="orient" from="0" to="-120" begin="0s" dur="5s" repeatCount="indefinite"/>
        </marker>
        <marker id="marker5" markerUnits="strokeWidth" viewBox="-1 -1 2 2" overflow="visible" markerWidth="1" markerHeight="1">
            <use xlink:href="#markerShape" transform="scale(0.007692,0.007692)"/><!--NOTE: =1/130-->
            <animate attributeName="orient" from="0" to="-150" begin="0s" dur="5s" repeatCount="indefinite"/>
        </marker>
        <marker id="marker6" markerUnits="strokeWidth" viewBox="-1 -1 2 2" overflow="visible" markerWidth="1" markerHeight="1">
            <use xlink:href="#markerShape" transform="scale(0.00666,0.00666)"/><!--NOTE: =1/150-->
            <animate attributeName="orient" from="0" to="-180" begin="0s" dur="5s" repeatCount="indefinite"/>
        </marker>
        <marker id="marker7" markerUnits="strokeWidth" viewBox="-1 -1 2 2" overflow="visible" markerWidth="1" markerHeight="1">
            <use xlink:href="#markerShape" transform="scale(0.00588,0.00588)"/><!--NOTE: =1/180-->
            <animate attributeName="orient" from="0" to="-210" begin="0s" dur="5s" repeatCount="indefinite"/>
        </marker>
    
        <polygon id="basicShape" fill="none" points="
            0,1
            0.5,0.86603
            0.86603,0.5
            1,0
            0.86603,-0.5
            0.5,-0.86603
            0,-1
            -0.5,-0.86603
            -0.86603,-0.5
            -1,0
            -0.86603,0.5
            -0.5,0.86603" 
        />
    </defs>
    
    <g>
        <use xlink:href="#basicShape" transform="scale(50,50)" stroke-width="14" marker-mid="url(#marker1)" marker-start="url(#marker1)"/>
        <animateTransform attributeName="transform" type="rotate" to="30,0,0" begin="0s" dur="5s" repeatCount="indefinite"/>
    </g>
    <g>
        <use xlink:href="#basicShape" transform="scale(70,70)" stroke-width="15" marker-mid="url(#marker2)" marker-start="url(#marker2)"/>
        <animateTransform attributeName="transform" type="rotate" to="60,0,0" begin="0s" dur="5s" repeatCount="indefinite"/>
    </g>
        <g>
        <use xlink:href="#basicShape" transform="scale(90,90)" stroke-width="16" marker-mid="url(#marker3)" marker-start="url(#marker3)"/>
        <animateTransform attributeName="transform" type="rotate" to="90,0,0" begin="0s" dur="5s" repeatCount="indefinite"/>
    </g>
    <g>
        <use xlink:href="#basicShape" transform="scale(110,110)" stroke-width="17" marker-mid="url(#marker4)" marker-start="url(#marker4)"/>
        <animateTransform attributeName="transform" type="rotate" to="120,0,0" begin="0s" dur="5s" repeatCount="indefinite"/>
    </g>
    <g>
        <use xlink:href="#basicShape" transform="scale(130,130)" stroke-width="18" marker-mid="url(#marker5)" marker-start="url(#marker5)"/>
        <animateTransform attributeName="transform" type="rotate" to="150,0,0" begin="0s" dur="5s" repeatCount="indefinite"/>
    </g>
    <g>
        <use xlink:href="#basicShape" transform="scale(150,150)" stroke-width="19" marker-mid="url(#marker6)" marker-start="url(#marker6)"/>
        <animateTransform attributeName="transform" type="rotate" to="180,0,0" begin="0s" dur="5s" repeatCount="indefinite"/>
    </g>
    <g>
        <use xlink:href="#basicShape" transform="scale(170,170)" stroke-width="21" marker-mid="url(#marker7)" marker-start="url(#marker7)"/>
        <animateTransform attributeName="transform" type="rotate" to="210,0,0" begin="0s" dur="5s" repeatCount="indefinite"/>
    </g>
    </svg>
    

    【讨论】:

    • 很棒的反应!你知道任何让它响应的方法吗?
    • 杀死根svg元素的width和height属性,享受吧!
    • 很遗憾你的链接上周失效了。
    【解决方案2】:

    stroke-dasharray 是错误的方法,因为您不能影响破折号的旋转。

    更好的方法是在路径上使用正方形markers,这样每个路径顶点都有一个具有固定方向属性的标记。路径本身可以是透明的,因此只有标记可见。

    【讨论】:

    • 您能否举一个您所描述的带有方形标记的圆形路径的示例?恐怕我不习惯语法
    • 是的,但是我怎样才能在一个圆形路径周围获得多个标记(与演示中显示的一样多)?看来我只能在marker-startmarker-midmarker-end 拥有它们
    • 创建一个路径,其中每个顶点都是您要放置标记的位置。使用单独的子路径来形成圆形,而不是单个圆形或弧形路径。
    • 这看起来几乎和在圆形路径中放置正方形一样糟糕
    • 您可以随意尝试这两种方法,但稍后您会告诉我性能比我的方式要好得多。你得到 10 条带有 1 个标记的路径,我的方式是 11 个 DOM 元素,你的方式是 100 多个 DOM rect 元素。如果您对路径构造足够聪明,则 1 条路径和 1 个标记就可以了。
    猜你喜欢
    • 2018-05-12
    • 2021-08-08
    • 2019-08-18
    • 2013-12-23
    • 2019-01-21
    • 2019-03-13
    • 2016-03-13
    • 2019-04-03
    • 1970-01-01
    相关资源
    最近更新 更多