less 伪元素after/before animation动画变量名总是被编译的解决方法 global @keyframes

常规元素动画,一般都能正常全编译。

.red-orbit {
  width: 45px;
  height: 45px;
  border: 1px solid #ffca91a5;
  -webkit-animation: spin3D 1s linear 0s infinite;
}

@keyframes spin3D {
  from {
    transform: rotate3d(.5,.5,.5, 360deg);
  }
  to{
    transform: rotate3d(0deg);
  }
}

如果不生效,参考使用local,限制作用域,简单说就是在目标元素后面添加 :local,见文末参考文章。

   .red-orbit :local {
      animation: globeRotate 0.5s linear infinite;
    }

然而,less中对于伪元素after/before,目测不适用,具体原因还不是很清楚。

找了一大堆方法,最后决定使用一种比较万能的方法,元素内的动画名和关键帧的动画名共用一个变量来表示:@name: ~’customname’

(感谢原作者)

一定要注意加波浪符(~)

参考示例:

@name: ~'customname';

 .loader_blade {
  transform: rotateZ(45deg);
  perspective: 1000px;
  border-radius: 50%;
  width: 20px;
  height: 20px;
  color: #fff;
   &:before,
   &:after{
    content: '';
    display: block;
    position: absolute;
    top: 0;
    left: 0;
    width: inherit;
    height: inherit;
    border-radius: 50%;
    transform: rotateX(70deg);
    animation: @name 1s   linear infinite;
  }
  &:after {
    color: #FF3D00;
    transform: rotateY(70deg);
    animation-delay: .4s;
  }
}

@keyframes  @name {
  0%,
  100% {
    box-shadow: .2em 0px 0 0px currentcolor;
  }
  12% {
    box-shadow: .2em .2em 0 0 currentcolor;
  }
  25% {
    box-shadow: 0 .2em 0 0px currentcolor;
  }
  37% {
    box-shadow: -.2em .2em 0 0 currentcolor;
  }
  50% {
    box-shadow: -.2em 0 0 0 currentcolor;
  }
  62% {
    box-shadow: -.2em -.2em 0 0 currentcolor;
  }
  75% {
    box-shadow: 0px -.2em 0 0 currentcolor;
  }
  87% {
    box-shadow: .2em -.2em 0 0 currentcolor;
  }
}

参考资料

https://www.cnblogs.com/victorlyw/p/12295673.html

https://blog.csdn.net/qq_42833001/article/details/97623092

https://github.com/webpack-contrib/css-loader/issues/243