我正在尝试使用(主要是)CSS生成一个“不错的” CSS菜单,但是还带有一小部分jQuery:

我的总体想法是:

+------------------------+
|                        |
|                        |
|         +---+          |
|         |   |          |
|         |___|          | <-- Hover this center piece
|                        |
|                        |
|                        |
+------------------------+

+------------------------+
|     _                  |
|    |\                  | <-- All start moving up to top of screen
|      \  +---+          |
|         |   |          |
|         |___|          |
|                        |
|                        |
|                        |
+------------------------+

+------------------------+
| +---+                  |
| |   |                  |
| |___|                  |
|                        |
|  || All, but one       |
|  || moves down         |
|  \/                    |
|                        |
+------------------------+

+------------------------+
| +---+                  |
| |   |                  |
| |___|                  |
|                        |
|        One stays,      |
| +---+  the rest move this way
| |   |  --->            |
| |___|                  |
+------------------------+

+------------------------+
| +---+                  |
| |   |                  |
| |___|              ^   | The rest move up
|                    |   |
|                    |   |
| +---+            +---+ |
| |   |            |   | |
| |___|            |___| |<-- Another stays
+------------------------+

完成:
+------------------------+
| +---+            +---+ |
| | 1 |            | 4 | |
| |___|            |___| |
|                        |
|                        |
| +---+            +---+ |
| | 2 |            | 3 | |
| |___|            |___| |
+------------------------+

但是,这假定将有四个div子代,因此,我试图在jQuery中生成一种“确定 Angular /位置”的方法(老实说,效果不太好)。

相似的设计:



因此,最后,由于有四个div,因此它们与中心的距离为90度(360/4 div =相隔90度)。

例如,如果有六个 child div;
360/6 = 60 degrees

因此它们将以60度的间隔均匀分布。

我还将在它们之间添加动画,因此也为什么要一直使用旋转等,但是我似乎无法掌握它:

我当前的示例是:

$(".wrap").hover(function(){
    var x =$(this).children().length; //Counts '.circles'
    var degree = 360 / x; //Gets angle
    var percent = 100 / x;
    var curPercent = percent;
    $(this).children().each(function (index) {
        $(this).css("transform","rotate(" + degree*index + "deg)");
        $(this).css("top",percent + "px");
        $(this).css("left",percent + "px");

        percent = percent + curPercent;
    });
});
.wrap{
    height: 300px;
    width: 300px;
    background: red;
    position: relative;
    transform-origin: center center;
    transition: all 0.8s;
}
.wrap:hover .circle{
    top: 0;
    left: 0;
}
.circle{
    transition: all 0.8s;
    position: absolute;
    height: 50px;
    width: 50px;
    top: calc(50% - 25px);
    left: calc(50% - 25px);
    background: tomato;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="wrap">
    <div class="circle">1</div>
    <div class="circle">2</div>
    <div class="circle">3</div>
    <div class="circle">4</div>
</div>


Fiddle

任何人都可以:
  • (A):知道如何使div相对于jQuery代码中指定的父级“旋转”指定的 Angular 或距离吗?
  • (B):在悬停时获取“动画”重置吗?
  • (C):我知道我在说什么吗?


  • 类似的实现(尽管不完全):
  • Here
  • This more so-但这使用Sass(不需要)
  • 最佳答案

    使用不同的方法,您会得到稍微不同的效果。您可以玩setTimeouttransition的时间来修改行为。

    See the fiddle

    + function() {
      var to;
      $(".wrap").on('mouseenter', function() {
        var circles = $(this).children();
        var degree = (2 * Math.PI) / circles.length; //calc delta angle
        var transforms = [];
    
        // Calculate the position for each circle
        circles.each(function(index) {
            var x = 100 * Math.cos(-0.5 * Math.PI + degree * (-1 * index - 0.5));
            var y = 100 * Math.sin(-0.5 * Math.PI + degree * (-1 * index - 0.5));
    
          transforms.push('translate(' + x + 'px,' + y + 'px)');
        });
    
        // Function to moves all the circles
        // We'll pop a circle each time and than call this function recursively
        function moveCircles() {
          var transform = transforms.shift();
          circles.css('transform', transform);
    
          circles.splice(0, 1);
          if (circles.length) to = setTimeout(moveCircles, 400);
        }
    
        moveCircles();
      });
    
      $(".wrap").on('mouseleave', function() {
        var circles = $(this).children().css('transform', '');
        clearTimeout(to);
      });
    }();
       .wrap {
         height: 300px;
         width: 300px;
         background: red;
         position: relative;
         transform-origin: center center;
         transition: all 0.8s;
       }
       .circle {
         transition: all 0.8s;
         position: absolute;
         height: 50px;
         width: 50px;
         text-align: center;
         line-height: 50px;
         top: calc(50% - 25px);
         left: calc(50% - 25px);
         background: tomato;
         border-radius: 50%;
       }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div class="wrap">
      <div class="circle">1</div>
      <div class="circle">2</div>
      <div class="circle">3</div>
      <div class="circle">4</div>
      <div class="circle">5</div>
      <div class="circle">6</div>
    </div>

    关于jquery - 在悬停时创建CSS 'path',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28497425/

    10-12 00:17
    查看更多