Свернуть / развернуть меню боковой панели с помощью JavaScript, HTML и CSS

Узнайте, как свернуть / развернуть меню боковой панели, используя только JavaScript, HTML и CSS. В этом уроке мы создадим полностью отзывчивое меню боковой панели, которое можно развернуть и свернуть с помощью кнопки. Это часто встречается на современных административных панелях.

Используя CSS и JS, мы сделаем наше боковое меню потрясающим и функциональным с поисковой строкой/всплывающим окном. Я также протестировал и закодировал для отзывчивых медиа-запросов, поэтому оно работает не только на настольных компьютерах, но и на мобильных телефонах, так что ваша боковая панель может отлично выглядеть на протяжении всего проекта. Имейте в виду, что это учебник только для внешнего вида, но вы можете использовать его как основу для навигации всего проекта.

Посмотреть на YouTube

Структура папок

index.html
/images
   avatar.jpg
   logo.png
   mobile.svg
/sass
   style.scss
/js
   init.js
/css (generated by Sass)
   style.css
   style.min.css
Вход в полноэкранный режим Выход из полноэкранного режима

Наш HTML

HTML этого учебника очень прост. По сути, у нас есть боковая панель с верхней и нижней частью, затем основная для содержимого страницы. В этом уроке не будет использоваться BootStrap для стилизации, но мы будем использовать иконки, поэтому убедитесь, что вы используете либо их иконки, добавив ссылку на таблицу стилей иконок bootstrap, либо добавив свои собственные.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Collapse / Expand Sidebar Tutorial</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.8.3/font/bootstrap-icons.css">
    <link rel="stylesheet" href="/css/style.min.css">
</head>
<body>
    <div class="container">
        <div class="sidebar">
            <div class="sidebartop">
                <div class="logo">
                    <img src="/images/logo.png" alt="">
                </div>
                <div class="logo-mobile">
                    <img src="/images/mobile.svg" alt="">
                </div>
                <div class="menu">
                    <i class="bi bi-list"></i>
                </div>
            </div>
            <div class="search">
                <form action="">
                    <button type="submit" class="callSearch"><i class="bi bi-search"></i></button><input type="text" placeholder="Search" class="searchInput">
                </form>
            </div>
            <nav>
                <ul>
                    <li><a href="#"><i class="bi bi-speedometer"></i><span class="text">Dashboard</span></a></li>
                    <li><a href="#"><i class="bi bi-file-earmark"></i><span class="text">Pages</span></a></li>
                    <li><a href="#"><i class="bi bi-pencil-square"></i><span class="text">Posts</span></a></li>
                    <li><a href="#"><i class="bi bi-people"></i><span class="text">Users</span></a></li>
                    <li><a href="#"><i class="bi bi-gear"></i><span class="text">Settings</span></a></li>
                </ul>
            </nav>
            <div class="account">
                <div class="avatar">
                    <img src="/images/avatar.jpg" alt="">
                </div>
                <div class="name">
                    <h4>The DevDrawer</h4>
                    Adminstrator
                </div>
                <div class="logout">
                    <a href="#"><i class="bi bi-box-arrow-left"></i></a>
                </div>
            </div>
        </div>
        <div class="main">
            [page content here]
        </div>
    </div>
    <div class="searchWindow">
        <button type="button" class="cancelSearch"><i class="bi bi-x"></i></button>
        <h2>Search Our Site</h2>
        <form action="">
            <input type="text" placeholder="Enter your text">
            <button type="submit">Search</button>
        </form>
    </div>
    <script src="/js/init.js"></script>
</body>
</html>
Вход в полноэкранный режим Выход из полноэкранного режима

Наш базовый Sass

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

Стилей очень много, но следующие должны помочь вам начать работу с размещением и компоновкой. Я использую шрифт Open Sans, поэтому я импортирую его непосредственно из Google Fonts.

Пожалуйста, имейте в виду, что у меня есть аддон Sass в моем VS Code, который помогает генерировать style.css и style.min.css, на которые есть ссылки в HTML-коде. Вы можете скачать его здесь, если у вас его еще нет: https://marketplace.visualstudio.com/items?itemName=glenn2223.live-sass.

@import url('https://fonts.googleapis.com/css2?family=Open+Sans&display=swap');

$primary-color:#333;
$white: #fff;

body {
    color:$primary-color;
    padding:0;
    margin:0;
    position: relative;
    min-height:100vh;
    overflow:hidden;
    font-family: 'Open Sans', sans-serif;
    font-size:14px;
}

