Page 259 - css揭秘
P. 259

可以相互抵消的,因此这基本上相当于我们只在 Y 轴上做了两次位移操作
                                             (translateY(-150px)  translateY(50%))。此外,由于同一关键帧内的两
                                              次旋转也会相互抵消,我们还可以把旋转之前和之后的水平位移动作去掉,
                                              再把垂直位移合并起来。这样一来就得到了如下的关键帧:

                                                  @keyframes spin {
                                                      from {
                                                          transform: translateY(150px) translateY(-50%)
                                                                     rotate(0turn)
                                                                     translateY(-150px) translateY(50%)
                                                                     rotate(1turn);

                                                      }
                                                      to {
                                                          transform: translateY(150px) translateY(-50%)
                                                                     rotate(1turn)
                                                                     translateY(-150px) translateY(50%)
                                                                     rotate(0turn);
                                                      }
                                                  }

                                                  .avatar { animation: spin 3s infinite linear; }

                                                  这样代码会稍短一些,重复度也稍低一些,但还不够好。我们还能更进
                                              一步吗?如果把头像放在圆心并以此作为起点(如图 8-39 所示),我们就可
                                              以消除最开始的那两个位移操作了,而实际上这两个位移在本质上所做的就
                                              是把它放在圆心。然后,这个动画就会变为:

                                                  @keyframes spin {
                                                      from {
                                                          transform: rotate(0turn)
                                                                     translateY(-150px) translateY(50%)
                                                                     rotate(1turn);
                                                      }
                    图 8-39                            to {
                                                          transform: rotate(1turn)
                    如果我们在一开始是把头像居中
                                                                     translateY(-150px) translateY(50%)
                    的,那么关键帧代码还可以再稍                                   rotate(0turn);
                    微精简一些;此外,万一浏览器                    }
                    不支持动画的话,这个状态也将                }

                    是我们得到的回退样式(这种样
                                                  .avatar { animation: spin 3s infinite linear; }
                    式可能是也可能不是我们希望看
                    到的)
                                                  这似乎已经是我们在当下所能做到的最优结果了。代码还没有彻底满
                                              足 DRY 的要求,但已经相当简短了。我们已经尽可能减小了代码的重复度,
                                              而且除去了冗余的 HTML 元素。如果要让它变得完全 DRY,避免路径的半
                                              径值在代码中重复出现,那就需要请出预处理器了。这一步就作练习留给各
                                              位读者去思考吧!


                                               试一试 play.csssecrets.io/circular





                  228   第 8 章 过渡与动画







          ඀ࠡ  JOEC
   254   255   256   257   258   259   260   261   262   263   264