散射动画

sass来做keyframe和循环

by weiming le

HTML

<ul>
  <li class="circle"></li>
  <li class="circle"></li>
  <li class="circle"></li>
  <li class="circle"></li>
  <li class="circle"></li>
  <li class="circle"></li>
</ul>
<button id="start">start</button>

SCSS

@mixin biubiu($startX, $startY, $endX, $endY, $keyName) {
  $itemX: ($startX - $endX)/10;
  $itemY: ($startY - $endY)/10;
  @keyframes biubiu_#{$keyName} {
    from {
      left: $startX;
      top: $startY;
      opacity: 0;
    }
    @for $i from 1 through 9 {
      $percent: 0%+$i*10;
      #{$percent} {
        left: $startX - $itemX*$i;
        top: $startY - $itemY*$i;
        opacity: 0.1*$i;
      }
    }
    to {
      left: $endX;
      top: $endY;
      opacity: 1;
    }
  }
}

$listLen: 5;

/* @include biubiu(100px, 100px, 150px, 186px, '1');
@include biubiu(100px, 100px, 186px, 150px, '2');
@include biubiu(100px, 100px, 200px, 100px, '3');
@include biubiu(100px, 100px, 186px, 50px, '4');
@include biubiu(100px, 100px, 150px, 13px, '5'); */

@include biubiu(100px, 100px, 186px, 49px, '1');
@include biubiu(100px, 100px, 150px, 13px, '2');
@include biubiu(100px, 100px, 99px, 0px, '3');
@include biubiu(100px, 100px, 49px, 13px, '4');
@include biubiu(100px, 100px, 13px, 49px, '5');
ul,
li {
  list-style: none;
}

.circle {
  position: absolute;
  left: 30px;
  top: 30px;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background-color: orange;
  opacity: 0;
  @for $i from 1 through $listLen {
    &.animate:nth-child(#{$i}) {
      animation: biubiu_#{$i} 1s 10 ease-in-out;
    }
  }
}

JavaScript

var btn = document.querySelector('#start');
var circle = document.querySelectorAll('.circle');
var animate = function() {
  var circleList = [].slice.call(circle);
  circleList.forEach(function(v, i) {
    console.log(i, v);
    v.setAttribute('class', 'circle animate');
  });
};
//origin坐标,reg角度,n为份数,r为直径
var rec = function(origin, reg, n, r) {
  var restReg = (180 - reg) / 2;
  var eachReg = reg / (n - 1);
  var totalReg = 0;
  var result = [];
  for (var i = 0; i < n; i++) {
    totalReg = (restReg - 360) + i * eachReg;
    console.log(totalReg, i);
    var x = origin.x + Math.cos(Math.PI * totalReg / 180) * r;
    var y = origin.y - Math.sin(Math.PI * totalReg / 180) * r;
    result.push({
      x: Math.floor(x),
      y: Math.floor(y)
    });
  }
  return result;
};
var result = rec({
  x: 100,
  y: 100
}, 120, 5, 100);
console.log(result);
btn.addEventListener('click', function() {
  //alert('you click me');
  animate();
}, false);