Испытание [28/28] 100% оцените, пожалуйста, код :)

HTML

<!DOCTYPE html>
<html lang="ru">
    <head>
        <meta charset="utf-8">
        <title>Испытание: многоуровневое меню</title>
    </head>
    <body>
        <ul class="main-menu">
            <li><a href="/demos">Демонстрации</a></li>
            <li class="opened">
                <a href="/courses">Курсы</a>
                <ul class="sub-menu">
                    <li><a href="/courses/4">Знакомство</a></li>
                    <li><a href="/courses/42">Селекторы</a></li>
                    <li><a href="/courses/45">Позиционирование</a></li>
                </ul>
            </li>
            <li><a href="/public_profiles">Участники</a></li>
            <li><a href="/achievments">Достижения</a></li>
            <li><a href="/profile">Профиль</a></li>
        </ul>
    </body>
</html>

CSS

html, 
body {
    margin: 0;
    padding: 0;
}
body {
    width: 380px;
    min-height: 280px;
    padding: 10px;
    font-family: "Arial", sans-serif;
    font-size: 14px;
    line-height: 1.4;
    background: #ecf0f1;
}
.main-menu {
    padding: 0;
    margin: 0;
    width: 200px;
}
.main-menu li {
    list-style: none;
}
.main-menu > li {
    position: relative;
}
.main-menu a {
    display: block;
    text-decoration: none;
    color: #ffffff;
    padding: 10px 15px;
}
.main-menu > li > a {
    background: #2980b9;
    border-bottom: 2px solid #2c3e50;
}
.main-menu .opened > a {
    background: #1abc9c;
}
.main-menu .sub-menu {
    position: absolute;
    z-index: 10;
    left: 180px;
    top: 0px;
    width: 200px;
    padding: 0;
}
.main-menu > .opened > .sub-menu li a {
    background: #1abc9c;
    border-bottom: 2px solid #2ecc71;
}

P.S. Прошу подсказать, как можно упростить код. Целью было уменьшить код и объединить как можно больше общих свойств. И на сколько подобный код будет удобен для изменений в будущем?

В Вашем коде ошибка:
2018-07-03_222354
В мёртвой зоне пункты меню не выбираются.

Сможете починить, или подсказать из-за чего так получилось?

1 лайк

Да, спасибо, нашел ошибку. Забыл обнулить внутренние отступы у саб-меню. Ну и далее просто изменил координату left на 180px. Только я не понял, откуда прилетели отступы. Мы же для всего .main-menu обнуляли все отступы.

1 лайк

Для .main-menu они и обнулились, но не все свойства передаются потомкам по наследству.
Для .sub-menu нужно отступы обнулять принудительно.

2 лайка

Спасибо большое, в закладки :slight_smile:

Оживить меню, :hover добавить не хотите?

Я понимаю, в чем моя проблема. После попытки добавить :hover всем ссылкам отрабатывает только основное меню (саб-меню и .opened - нет). Не !important же им задавать, плохой тон вроде как. Не могу отследить и постоянно теряюсь в приоритетах css свойств. Не можете посоветовать, как решить эту проблему?
UPD.

.main-menu a:hover {
    background: orange;
}
.main-menu > .opened > .sub-menu li a:hover {
    background: orange;
}

Вот так работает, но пахнет костылем.

.main-menu > li > a:hover {    /* только для основного меню */
    background: orange;
}
.main-menu .sub-menu a:hover { /* только для выпадающего */
    background: orange;
}

В .main-menu .sub-menu добавляем display: none; чтобы скрыть выпадающее меню

Добавляем ещё одно правило:

.main-menu li:hover .sub-menu {  /* показать выпадающее меню */
    display: block;    
}

Чтобы пройти проверку закомментируйте display: none;

1 лайк

А, Вы не только про подсветку говорили, но и про выпадающее меню. Я Вас не понял просто. В Вашем варианте ховер для саб-меню не отрабатывает.