Magicline边框动画-从活动类开始动画

时间:2019-02-13 20:31:11

标签: jquery html css animation

我正在尝试使用边框动画(CSSTricks中的MagicLine),它可以正常工作,但我面临的唯一挑战是当前它的第一项,并且对所有动画进行动画处理,但是如果我单击任何一项,则我要从第一项开始添加相同的类并删除,但动画只能从第一项开始

这里是JS fiddle

请帮助!

注意:或请提出任何仅CSS解决方案来制作这种动画

$(function() {
var $el, leftPos, newWidth;
        $mainNav2 = $("#example-two");
    $("#example-one").append("<li id='magic-line'></li>");
    var $magicLine = $("#magic-line");
    $magicLine
        .width($(".current_page_item").width())
        .css("left", $(".current_page_item a").position().left)
        .data("origLeft", $magicLine.position().left)
        .data("origWidth", $magicLine.width());
        
    $("#example-one li").find("a").hover(function() {
        $el = $(this);
        leftPos = $el.position().left;
        newWidth = $el.parent().width();
        
        $magicLine.stop().animate({
            left: leftPos,
            width: newWidth
        });
    }, function() {
        $magicLine.stop().animate({
            left: $magicLine.data("origLeft"),
            width: $magicLine.data("origWidth")
        });    
    });
    
    $("#example-one > li").click(function () {
    alert(1);
    	var _this = $(this);
      $("#example-one > li").removeClass('current_page_item');
      _this.parent().addClass('current_page_item');
    });
    });
* { margin: 0; padding: 0; }
body { font: 14px Georgia, serif; background: #2F2626; color: #eee; }

header { padding: 100px 0 0 0; display: block; }
header h1 { width: 960px; margin: 0 auto; }
a { color: #eee; }
a:hover { color: white; }

.nav-wrap { 
	margin: 50px auto; 
	background-color: rgba(0,0,0,0.6); 
	border-top:    2px solid white; 
	border-bottom: 2px solid white; 
}

/* Clearfix */
.group:after { visibility: hidden; display: block; content: ""; clear: both; height: 0; }
*:first-child+html .group { zoom: 1; } /* IE7 */



/* Example One */
#example-one { 
	margin: 0 auto; 
	list-style: none; 
	position: relative; 
	width: 960px; 
}
#example-one li { 
	display: inline-block;	
}
#example-one a { 
	color: #bbb; 
	font-size: 14px; 
	float: left;
	padding: 6px 10px 4px 10px;
	text-decoration: none;
	text-transform: uppercase;
}
#example-one a:hover { 
	color: white; 
}
#magic-line { 
	position: absolute;
	bottom: -2px; 
	left: 0; 
	width: 100px; 
	height: 2px; 
	background: #ff0000;
}
.current_page_item a { 
	color: white !important; 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>
<div class="nav-wrap">
  <ul class="group" id="example-one">
    <li class="current_page_item">
      <a href="#">Home</a>
    </li>
    <li><a href="#">Buy Tickets</a></li>
    <li><a href="#">Group Sales</a></li>
    <li><a href="#">Reviews</a></li>
    <li><a href="#">The Show</a></li>
    <li><a href="#">Videos</a></li>
    <li><a href="#">Photos</a></li>
    <li><a href="#">Magic Shop</a></li>
  </ul>
</div>

1 个答案:

答案 0 :(得分:2)

这是因为您没有在click事件之后设置魔术线元素的数据属性。

添加以下行:

$magicLine.data("origLeft", _this.position().left)
   .data("origWidth", _this.width());

有关解决方案,请参见以下代码。

$(function() {
  var $el, leftPos, newWidth;
  $mainNav2 = $("#example-two");

  /*
      EXAMPLE ONE
  */

  /* Add Magic Line markup via JavaScript, because it ain't gonna work without */
  $("#example-one").append("<li id='magic-line'></li>");

  /* Cache it */
  var $magicLine = $("#magic-line");

  $magicLine
    .width($(".current_page_item").width())
    .css("left", $(".current_page_item a").position().left)
    .data("origLeft", $magicLine.position().left)
    .data("origWidth", $magicLine.width());

  $("#example-one li").find("a").hover(function() {
    $el = $(this);
    leftPos = $el.position().left;
    newWidth = $el.parent().width();

    $magicLine.stop().animate({
      left: leftPos,
      width: newWidth
    });
  }, function() {
    $magicLine.stop().animate({
      left: $magicLine.data("origLeft"),
      width: $magicLine.data("origWidth")
    });
  });

  $("#example-one > li").click(function() {
    var _this = $(this);
    $("#example-one > li").removeClass('current_page_item');
    _this.parent().addClass('current_page_item');
    // added lines below
    $magicLine.data("origLeft", _this.position().left)
      .data("origWidth", _this.width());
  });
});
* {
  margin: 0;
  padding: 0;
}

body {
  font: 14px Georgia, serif;
  background: #2F2626;
  color: #eee;
}

header {
  padding: 100px 0 0 0;
  display: block;
}

header h1 {
  width: 960px;
  margin: 0 auto;
}

a {
  color: #eee;
}

a:hover {
  color: white;
}

.nav-wrap {
  margin: 50px auto;
  background-color: rgba(0, 0, 0, 0.6);
  border-top: 2px solid white;
  border-bottom: 2px solid white;
}


/* Clearfix */

.group:after {
  visibility: hidden;
  display: block;
  content: "";
  clear: both;
  height: 0;
}

*:first-child+html .group {
  zoom: 1;
}


/* IE7 */


/* Example One */

#example-one {
  margin: 0 auto;
  list-style: none;
  position: relative;
  width: 960px;
}

#example-one li {
  display: inline-block;
}

#example-one a {
  color: #bbb;
  font-size: 14px;
  float: left;
  padding: 6px 10px 4px 10px;
  text-decoration: none;
  text-transform: uppercase;
}

#example-one a:hover {
  color: white;
}

#magic-line {
  position: absolute;
  bottom: -2px;
  left: 0;
  width: 100px;
  height: 2px;
  background: #ff0000;
}

.current_page_item a {
  color: white !important;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="nav-wrap">

  <ul class="group" id="example-one">
    <li class="current_page_item">
      <a href="#">Home</a>
    </li>
    <li><a href="#">Buy Tickets</a></li>
    <li><a href="#">Group Sales</a></li>
    <li><a href="#">Reviews</a></li>
    <li><a href="#">The Show</a></li>
    <li><a href="#">Videos</a></li>
    <li><a href="#">Photos</a></li>
    <li><a href="#">Magic Shop</a></li>
  </ul>

</div>