出于用户体验的目的,如何使 CSS 菜单的悬停状态水平移动?

Posted

技术标签:

【中文标题】出于用户体验的目的,如何使 CSS 菜单的悬停状态水平移动?【英文标题】:How can I make my CSS menu's hover states move horizontally for UX purposes? 【发布时间】:2013-11-12 09:32:45 【问题描述】:

如何使我的菜单的悬停状态“红色淡出”以自然运动的方式水平移动(如图片中的示例)?

这是我在jsFiddle 中制作的菜单,旨在尝试学习如何降低运动。我正在尝试模拟http://www.fullyillustrated.com/ 菜单在其悬停状态时的工作方式,蓝色条跟随鼠标到下一个链接,并且导航栏图像的图像发布在下面。

#menu 
   background: #181818;
   height: 120px;
   width: 500px;

#menu .center 
   display: table;
   height: 120px;
   width: 500px;

#menu ul.menu-center 
   display: table-cell;
   vertical-align: middle;

#menu ul li 
   display: inline;

#menu li a 
   color: #FFF;
   padding: 0 50px 0 50px;
   height: 120px;

#menu li a:hover 
   background: red;
   transition: .25s linear;
   -webit-transition: .25s linear;
   -moz-transition: .25s linear;
   padding: 50px 50px 50px 50px;

【问题讨论】:

【参考方案1】:

我认为您要实现的目标必须使用 javascript 来完成...只是为了确保我知道您在问什么:

您有一个栏,当您将鼠标悬停在导航中的链接上时,它会以动画方式显示为活动锚点,并且与锚点大小相同。

这是我创建的小提琴,用于展示我认为你在问什么:

http://jsfiddle.net/Dm9Eu/2/

如果您在访问 Full Illustrated 时查看浏览器的网络检查器,您会看到导航有一个装订线元素,其中包含一个 span#highlight,它是包含锚点的导航 ul 的全宽。

当您将鼠标悬停在锚点上时,span#highlight 的左侧位置会发生变化。

您可以使用 javascript 设置一个函数,在悬停时获取锚点的左侧位置,在 span#highlight 上设置该位置并使用 css3 您可以将转换设置为“左”,它应该模拟您想要的效果。

html

<div id="header">
<ul id="menu">
    <li><a href="#">Home</a></li>
    <li><a href="#">About</a></li>
    <li><a href="#">Portfolio</a></li>
</ul>
<div id="gutter">
    <span id="highlight"></span>
</div>    
</div>

CSS:

#header 
    position: relative;

#menu 
    width: 100%;
    height: 120px;
    background: #181818;
    list-style: none;
    margin: 0;
    padding: 0;


#menu li 
    margin: 0;
    padding: 0;
    float: left;

#menu li a 
    color: #FFF;
    margin: 0;
    padding: 50px;
    display: block;


#highlight 
    position: absolute;
    top: 0;
    left: 0;
    height: 5px;
    background: #f00;
    transition: all .5s;

JS:

var doc = 文档;

var anchors = doc.getElementById('menu').getElementsByTagName('a');
var highlight = doc.getElementById('highlight');

for(var i = 0, len = anchors.length; i < len; i++) 
    anchors[i].addEventListener('mouseover', function(e) 
        var target = e.target;
        highlight.style.width = target.offsetWidth + 'px';
        highlight.style.left = target.offsetLeft + 'px';
    );

    anchors[i].addEventListener('mouseout', function(e) 
        var target = e.target;
        var storeNeg = '-' + highlight.style.width;
        console.log(storeNeg);
        highlight.style.left = storeNeg;
    );

只是一些注意事项:

我是用 vanilla JS 做的,所以如果你关心浏览器的兼容性,你可以使用像 jQuery

我会用js在页面上注入gutter,因为如果js被禁用了,就不需要了。

希望能帮助/回答您的问题!

【讨论】:

谢谢!我以为你只能通过 CSS3 做到这一点,非常感谢。很抱歉回复晚了。昨晚我的网络中断了,然后又恢复了。 嗨“chaseadamsio”,如何给它主动? @Kiran 你在问如何将活动类应用于元素? 谁能帮我找到这个 mouseover 事件内部target.className += " active";mouseout target.className.replace(/ active/, ''); 这就是你要的吗?【参考方案2】:

我不确定我是否准确地回答了这个问题,但是,这里是:

在这里提琴:http://jsfiddle.net/xcRGR/4/

#menu li a 
  color: #FFF;
  padding: 50px 0 50px 0; <- amended
  margin: 0 50px 0 50px; <- New
  display: inline-block; <- NEW

#menu li a:hover 
  background: red;
  transition: .25s linear;
  -webit-transition: .25s linear;
  -moz-transition: .25s linear;
  padding: 50px 50px 50px 50px; <- amended
  margin: 0; <- NEW
  width: auto;

我基本上在按钮上添加了一些边距,将填充更改为水平而不是垂直,并转换了边距,因此边距(水平)的减少被填充的增加所占据。

【讨论】:

以上是关于出于用户体验的目的,如何使 CSS 菜单的悬停状态水平移动?的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的子菜单在 jQuery 悬停菜单中保持打开状态?

如何保持悬停的菜单项处于打开状态,以便我可以使用 firebug 编辑它的样式?

你如何使css中悬停的区域更大

如何使 CSS3 悬停过渡只运行一次,而不是在用户“取消悬停”后“倒带”?

如何在悬停时获得实际的 DOM CSS 宽度? [复制]

问题:单击关闭按钮会使下方的移动菜单按钮处于悬停状态