你可以看到在这fiddle如何(目前)我使用伪元素生成’旋转’效果。这是通过在虚线白色和虚线金色边框之间切换,使它看起来像“边界旋转”。
我拥有的
#one{ -webkit-animation: rotateClockwiseAnimation 5s linear infinite; /* Safari 4+ */ -moz-animation: rotateClockwiseAnimation 5s linear infinite; /* Fx 5+ */ -o-animation: rotateClockwiseAnimation 5s linear infinite; /* Opera 12+ */ animation: rotateClockwiseAnimation 5s linear infinite; /* IE 10+,Fx 29+ */ } #two{ -webkit-animation: rotateAntiClockwiseAnimation 5s linear infinite; /* Safari 4+ */ -moz-animation: rotateAntiClockwiseAnimation 5s linear infinite; /* Fx 5+ */ -o-animation: rotateAntiClockwiseAnimation 5s linear infinite; /* Opera 12+ */ animation: rotateAntiClockwiseAnimation 5s linear infinite; /* IE 10+,Fx 29+ */ position:absolute; top:30px; left:42px; width:80px; } @-webkit-keyframes rotateClockwiseAnimation { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } @-moz-keyframes rotateClockwiseAnimation{ 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } @-o-keyframes rotateClockwiseAnimation { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } @keyframes rotateClockwiseAnimation { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } @-webkit-keyframes rotateAntiClockwiseAnimation { 0% { transform: rotate(0deg); } 100% { transform: rotate(-360deg); } } @-moz-keyframes rotateAntiClockwiseAnimation { 0% { transform: rotate(0deg); } 100% { transform: rotate(-360deg); } } @-o-keyframes rotateAntiClockwiseAnimation { 0% { transform: rotate(0deg); } 100% { transform: rotate(-360deg); } } @keyframes rotateAntiClockwiseAnimation { 0% { transform: rotate(0deg); } 100% { transform: rotate(-360deg); } } /******************************************************************************/ .chain{ height:70px; width:80%; border:5px dashed gold; border-radius:30px; position:absolute; top:30px; left:40px; -webkit-animation: switchGoldBlackBorder 0.8s infinite; /* Safari 4+ */ -moz-animation: switchGoldBlackBorder 0.8s infinite; /* Fx 5+ */ -o-animation: switchGoldBlackBorder 0.8s infinite; /* Opera 12+ */ animation: switchGoldBlackBorder 0.8s infinite; /* IE 10+,Fx 29+ */ } @-webkit-keyframes switchBlackGoldBorder { 0% { border: 5px dashed transparent; } 49% { border: 5px dashed transparent; } 50% { border: 5px dashed gold; } 100% { border: 5px dashed gold; } } @-moz-keyframes switchBlackGoldBorder{ 0% { border: 5px dashed transparent; } 49% { border: 5px dashed transparent; } 50% { border: 5px dashed gold; } 100% { border: 5px dashed gold; } } @-o-keyframes switchBlackGoldBorder { 0% { border: 5px dashed transparent; } 49% { border: 5px dashed transparent; } 50% { border: 5px dashed gold; } 100% { border: 5px dashed gold; } } @keyframes switchBlackGoldBorder { 0% { border: 5px dashed transparent; } 49% { border: 5px dashed transparent; } 50% { border: 5px dashed gold; } 100% { border: 5px dashed gold; } } .chain:after{ content:""; position:absolute; height:70px; border-radius:30px; width:100%; top:-5px; left:-5px; border:5px solid gold; z-index:-1; -webkit-animation: switchBlackGoldBorder 0.8s infinite; /* Safari 4+ */ -moz-animation: switchBlackGoldBorder 0.8s infinite; /* Fx 5+ */ -o-animation: switchBlackGoldBorder 0.8s infinite; /* Opera 12+ */ animation: switchBlackGoldBorder 0.8s infinite; /* IE 10+,Fx 29+ */ } @-webkit-keyframes switchGoldBlackBorder { 0% { border: 5px solid gold; } 49% { border: 5px solid gold; } 50% { border: 5px solid white; } 100% { border: 5px solid white; } } @-moz-keyframes switchGoldBlackBorder{ 0% { border: 5px solid gold; } 49% { border: 5px solid gold; } 50% { border: 5px solid white; } 100% { border: 5px solid white; } } @-o-keyframes switchGoldBlackBorder { 0% { border: 5px solid gold; } 49% { border: 5px solid gold; } 50% { border: 5px solid white; } 100% { border: 5px solid white; } } @keyframes switchGoldBlackBorder { 0% { border: 5px solid gold; } 49% { border: 5px solid gold; } 50% { border: 5px solid white; } 100% { border: 5px solid white; } }
<svg id="one" style="width:50px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"> <defs> <circle id="c" cx="50" cy="50" r="30" stroke="#808080" fill="none" stroke-width="25"/> <path id="d" stroke="#808080" stroke-width="16" d="M50 0,V15 M50 100,V85 M0 50,H15 M100 50,H85"/> </defs> <use xlink:href="#c"/> <use xlink:href="#d"/> <use xlink:href="#d" transform="rotate(45,50,50)"/> </svg> <svg id="two" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"> <use xlink:href="#one"/> </svg> <div class="chain"></div>
所以,下面的代码段,你可以看到我是如何通过使用关键帧生成’旋转链效应’。
我想要什么
我的整体愿望是产生类似:
考虑输送带的横截面,以及“端部的齿轮如何驱动带”。我试图重现。 (即,虚线边界的金钻头应该在齿轮的槽内,并且被其“拉动”),
#one{ -webkit-animation: rotateClockwiseAnimation 5s linear infinite; /* Safari 4+ */ -moz-animation: rotateClockwiseAnimation 5s linear infinite; /* Fx 5+ */ -o-animation: rotateClockwiseAnimation 5s linear infinite; /* Opera 12+ */ animation: rotateClockwiseAnimation 5s linear infinite; /* IE 10+,Fx 29+ */ border:5px dashed gold; border-radius:50%; } @-webkit-keyframes rotateClockwiseAnimation { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } @-moz-keyframes rotateClockwiseAnimation{ 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } @-o-keyframes rotateClockwiseAnimation { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } @keyframes rotateClockwiseAnimation { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
<svg id="one" style="width:50px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"> <defs> <circle id="c" cx="50" cy="50" r="30" stroke="#808080" fill="none" stroke-width="25"/> <path id="d" stroke="#808080" stroke-width="16" d="M50 0,50)"/> </svg>
但是金色破折号适合齿轮的槽,以及80%的屏幕宽度(如果这是有道理的)。
最后,我想生成这样的图像portemap:
看看我想要链“旋转”?
我的当前问题
>由于动画是通过使用伪元素“黑客”,我发现很难实际同步这个“链”的旋转。
>我仍然在学习关键帧动画,所以我敢肯定,这不是最好的方法
>再次,svg是一个新的概念为我,所以忍受我不愿意使用它(因此为什么我使用css为’链’)
>最后,我想’让它看起来像’齿轮转动链,但现在他们看起来像完全(和糟糕的)单独的元素动画
解决方法
我总是重构代码(CSS和HTML),现在是:
>更短(特别是css)
>更简单
>更现实:更正了链和齿轮的同步问题,并在右侧添加了一个缺少的cog,因为你的链似乎在空中浮动:
该方法是相同的,为链条的旋转角度和链条路径的冲击偏移量进行动画化。我调整了两个动画之间的时间,使它看起来好像齿轮拉链。
浏览器支持:
作为IE doesn’t support svg animate元素我也制作了这个版本的动画与snap.svg库,也支持IE9和以上(在IE9与crossbrowsertesting测试)。
var cont = new Snap('#svg'),chain = cont.select('#chain'),cogAcw = cont.select('#cog_acw'),cogCw = cont.select('#cog_cw'),speed = 500; // Lower this number to make the animation faster function infChain(el) { var len = el.getTotalLength(); el.attr({"stroke-dasharray": len/62,"stroke-dashoffset": 0}); el.animate({"stroke-dashoffset": -len/31},speed,mina.linear,infChain.bind(null,el)); } function rotateAcw(el) { el.transform('r22.5,20,20'); el.animate({ transform: 'r-22.5,20' },rotateAcw.bind( null,el)); } function rotateCw(el) { el.transform('r0,20'); el.animate({ transform: 'r45,rotateCw.bind( null,el)); } infChain(chain); rotateAcw(cogAcw); rotateCw(cogCw);
svg { width:100%; }
<script src="http://thisisa.simple-url.com/js/snapsvg.js"></script> <svg id="svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 30"> <defs> <circle id="c" cx="20" cy="20" r="4" stroke="#808080" fill="none" stroke-width="4" /> <path id="d" stroke="#808080" stroke-width="2" d="M20 13 V16 M27 20 H24 M20 27 V24 M13 20 H16" /> <g id="cog_acw"> <use xlink:href="#c" /><use xlink:href="#d" /> <use xlink:href="#d" transform="rotate(45 20 20)" /> </g> <g id="cog_cw"> <use xlink:href="#c" /><use xlink:href="#d" /> <use xlink:href="#d" transform="rotate(45 20 20)" /> </g> </defs> <path id="chain" stroke-width="1" stroke="#000" fill="transparent" d="M21.3 13.5 H20 C11.4 13.5 11.4 26.5 20 26.5 H80 C89.4 26.5 89.4 13.5 80.8 13.5z" /> <use xlink:href="#cog_acw" /> <use transform="translate(60.5 0),rotate(19,20)" xlink:href="#cog_acw" /> <use transform="translate(-4.5 -4.5),scale(.8),rotate(0,20)" xlink:href="#cog_cw" /> </svg>
svg{width:100%;} #chain_st{ -webkit-animation: dash 1s infinite linear; -moz-animation: dash 1s infinite linear; -o-animation: dash 1s infinite linear; animation: dash 1s infinite linear; } @-webkit-keyframes dash { to { stroke-dashoffset: -5; } } @-moz-keyframes dash { to { stroke-dashoffset: -5; } } @-o-keyframes dash { to { stroke-dashoffset: -5; } } @keyframes dash { to { stroke-dashoffset: -5; } }
<svg id="one" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 30"> <defs> <circle id="c" cx="20" cy="20" r="4" stroke="#808080" fill="none" stroke-width="4"/> <path id="d" stroke="#808080" stroke-width="2" d="M20 13 V16 M27 20 H24 M20 27 V24 M13 20 H16"/> <g id="cog"> <use xlink:href="#c"/> <use xlink:href="#d"/> <use xlink:href="#d" transform="rotate(45 20 20)"/> </g> </defs> <g transform="translate(0,-7),scale(0.8),rotate(22.5 8 8)"> <use xlink:href="#cog"> <animateTransform attributeType="xml" attributeName="transform" type="rotate" from="-22.5 20 20" to="337.5 20 20" dur="8s" repeatCount="indefinite"/> </use> </g> <path id="chain_st" stroke-width="1" stroke="#000" fill="transparent" stroke-dasharray="2.6 2.45" d="M21.3 13.5 H20 C11.4 13.5 11.4 26.5 20 26.5 H80 C89 26.5 89 13.5 80.8 13.5z" /> <use class="rot" xlink:href="#cog"> <animateTransform attributeType="xml" attributeName="transform" type="rotate"from="22.5 20 20" to="-337.5 20 20" dur="8s" repeatCount="indefinite"/> </use> <g transform="translate(60.3 0)"> <use class="" xlink:href="#cog"> <animateTransform attributeType="xml" attributeName="transform" type="rotate" from="22.5 20 20" to="-337.5 20 20" dur="8s" repeatCount="indefinite"/> </use> </g> </svg>
原始答案:
您可以使用其他svg虚线路径,并使用关键帧动画为dash-offset属性设置动画。
这可以并且应该被简化/调整为“真实世界”使用:
>所有元素可以包含在一个< svg>标签(这将使它更简单,两个cogs链可以一起调整大小)
>链和cog之间的同步不是完美的,链的速度/大小需要调整。
#one { -webkit-animation: rotateClockwiseAnimation 5s linear infinite; /* Safari 4+ */ -moz-animation: rotateClockwiseAnimation 5s linear infinite; /* Fx 5+ */ -o-animation: rotateClockwiseAnimation 5s linear infinite; /* Opera 12+ */ animation: rotateClockwiseAnimation 5s linear infinite; /* IE 10+,Fx 29+ */ } #two { -webkit-animation: rotateAntiClockwiseAnimation 5s linear infinite; /* Safari 4+ */ -moz-animation: rotateAntiClockwiseAnimation 5s linear infinite; /* Fx 5+ */ -o-animation: rotateAntiClockwiseAnimation 5s linear infinite; /* Opera 12+ */ animation: rotateAntiClockwiseAnimation 5s linear infinite; /* IE 10+,Fx 29+ */ position: absolute; top: 30px; left: 42px; width: 80px; } @-webkit-keyframes rotateClockwiseAnimation { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } @-moz-keyframes rotateClockwiseAnimation { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } @-o-keyframes rotateClockwiseAnimation { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } @keyframes rotateClockwiseAnimation { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } @-webkit-keyframes rotateAntiClockwiseAnimation { 0% { transform: rotate(0deg); } 100% { transform: rotate(-360deg); } } @-moz-keyframes rotateAntiClockwiseAnimation { 0% { transform: rotate(0deg); } 100% { transform: rotate(-360deg); } } @-o-keyframes rotateAntiClockwiseAnimation { 0% { transform: rotate(0deg); } 100% { transform: rotate(-360deg); } } @keyframes rotateAntiClockwiseAnimation { 0% { transform: rotate(0deg); } 100% { transform: rotate(-360deg); } } /******************************************************************************/ #chain { width: 650px; position: absolute; top: 24px; left: 35px; } .chain_st { stroke-dasharray: 1.5; stroke-dashoffset: 10; -webkit-animation: dash 18s infinite linear; -moz-animation: dash 18s infinite linear; -o-animation: dash 18s infinite linear; animation: dash 18s infinite linear; } @-webkit-keyframes dash { to { stroke-dashoffset: 100; } } @-moz-keyframes dash { to { stroke-dashoffset: 100; } } @-o-keyframes dash { to { stroke-dashoffset: 100; } } keyframes dash { to { stroke-dashoffset: 100; } }
<svg id="one" style="width:50px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"> <defs> <circle id="c" cx="50" cy="50" r="30" stroke="#808080" fill="none" stroke-width="25" /> <path id="d" stroke="#808080" stroke-width="16" d="M50 0,H85" /> </defs> <use xlink:href="#c" /> <use xlink:href="#d" /> <use xlink:href="#d" transform="rotate(45,50)" /> </svg> <svg id="two" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"> <use xlink:href="#one" /> </svg> <svg id="chain" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 70 10"> <path class="chain_st" stroke-width="0.5" stroke="#000" fill="transparent" d="M60 1 Q65 1 65 5 Q65 9 60 9 H6 Q1 9 1 5 Q1 1 6 1z" /> </svg>