.container {
    display:flex;
    flex-flow:row wrap;
    .sidebar {
        background-color:$primary-color;
        color:$white;
        width:30%;
        height:100%;
        padding:0 1rem;
        position: fixed;
        top:0;
        left:0;
        transition: width .10s ease-in-out;
        a {
            color:$white;
            text-decoration: none;
        }
        .sidebartop{
            display:flex;
            flex-direction: row;
            justify-content: space-between;
            align-items: flex-start;
            padding-top:1rem;
            height:55px;
            .logo {
                width:70%;
                img {
                    height:auto;
                    width:100%;
                }
            }
            .menu {
                width:20%;
                text-align:end;
                i {
                    cursor:pointer;
                    font-size:1.75rem;
                }
            }
            .logo-mobile {
                display:none;
            }
        }
        .search {
            display:flex;
            flex-direction:row;
            justify-content: space-between;
            align-items: flex-start;
            position: relative;
            margin:1rem 0;
            button {
                cursor:pointer;
                width:auto;
                background-color:transparent;
                border:0;
                color:$white;
                position: absolute;
                font-size:1.25rem;
                left:1.5rem;
                top:50%;
                transform: translate(-50%, -50%);
            }
            input {
                background-color:lighten($primary-color, 5%);
                border:0px;
                padding:1rem;
                border-radius: .5rem;
                width:calc(100% + 1rem);
                &::placeholder {
                    padding-left:1.5rem;
                }
            }
        }
        nav {
            ul {
                padding:0;
                margin:0;
                list-style:none;
                li {
                    display:block;
                    align-items:center;
                    padding:1.25rem 0;
                    position: relative;
                    background-color:transparent;
                    transition: background-color .25s ease-in-out;
                    a {
                        display:block;
                        i {
                            font-size:1.25rem;
                        }
                        .text {
                            position: relative;
                            left:1rem;
                            top:-.2rem;
                        }
                    }
                }
            }
        }
        .account {
            display:flex;
            justify-content: space-between;
            align-content:center;
            align-items:center;
            width:calc(100% - 2rem);
            position: absolute;
            bottom:1rem;
            .avatar {
                margin-right:1rem;
                width:20%;
                img {
                    border-radius:50%;
                    height:50px;
                    width:50px;
                }
            }
            .name {
                flex: 1 1 auto;
                h4 {
                    padding:0;
                    margin:0;
                }
            }
            .logout {
                flex: 1 1 auto;
                text-align: end;
                i {
                    font-size:1.5rem;
                }
            }
        }
    }
    .main {
        margin-left:calc(30% + 2rem);
        padding:1rem;
    }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Наш JS

Наш JS — это то, что добавляет или удаляет наш короткий класс. По сути, он берет щелчок по меню и добавляет класс body, который показывает боковую панель свернутой или развернутой. Вы можете запустить приведенный ниже код, и вы увидите, как новый класс добавляется в тело HTML.

ПРИМЕЧАНИЕ: Вы еще не увидите изменений в стилях, потому что мы не добавили класс short в наш Sass, но вы должны увидеть добавление класса.

ПРИМЕЧАНИЕ: JS ниже также добавляет локальный элемент хранения, чтобы сохранить выбранное состояние боковой панели для пользователя.

const menu = document.querySelector(".menu"); // get menu item for click event

menu.addEventListener("click", function () {
    expandSidebar();
    showHover();
    getSearch();
});

/**
 * expand sidebar if it is short, otherwise collapse it
 */
function expandSidebar() {
    document.querySelector("body").classList.toggle("short");
    let keepSidebar = document.querySelectorAll("body.short");
    if (keepSidebar.length === 1) {
        localStorage.setItem("keepSidebar", "true");
    } else {
        localStorage.removeItem("keepSidebar");
    }
}

/**
 * show hover effect on sidebar
 */
function showHover() {
    const li = document.querySelectorAll(".short .sidebar li a");
    if (li.length > 0) {
        li.forEach(function (item) {
            item.addEventListener("mouseover", function () {
                const text = item.querySelector(".text");
                text.classList.add("hover");
            });
            item.addEventListener("mouseout", function () {
                const text = item.querySelector(".text");
                text.classList.remove("hover");
            });
        });
    }
}

/**
 * get search button click if short sidebar or mobile
 */
function getSearch() {
    document.querySelector(".callSearch").addEventListener("click", function (e) {
        e.preventDefault();
        if (
            document.querySelector("body").classList.contains("short") ||
            window.innerWidth <= 844
        ) {
            document.querySelector(".searchWindow").classList.toggle("active");
        }
    });
    document
        .querySelector(".cancelSearch")
        .addEventListener("click", function () {
            document.querySelector(".searchWindow").classList.toggle("active");
        });
}

/**
 * check local storage for keep sidebar
 */
function showStoredSidebar() {
    if (localStorage.getItem("keepSidebar") === "true") {
        document.querySelector("body").classList.add("short");
        showHover();
        getSearch();
    }
}

showStoredSidebar(); // show sidebar if stored in local storage

Вход в полноэкранный режим Выход из полноэкранного режима

Добавление нашего короткого класса в Sass

Теперь, когда мы добавили короткий класс в тело HTML, нам нужно придать ему стиль. Поэтому откройте файл style.scss и добавьте в его нижнюю часть (за пределами текущего CSS) следующее.

Этот класс будет обрабатывать вид свертывания/развертывания, а также скрывать ненужные элементы в боковой панели.

.short {
    .sidebar {
        width:5%;
        text-align:center;
        .logo, .searchInput, .text, .avatar, .name {
            display:none;
        }
        .sidebartop {
            display:block;
            height:75px;
            .logo-mobile {
                display:none;
            }
            .menu {
                width:100%;
                text-align:center;
            }
        }
        .text.hover {
            display: block !important;
            background-color:rgba(255,255,255,.9);
            color:$primary-color;
            padding:.5rem;
            box-shadow: 1px 1px 5px 0 rgba(0,0,0,.25);
            position: absolute;
            left:3rem;
            top:1rem;
            border-radius:.25rem;
        }
        .account {
            display:block;
            .logout {
                width:100%;
                text-align:center;
            }
        }
        .search {
            margin:1.75rem -.2rem;
        }
    }
    .main {
        margin-left:calc(5% + 2rem)
    }
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Кроме того, теперь вы должны иметь возможность навестись на иконки на свернутой боковой панели, чтобы увидеть связанный с ними наведенный текст.

Всплывающее окно поиска

В приведенном выше JS мы добавили функцию поиска, которая на тот момент не использовалась, но теперь нам нужно создать всплывающее окно при нажатии на значок поиска на свернутой боковой панели, поскольку сам поиск недоступен с этого экрана.

Итак, сначала добавим Sass для корректного отображения всплывающего окна.

.searchWindow{
    position: fixed;
    height:100vh;
    width:100vw;
    background-color:rgba(51,51,51,.9);
    z-index:1;
    top:0;
    padding:1rem;
    text-align:center;
    color:$white;
    padding-top:20vh;
    display:none;
    input {
        background-color:darken($white, 25%);
        border:0px;
        padding:1rem .5rem;
        border-radius:.5rem;
        width:60vw;
        &::placeholder {
            padding-left:.5rem;
        }
    }
    button {
        background-color:transparent;
        border:2px solid $white;
        font-size:1rem;
        padding:1rem 2rem;
        color:$white;
        border-radius: .5rem;
        cursor:pointer;
        &.cancelSearch {
            border:0px;
            font-size:2rem;
            position: absolute;
            top:0;
            right:2vw;
        }
    }
    &.active {
        display:block;
    }
}

Вход в полноэкранный режим Выход из полноэкранного режима

Теперь, используя вышеприведенную функцию JS и CSS, вы должны увидеть всплывающее окно поиска при нажатии на иконку поиска на свернутой боковой панели.

Мобильная стилизация

Наконец, нам нужно добавить мобильную стилизацию. Этот стиль не охватывает все типы мобильных устройств, но вы должны быть в состоянии использовать его, чтобы охватить, по крайней мере, iPhone. Вы можете изменить стили для других размеров экрана.

Ниже мы рассмотрим вертикальный и горизонтальный вид на телефоне.

@media (max-width:844px) {
    .container {
        .sidebar {
            width:5%;
            text-align:center;
            .logo, .searchInput, .text, .avatar, .name {
                display:none;
            }
            .sidebartop {
                display:block;
                height:auto;
                .logo-mobile {
                    display:block;
                    img {
                        height:auto;
                        width:80%
                    }
                }
                .menu {
                    display:none;
                }
            }
            nav {
                ul {
                    li {
                        padding:0;
                        a {
                            padding:0.6rem 0;
                        }
                    }
                }
            }
            .account {
                display:block;
                .logout {
                    width:100%;
                    text-align:center;
                }
            }
            .search {
                margin:1.5rem -.2rem;
            }
        }
        .main {
            margin-left:calc(5% + 2rem)
        }
    }
}

@media (max-width:390px) {
    .container {
        .sidebar {
            width:8%;
            nav {
                ul {
                    li {
                        padding:0;
                        a {
                            padding:2rem 0;
                        }
                    }
                }
            }
            .search {
                margin-top:4rem;
                margin-bottom:3rem;
                margin-left:-.5rem;
            }
        }
        .main {
            margin-left:calc(8% + 2rem)
        }
    }
    .searchWindow{
        padding:0;
        padding-top:10vh;
        input {
            width:calc(100% - 2rem);
        }
        button {
            width:calc(100% - 1rem);
            margin-top:.5rem;
        }
    }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Заключение

Теперь вы должны закончить работу над кодом, и у вас должна быть сворачиваемая и разворачиваемая боковая панель, которая хранит ваши настройки в локальном объекте хранения и работает на мобильных устройствах. Удачи.

Оцените статью
devanswers.ru
Добавить комментарий