【问题标题】:Simple CSS responsive touch menu issue with anchor link带有锚链接的简单 CSS 响应式触摸菜单问题
【发布时间】:2015-01-17 09:16:30
【问题描述】:

根据本网站http://osvaldas.info/drop-down-navigation-responsive-and-touch-friendly 上给出的代码,很容易创建一个简单的 CSS 下拉菜单,它具有响应性并且适用于触摸设备。

但是,代码包含指向导航的锚链接,因此如果导航不在页面顶部(而我的不在 - 上面有一个徽标),浏览器会向下滚动到导航。这令人不安,而不是我想要的。必须有一种方法可以在不向下滚动浏览器的情况下使其工作?

我已将代码放在 JSF Fiddle 此处 http://jsfiddle.net/Ltebg0ah/ 及以下。

问题与此有关(来自 Osvaldas 网站的文本): CSS 伪选择器 :target 可以轻松切换菜单,因为锚点的 href 属性与 CSS ID 选择器名称一致。因此,您可能已经理解,#nav > a 的第一个锚点负责显示,第二个锚点负责隐藏菜单。

<div class="header"></div>  

<nav id="nav">
<a href="#nav" title="Show navigation">Menu</a>
<a href="#" title="Hide navigation">Close Menu</a>
    <ul>
        <li><a href="index.html">Home</a></li>
        <li><a href="workshops.html">Workshops</a></li>
        <li><a href="about.html">About</a></li>
        <li><a href="news.html">News</a></li>
        <li><a href="contact.html">Contact</a></li>
    </ul>
</nav>

<div class="content">



 .header {
 height:200px;
background-color:brown;
 }

.content {
height:1000px;
background-color:green;
 }


#nav > a
{
    display: none;
}


#nav
{
    position: relative;
}
    #nav > a
    {
    }
    #nav:not( :target ) > a:first-of-type,
    #nav:target > a:last-of-type
    {
        display: block;
    }

/* first level */

#nav > ul
{
    height: auto;
    display: none;
    position: absolute;
    left: 0;
    right: 0;
}
    #nav:target > ul
    {
        display: block;
    }
    #nav > ul > li
    {
        width: 100%;
        float: none;
    }

【问题讨论】:

  • 这是不可能的,因为当#nav 为目标时菜单会打开。不使用JS是不可能做到的。

标签: css


【解决方案1】:

浏览器向下移动的原因是因为您为下拉菜单指定了一个锚点,其 ID 为 #nav。浏览器假定一旦点击它就应该关注 ID 为#nav 的部分。使其向下滚动到该 div。

您需要使用 JavaScript 来获得您想要的功能。您还可以使用名为 Bootstrap 的出色 HTML 框架,它具有该功能以及更多功能,可以让您的开发体验更加轻松。它很轻巧,并具有大量功能。

您可以查看我的JSFIddle,使用Bootstrap查看此功能

我希望这会有所帮助。

【讨论】:

  • 链接可能会转到标题 div 上的锚点(位于页面顶部),同时保留伪选择器 :target 来切换菜单。也许在导航 div 上使用一个类......我刚刚试了一下,但无法让它工作。似乎切换/目标仅在链接到#nav div时才有效 - 即如果两者共享相同的选择器名称。
  • 无论你把导航菜单放在哪里,浏览器仍然会关注那个div。使用您当前的代码,您无法真正将其移动到任何地方以使其不以这种方式运行。您只需要使用 JavaScript 或使用已经解决此类问题的框架。
  • 请参阅我的JSFiddle,了解如何使用Bootstrap 完成此操作。
  • 感谢您的帮助。我会研究 Bootstrap,但作为一个刚接触编码的人,我更喜欢自己编写它,所以我知道发生了什么。
【解决方案2】:

您可以在没有 Javascript 的情况下轻松完成此操作。只需使用一个复选框和 2 个通过 id 附加到它的标签。这样你就可以使用 :checked 伪选择器在纯 css 中完成。

http://jsfiddle.net/Ltebg0ah/3/

 .header {
     height:200px;
    background-color:brown;
     }

.content {
    height:1000px;
    background-color:green;
     }


#nav
    {
        display: none;
    }
        #nav ~ label
        {
            display: none;
        }
        #nav:not( :checked ) ~ label:first-of-type,
        #nav:checked ~ label:last-of-type
        {
            display: block;
        }
 
    /* first level */
 
    #nav ~ ul
    {
        opacity: 0;
        position: absolute;
        left: 0;
        right: 0;
        transition-duration: 0.4s;
    }
        #nav:checked ~ ul
        {
            opacity: 1;
        }
        #nav ~ ul > li
        {
            width: 100%;
            float: none;
        }
<div class="header"></div>	

<nav>
    
    <input type="checkbox" id="nav" />
    <label for="nav">Show nav</label>
    <label for="nav">Hide nav</label>
		<ul>
			<li><a href="index.html">Home</a></li>
			<li><a href="workshops.html">Workshops</a></li>
			<li><a href="about.html">About</a></li>
			<li><a href="news.html">News</a></li>
			<li><a href="contact.html">Contact</a></li>
		</ul>
</nav>


<div class="content"></div>	

【讨论】:

  • 我还添加了一个漂亮的小 css 过渡,以获得更流畅的用户体验。您可以将其清除并替换为您的 display: none vs display: block 方法。
  • 为什么会有人投反对票?这是一个非常优雅的问题解决方案。在这里,从语义上来说,复选框甚至还不错。此外,在许多需要 JS 的情况下,使用 :checked 会有所帮助。
  • 我今天不能专注于这个,但是你所做的似乎有效,解决了问题,看起来很优雅,并且避免了我不得不使用 JS(我对此一无所知)。谢谢(不是我投了反对票)
  • 波浪线符号是什么意思:#nav ~ label ?
  • ~ 是同级选择器,是 CSS3 的一部分。它选择同一 DOM 节点级别上的元素。这些元素不必是相邻的兄弟姐妹,但它们必须具有相同的父级。 sitepoint.com/web-foundations/…
猜你喜欢
  • 1970-01-01
  • 2017-09-08
  • 2018-08-22
  • 1970-01-01
  • 1970-01-01
  • 2018-03-23
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多