Введение определенного свойства css приводит к игнорированию других несвязанных свойств

#html #css

#HTML #css

Вопрос:

Я все еще пытаюсь освоить основы css, и я столкнулся со странной проблемой, никогда раньше не использовал SO, поэтому извините, если здесь что-то сделано неправильно

Я пытаюсь создать базовое интерактивное меню pure css3, которое отображает выпадающие неупорядоченные списки при наведении курсора мыши на родительские элементы. Он имеет 3 «уровня глубины», «нулевой» уровень (который включает в себя элемент, который вы можете видеть на самом видном месте), «первый уровень глубины» (который включает в себя первое выпадающее меню с названиями языков) и «второй уровень глубины» (который включает в себя список элементов, которые появляются при наведении курсора мыши на слово javascript в выпадающем меню «первый уровень глубины»)

Проблема в том, что первое выпадающее меню («первая глубина») выглядит немного смещенным по горизонтали относительно элемента «нулевая глубина», который показывает слово «Фреймворки и языки» (это отображается, если вы запускаете первый фрагмент кода), однако, чтобы попытаться исправить это, я добавил свойство «margin-left:-0.05rem;» в первый блок css раздела с надписью «проблемный сегмент» в коде css, но когда я делаю это, по некоторым причинам причина, по которой верхние и левые поля, указанные во втором блоке «проблемного сегмента» указанного css, полностью игнорируются, в результате чего 2-е выпадающее меню отображается в позиции, в которой я этого не хочу (это показано, если вы запустите второй фрагмент кода)

Есть идеи относительно того, что вызывает игнорирование полей, указанных во втором блоке? Я пробовал это в разных браузерах, и это работает одинаково, даже во фрагменте кода SO, я не знаю, чего мне здесь не хватает, afaik, поля не наследуются, но даже если бы они были, второй блок проблемного сегмента должен перезаписать все, что указано в первом блоке

Также приветствуется любая несвязанная критика кода или предложения..

ПЕРВЫЙ ФРАГМЕНТ КОДА

 nav{
  text-align:center;
  background-color:#449944;
}
ul{
  padding:0%;
  list-style-type:none;
  display:inline-block;
  vertical-align:top;
  width:15rem;
}
li{
  background-color:#BBBBBB;
  border:0.5px solid #AAAAAA;
  width:15rem;
  height:1.5rem;
  line-height:1.5rem;
}
ul ul{
  display:none;
}



/*Problem segment*/
li:hover>ul{
  display:block;
  position: absolute;
  margin-left:-0.05rem;
}

ul.second_depth{
  margin-top:-1.55rem;
  margin-left:15rem;
  background-color:white;
}  
 <body>
  <nav>
    <ul class="zeroth_depth">
        <li>Frameworks and Languages
          <br>
          <ul class="first_depth">
              <li>Ruby</li>
              <li>Javascript
                 <br>
                 <ul class="second_depth">
                    <li>vue</li>
                    <li>react</li>
                    <li>angular</li>
                 </ul>
              </li>
              <li>Python</li>
          </ul>  
        </li>
    </ul>
  </nav>
</body>  

ВТОРОЙ ФРАГМЕНТ КОДА

 nav{
  text-align:center;
  background-color:#449944;
}
ul{
  padding:0%;
  list-style-type:none;
  display:inline-block;
  vertical-align:top;
  width:15rem;
}
li{
  background-color:#BBBBBB;
  border:0.5px solid #AAAAAA;
  width:15rem;
  height:1.5rem;
  line-height:1.5rem;
}
ul ul{
  display:none;
}



/*Problem segment*/
li:hover>ul{
  display:block;
  position: absolute;
  margin-left:-0.05rem;
}

ul.second_depth{
  margin-top:-1.55rem;
  margin-left:15rem;
  background-color:white;
}  
 <body>
  <nav>
    <ul class="zeroth_depth">
        <li>Frameworks and Languages
          <br>
          <ul class="first_depth">
              <li>Ruby</li>
              <li>Javascript
                 <br>
                 <ul class="second_depth">
                    <li>vue</li>
                    <li>react</li>
                    <li>angular</li>
                 </ul>
              </li>
              <li>Python</li>
          </ul>  
        </li>
    </ul>
  </nav>
</body>  

Ответ №1:

Поля игнорируются, потому что у вас есть position: absolute . Как только вы это сделаете, элемент будет удален из потока, а поля (смещение от контейнера) станут несколько бессмысленными.

Для позиционирования меню используйте left и top вместо margin-left и margin-top .

 nav{
  text-align:center;
  background-color:#449944;
}
ul{
  padding:0%;
  list-style-type:none;
  display:inline-block;
  vertical-align:top;
  width:15rem;
}
li{
  background-color:#BBBBBB;
  border:0.5px solid #AAAAAA;
  width:15rem;
  height:1.5rem;
  line-height:1.5rem;
}
ul ul{
  display:none;
}



/*Problem segment*/
li:hover>ul{
  display:block;
  position: absolute;
  margin-left:-0.05rem;
}

ul.second_depth{
  top:1.55rem;
  left:15rem;
  background-color:white; /* since the `li` elements have backgrounds, you'll never see this */
}  
 <body>
  <nav>
    <ul class="zeroth_depth">
        <li>Frameworks and Languages
          <br>
          <ul class="first_depth">
              <li>Ruby</li>
              <li>Javascript
                 <br>
                 <ul class="second_depth">
                    <li>vue</li>
                    <li>react</li>
                    <li>angular</li>
                 </ul>
              </li>
              <li>Python</li>
          </ul>  
        </li>
    </ul>
  </nav>
</body>  

Обратите внимание, что я инвертировал значение top , поскольку предполагал, что вы хотите, чтобы меню отображалось справа от пункта меню, дочерним элементом которого оно является.

Обратите также внимание, что это background-color:white не будет видно, поскольку дочерние li элементы уже имеют другое background-color значение.

Комментарии:

1. О, хм, понятно, я думал, что они могут работать, поскольку они казались прекрасными, пока я не добавил другое поле, спасибо, что указали на это. Вы оставили «margin-left» в первом блоке «проблемного сегмента», это было намеренно? что касается «цвета фона», упс ха-ха, я намеревался удалить это, но забыл, спасибо, что также указали на это