导航菜单中的下划线转换

时间:2015-09-17 04:39:16

标签: javascript html css css3 css-transitions

我不知道这是不是一个愚蠢的问题。我只是想知道是否有更好的或更新的教程,以便下划线在悬停并保持点击链接时从一个链接滑动到另一个链接。

到目前为止,我从Underline transition in menu找到了这个很好的教程,它似乎使用了Css-only Lavalamp-like Fancy Menu Effect中的教程。

我仍然对codepen

中的代码存在一些问题
  1. 由于我能够指定下划线的宽度,因此我无法将下划线置于链接下方,因为该位置是绝对的。我可以通过使用左侧元素来居中它,但它需要试验和错误才能找到正确的数字。因此,如果可能的话,我希望使用margin:0 auto或text-align:center。

  2. 除了wordpress导航菜单之外,我无法想到任何其他内容,所以我想知道你是否有任何提示。

  3. HTML

    <div class="width">
    <nav class="ph-line-nav">
        <a href="#">News</a>
        <a href="#">Activities</a>
        <a href="#">Search</a>
        <a href="#">Time</a>
        <div class="effect"></div>
    </nav>
    </div>
    

    CSS

    .width {
      width: 700px;
      margin: 0 auto;
    }
    nav {
        margin-top:20px;
        font-size: 110%;
        display: table;
        background: #FFF;
        overflow: hidden;
        position: relative;
        width: 100%;
    }
    nav a {
        text-align:center;
        background: #FFF;
        display: block;
        float: left;
        padding: 2% 0;
        width: 25%;
        text-decoration: none;
        color: /*#555*/black;
        transition: .4s;
        color: /*#00ABE8*/ red;
      /*border-right: 1px solid red;
      border-left: 1px solid red;*/
    }
    /* ========================
        Lava-lamp-line:
       ======================== */
     .effect {
        position: absolute;
        left: 0;
        transition: 0.4s ease-in-out;
    }
    nav a:nth-child(1).active ~ .effect {
        left: 0%;
        /* the middle of the first <a> */
    }
    nav a:nth-child(2).active ~ .effect {
        left: 25%;
        /* the middle of the second <a> */
    }
    nav a:nth-child(3).active ~ .effect {
        left: 50%;
        /* the middle of the third <a> */
    }
    nav a:nth-child(4).active ~ .effect {
        left: 75%;
        /* the middle of the forth <a> */
    }
    .ph-line-nav .effect {
        width: /*55px*/ 25%;
        height: 2px;
        bottom: 5px;
        background: /*#00ABE8*/black;
        margin-left:/*-45px*/auto;
        margin-right:/*-45px*/auto;
    }
    

    JS

    $(document).ready(function() {
        $('.ph-line-nav').on('click', 'a', function() {
            $('.ph-line-nav a').removeClass('active');
            $(this).addClass('active');
        });
    });
    

    除非绝对必要,否则我并不十分关心javascript,所以从某种意义上说,我想尽可能使用css-only教程。无论如何,如果事实证明这是一个愚蠢的问题,我会很快删除这个问题......

    更新:这是我想要的:example然而,它有javascript ....但我想它毕竟不重要?

2 个答案:

答案 0 :(得分:0)

我认为这就是你需要的

HTML:

<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>

CSS:

    /* 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: black; 
}
#magic-line { 
    position: absolute;
    bottom: -2px; 
    left: 0; 
    width: 100px; 
    height: 2px; 
    background: #fe4902;
}
.current_page_item a { 
    color: black !important; 
}
.ie6 #example-one li, .ie7 #example-one li { 
    display: inline; 
}
.ie6 #magic-line {
    bottom: -3px;
}

Jquery的:

$(function() {

    var $el, leftPos, newWidth,
        $mainNav = $("#example-one");

    $mainNav.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 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")
        });    
    });
});

JSFiddle

答案 1 :(得分:0)

你需要一些数学,因为你正在使用绝对定位元素(效果分类div)。如果您使用任何CSS预处理器(我更喜欢Sass),它很容易完成。但是如果你想使用普通的CSS,你应该手动对每个“nth-child”这样做。 (您也可以使用javascript轻松完成此操作)

CSS WAY

您的布局宽度为700px。并且其内部的每个锚(nav a)标签具有25%的宽度。所以您的锚点宽度为175px。 (700 * 0.25) 你需要用固定宽度下划线,这是55px。

.ph-line-nav .effect {
    width: 55px;
    height: 2px;
    bottom: 5px;
    background: /*#00ABE8*/black;
}

如果你的主动锚是第一个,那么你的下划线必须是60px。

(175 - 55)/ 2 = 60

60px(空格)+ 55px(下划线)+ 60px(空格)

nav a:nth-child(1).active ~ .effect {
    left: 60px;
}

第二个你必须使用175 + 60 = 235px。

nav a:nth-child(2).active ~ .effect {
    left: 235px;
}

你有公式,对吧?

left = (nth-child - 1) * 175 + 60

所以,

nth-child(3)=(3 - 1)* 175 + 60 = 410

nth-child(4)=(4 - 1)* 175 + 60 = 585

更新:我看到你使用jquery。然后;

JQUERY WAY

var layoutWidth = 700,
    underlineWidth = 55,
    menuCount = 4,
    menuWidth = layoutWidth / menuCount, //175px
    leftSpace = (menuWidth - underlineWidth) / 2; //60px

$('.ph-line-nav .effect').css('width', underlineWidth);

for(var i = 1; i < menuCount + 1; i++) {
    var left = (i - 1) * menuWidth + leftSpace; 
    $('nav a:nth-child(' + i + ').active ~ .effect').css('left', left)
}

更改underlineWidth和/或menuCount变量时,将以编程方式计算它们。