#html #css
#HTML #css
Вопрос:
Я хочу создать мобильную навигационную панель. Когда на мобильном устройстве (экран <680 пикселей) меню исчезает (скрыто :
ul.topnav li:not(:nth-child(1)){
display: none;
}
И когда я нажимаю на значок выпадающего списка, запускается DropDownMenu(), и он добавляет отзывчивость к имени класса пользовательского интерфейса, а панель навигации отображается вертикально, как показано в коде:
ul.responsive li {
display: inline;
float: none;
}
Это работает, только если я использую ul.topnav.responsive{} . Почему это не работает с ul.responsive{} ??
/* ######## Nav bar ######## */
nav ul {
background-color: #eee;
overflow: hidden;
margin: 0;
padding: 0;
}
ul.topnav li {
list-style: none;
float: left;
}
ul.topnav li.topnav-right{
float: right;
}
ul.topnav li a {
display: block;
text-decoration: none;
min-height: 16px;
text-align: center;
padding: 14px;
text-transform: uppercase;
color: #666;
}
ul.topnav li a:hover{
background-color: #0080ff;
color: #fff;
}
ul.topnav li.dropDownIcon {
display: none;
}
/* ###### Mobile styles ###### */
@media screen and (max-width : 680px) {
ul.topnav li:not(:nth-child(1)){
display: none;
}
ul.topnav li.dropDownIcon {
display: block;
float: right;
}
ul.responsive {
position: relative;
}
ul.responsive li {
display: inline;
float: none;
}
ul.responsive li a {
display: block;
text-align: left;
}
}
<body>
<nav>
<ul class="topnav" id="dropdownClick">
<li><a href="#home">Home</a></li>
<li><a href="#news">News</a></li>
<li><a href="#contact">Contact</a></li>
<li><a href="#about">About</a></li>
<li class="topnav-right"><a href="#singup">Sign Up</a></li>
<li class="topnav-right"><a href="#signin">Sign In</a></li>
<li class="dropDownIcon"><a href="#" onclick="dropdownMenu();">amp;#9776;</a></li>
</ul>
</nav>
<script>
function dropdownMenu() {
var x = document.getElementById("dropdownClick");
if(x.className === "topnav"){
x.className = " responsive";
}else {
x.className = "topnav";
}
}
</script>
</body>
Ответ №1:
Это проблема со спецификацией ваших стилей.
- Во-первых, вы отключаете все
li
элементы на мобильном устройстве. - Затем, после нажатия на меню, вы хотите отобразить
li
элементы.
В настоящее время ваши стили имеют конфликтующие порядки, поэтому они используют правило с наивысшей спецификацией.
Это:
ul.topnav li:not(:nth-child(1)) {
display: none;
}
Имеет большую спецификацию, чем эта:
ul.responsive li {
display: inline;
}
Итак, учитывается первое правило. Когда вы сделали:
ul.topnav.responsive li {
display: inline;
}
Это увеличило специфичность на единицу, так что это работает.
Вы можете найти хороший калькулятор специфичности в Интернете.
Если вы хотите повысить свою специфичность, не добавляя другой класс, вы можете дублировать .responsive
селектор.
ul.responsive.responsive li {
display: inline;
}
Кроме того, пожалуйста, используйте classList.toggle
вместо ручного изменения селекторов.
/* ######## Nav bar ######## */
nav ul {
background-color: #eee;
overflow: hidden;
margin: 0;
padding: 0;
}
ul.topnav li {
list-style: none;
float: left;
}
ul.topnav li.topnav-right{
float: right;
}
ul.topnav li a {
display: block;
text-decoration: none;
min-height: 16px;
text-align: center;
padding: 14px;
text-transform: uppercase;
color: #666;
}
ul.topnav li a:hover{
background-color: #0080ff;
color: #fff;
}
ul.topnav li.dropDownIcon {
display: none;
}
/* ###### Mobile styles ###### */
@media screen and (max-width : 680px) {
ul.topnav li:not(:nth-child(1)){
display: none;
}
ul.topnav li.dropDownIcon {
display: block;
float: right;
}
ul.responsive {
position: relative;
}
ul.responsive.responsive li {
display: inline;
float: none;
}
ul.responsive li a {
display: block;
text-align: left;
}
}
<body>
<nav>
<ul class="topnav" id="dropdownClick">
<li><a href="#home">Home</a></li>
<li><a href="#news">News</a></li>
<li><a href="#contact">Contact</a></li>
<li><a href="#about">About</a></li>
<li class="topnav-right"><a href="#singup">Sign Up</a></li>
<li class="topnav-right"><a href="#signin">Sign In</a></li>
<li class="dropDownIcon"><a href="#" onclick="dropdownMenu();">amp;#9776;</a></li>
</ul>
</nav>
<script>
function dropdownMenu() {
document.getElementById("dropdownClick").classList.toggle("responsive");
}
</script>
</body>
Комментарии:
1. опечатка в первой строке: специфика