Mob Nav 在 Window 调整大小后消失
Mob Nav Disappears After Window Resize
当我上下切换移动菜单然后调整大小时 window,尽管已声明 "display:block",但我的 Web 菜单不见了。我做错了什么?
CSS:
#nav {
display: none;
}
#toggle {
background-color: #FF9;
width: 100%;
}
#toggle::after {
content: "≡";
float: right;
}
@media only screen and (min-width: 400px) {
#nav {
display: block;
}
#toggle {
display: none;
}
#nav li {
float: left;
}
}
JS:
$(document).ready(function(){
$("#toggle").click(function(){
$("#nav").slideToggle(500);
});
});
HTML:
<div id="toggle">menu</div>
<div id="nav">
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">Products</a></li>
<li><a href="#">Services</a></li>
<li><a href="#">Support</a></li>
<li><a href="#">Contact</a></li>
</ul>
</div>
如果我做对了,我认为这可以帮助你:http://jsfiddle.net/7cL843hk/你需要做的就是在 @media only screen and (min-width: 400px)
中的 #nav 中添加 !important :
#nav {
display: block!important;
}
我认为您遇到了 css 特异性问题。
这是因为无论何时使用 jQuery 进行切换,它都会打印 style="display:block;" 或 style="display:none;" inlined in the html,并且内联样式有一个比外部 css 文件中的特异性更高。
希望对您有所帮助。
正如 Carlos Mateo 已经提到的,您的 CSS 没有足够的 specificity 来克服 jQuery 添加的内联样式。
jQuery 通过直接向元素添加内联样式来隐藏导航;您的 CSS apply 显示了使用 ID 选择器的导航。参考下面的 CSS 特异性图表,请注意内联样式比 ID 选择器具有更高的特异性(强调和粗体是我添加的)。
Selector Types
The following list of selector types is by increasing specificity:
- Universal selectors (e.g., *)
- Type selectors (e.g., h1)
- Class selectors (e.g., .example)
- Attributes selectors (e.g., [type="radio"])
- Pseudo-classes (e.g., :hover)
- ID selectors (e.g., #example)
- Inline style (e.g., style="font-weight:bold")
Source: Specificity @ MDN
Carlos Mateo 的解决方案很简单而且效果很好。如果它适用于您的项目,我强烈推荐它。但是,有些情况下您可能不想使用 !important
. It has its drawbacks, some of which are mentioned here。出于这个原因,我提供了一个替代解决方案。
在我下面的示例中,我使用 jQuery 的 slideToggle()
的回调来删除内联样式并在之后用 CSS class 替换它幻灯片已完成。这使您可以自由地覆盖 CSS 定义,而无需使用 !important
.
注意:使用 "Full Page" 按钮测试媒体查询的操作。
$(document).ready(function() {
$("#toggle").click(function() {
$("#nav").slideToggle(500, function() {
$(this).toggleClass('shown'); /* Toggle "display" class */
$(this).removeAttr('style'); /* Remove style attribute */
});
});
});
#nav {
display: none;
}
#nav.shown {
display: block;
}
#toggle {
background-color: #FF9;
width: 100%;
}
#toggle::after {
content: "≡";
float: right;
}
@media only screen and (min-width: 500px) {
#nav {
display: block;
}
#toggle {
display: none;
}
#nav li {
float: left;
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="toggle">menu</div>
<div id="nav">
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">Products</a></li>
<li><a href="#">Services</a></li>
<li><a href="#">Support</a></li>
<li><a href="#">Contact</a></li>
</ul>
</div>
当我上下切换移动菜单然后调整大小时 window,尽管已声明 "display:block",但我的 Web 菜单不见了。我做错了什么?
CSS:
#nav {
display: none;
}
#toggle {
background-color: #FF9;
width: 100%;
}
#toggle::after {
content: "≡";
float: right;
}
@media only screen and (min-width: 400px) {
#nav {
display: block;
}
#toggle {
display: none;
}
#nav li {
float: left;
}
}
JS:
$(document).ready(function(){
$("#toggle").click(function(){
$("#nav").slideToggle(500);
});
});
HTML:
<div id="toggle">menu</div>
<div id="nav">
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">Products</a></li>
<li><a href="#">Services</a></li>
<li><a href="#">Support</a></li>
<li><a href="#">Contact</a></li>
</ul>
</div>
如果我做对了,我认为这可以帮助你:http://jsfiddle.net/7cL843hk/你需要做的就是在 @media only screen and (min-width: 400px)
中的 #nav 中添加 !important :
#nav {
display: block!important;
}
我认为您遇到了 css 特异性问题。
这是因为无论何时使用 jQuery 进行切换,它都会打印 style="display:block;" 或 style="display:none;" inlined in the html,并且内联样式有一个比外部 css 文件中的特异性更高。
希望对您有所帮助。
正如 Carlos Mateo 已经提到的,您的 CSS 没有足够的 specificity 来克服 jQuery 添加的内联样式。
jQuery 通过直接向元素添加内联样式来隐藏导航;您的 CSS apply 显示了使用 ID 选择器的导航。参考下面的 CSS 特异性图表,请注意内联样式比 ID 选择器具有更高的特异性(强调和粗体是我添加的)。
Selector Types
The following list of selector types is by increasing specificity:
- Universal selectors (e.g., *)
- Type selectors (e.g., h1)
- Class selectors (e.g., .example)
- Attributes selectors (e.g., [type="radio"])
- Pseudo-classes (e.g., :hover)
- ID selectors (e.g., #example)
- Inline style (e.g., style="font-weight:bold")
Source: Specificity @ MDN
Carlos Mateo 的解决方案很简单而且效果很好。如果它适用于您的项目,我强烈推荐它。但是,有些情况下您可能不想使用 !important
. It has its drawbacks, some of which are mentioned here。出于这个原因,我提供了一个替代解决方案。
在我下面的示例中,我使用 jQuery 的 slideToggle()
的回调来删除内联样式并在之后用 CSS class 替换它幻灯片已完成。这使您可以自由地覆盖 CSS 定义,而无需使用 !important
.
注意:使用 "Full Page" 按钮测试媒体查询的操作。
$(document).ready(function() {
$("#toggle").click(function() {
$("#nav").slideToggle(500, function() {
$(this).toggleClass('shown'); /* Toggle "display" class */
$(this).removeAttr('style'); /* Remove style attribute */
});
});
});
#nav {
display: none;
}
#nav.shown {
display: block;
}
#toggle {
background-color: #FF9;
width: 100%;
}
#toggle::after {
content: "≡";
float: right;
}
@media only screen and (min-width: 500px) {
#nav {
display: block;
}
#toggle {
display: none;
}
#nav li {
float: left;
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="toggle">menu</div>
<div id="nav">
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">Products</a></li>
<li><a href="#">Services</a></li>
<li><a href="#">Support</a></li>
<li><a href="#">Contact</a></li>
</ul>
</div>