Есть ли способ закрыть мою активную панель навигации везде, где я нажимаю на экран?

#javascript #html #jquery #css

#javascript #HTML #jquery #css

Вопрос:

Я создал рабочую панель навигации на рабочем столе (она выглядит как у Apple), но я не знаю, как я могу сделать так, чтобы она закрывалась везде, где я нажимаю на экран, чтобы перейти к панели поиска, когда панель поиска активна. Я погуглил все, но, похоже, ничего не работает, также выполнил проверку элемента на Apple.com , но, похоже, ничего не работает. Также сделал несколько jquery, даже не это. У меня нет никаких предположений о том, что это может быть неправильно.Вот мой код.

 const selectElement = (element) => document.querySelector(element);

selectElement('.mobile-menu').addEventListener('click', () => {
    selectElement('header').classList.toggle('active');
});

function navbar(){
    document.querySelector('html').style.transition = ".2s"
    document.querySelector('html').style.background = "rgba(0,0,0,0.5)"
}

function navbarRemove(){
    document.querySelector('html').style.transition = "0"
    document.querySelector('html').style.background = "none"
    document.getElementById("nav-link").style.transform = "scale(1)";
}
``` 
 *,
*::before,
*::after{
    margin: 0;
    padding: 0;
}

html{
    font-size: 10px;
    font-family: 'SF Pro Display', sans-serif;
}

a{
    display: block;
    text-decoration: none;
}

.container{
    max-width: 98rem;
    margin: 0 auto;
    padding: 0 2.2rem;
}

header{
    position: fixed;
    top: 0;
    z-index: 1400;
    width: 100%;
    height: 4.4rem;
    background-color: rgba(0,0,0,.8);
    backdrop-filter: blur(2rem);
}

.nav-list{
    list-style: none;
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin: 0 -0.5rem;
}

.nav-list-mobile{
    display: none;
}

.nav-link{
    font-size: 1.4rem;
    color: #e4e1e1;
    padding: 0 1rem;
    transition: opacity .5s;
}

.nav-link:hover{
    opacity: .7;
}

.nav-link.hide-item{
    transform: scale(0);
    transition: .5s;
}

.nav-link.active{
    transition: .5s;
    transform: scale(1);
}

.n1.active{
    transition-delay: 0.0005s!important;
}

.n2.active{
    transition-delay: 0.0025s!important;
}

.n3.active{
    transition-delay: 0.005s!important;
}

.n4.active{
    transition-delay: 0.025!important;
}

.n5.active{
    transition-delay: 0.05s!important;
}

.n6.active{
    transition-delay: 0.1s!important;
}

.n7.active{
    transition-delay: 0.15s!important;
}

.n8.active{
    transition-delay: 0.2s!important;
}

.n9.active{
    transition-delay: 0.25s!important;
}

.n10.active{
    transition-delay: 0.3s!important;
}

.n10{
    transition-delay: 0.0005s!important;
}

.n9{
    transition-delay: 0.0025s!important;
}

.n8{
    transition-delay: 0.005s!important;
}

.n7{
    transition-delay: 0.025!important;
}

.n6{
    transition-delay: 0.05s!important;
}

.n5{
    transition-delay: 0.1s!important;
}

.n4{
    transition-delay: 0.15s!important;
}

.n3{
    transition-delay: 0.2s!important;
}

.n2{
    transition-delay: 0.25s!important;
}

.n1{
    transition-delay: 0.3s!important;
}

.nav-link-apple{
    width: 1.6rem;
    height: 3.5rem;
    background: url("img/apple.svg") center no-repeat;
}

.nav-link-search{
    width: 1.6rem;
    height: 4.4rem;
    background: url("img/search.svg") center no-repeat;
    font-size: 1.4rem;
    color: #e4e1e1;
    padding: 0 1rem;
    transition: opacity .5s;
    }
    
    .nav-link-search:hover{
        opacity: .7;
    }

.nav-link-bag{
    width: 1.4rem;
    height: 4.4rem;
    background: url("img/bag.svg") center no-repeat;
}

.searchbox{
    position: absolute;
    top: 0;
    left: 50%;
    transform: translate(-47%, -45%);
    width: 600px;
    height: 44px;
    opacity: 0;
    visibility: hidden;
    transition: .6s;
}

.searchbox.active{
    opacity: 1;
    visibility: visible;
    transition-delay: .6s;
    transform: translate(-50%, -45%);
}

.searchbox input{
    width: 100%;
    height: 44px;
    background: transparent;
    outline: none;
    border: none;
    color: #fff;
    font-size: 18px;
}

.searchbox input:focus{
    outline: none;
    border: none;
}

.close-btn{
    opacity: .7;
    transition: .5s;
}

.close-btn-left{
    position: absolute;
    margin-top: 2rem;
    transform: rotate(45deg);
    width: 1.7rem;
    height: 1px;
    background-color: #979696;
    cursor: pointer;
}

.close-btn-right{
    position: absolute;
    margin-top: 2rem;
    transform: rotate(-45deg);
     width: 1.7rem;
     height: 1px;
     background-color: #979696;
     cursor: pointer;
}

.close-btn:hover{
    opacity: 1.6;
}

.confirm{
    width: 18px;
    height: 18px;
    background: url("img/idkv2.svg") center no-repeat;
    font-size: 1.4rem;
    fill: #e4e1e1;
    border: none;
    outline: none;
    transform: translate(-160%, 180%);
}

@media screen and (max-width: 767px){
    header{
        height: 4.8rem;
        transition: background .36s cubic-bezier(0.32, 0.08, 0.24, 1),
                               height .56s cubic-bezier(0.32, 0.08, 0.24, 1);
    }

    header .container{
        padding: 0;
    }

    .nav-list{
        margin-top: 0;
    }

    .nav-list-mobile{
        display: flex;
    }

    .nav-item{
        width: 4.8rem;
        height: 4.8rem;
        display: flex;
        justify-content: center;
    }

    .nav-item-hidden{
        display: none;
    }

    .mobile-menu{
        position: relative;
        z-index: 1500;
        width: 100%;
        height: 100%;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        cursor: pointer;
    }

    .v2{
        display: none;
    }

    .line{
        position: absolute;
        width: 1.7rem;
        height: 1px;
        background-color: #fff;
        transition: margin-top .3192s cubic-bezier(0.04, 0.04, 0.12, 0.96);
    }

    .line-top{
        margin-top: 4px;
    }

    .line-bottom{
        margin-top: -.8rem;
    }

    .active .line-top{
        margin-top: 0;
        transform: rotate(45deg);
        transition: transform .3192s .1s cubic-bezier(0.04, 0.04, 0.12, 0.96);
    }

    .active .line-bottom{
        margin-top: 0;
        transform: rotate(-45deg);
        transition: transform .3192s .1s cubic-bezier(0.04, 0.04, 0.12, 0.96);
    }

    header.active{
        height: 100%;
        background-color: #000;
    }

    .nav-link-apple{
        width: 1.8rem;
        height: 4.8rem;
        position: relative;
        z-index: 1500;
    }

    .nav-link-bag{
        width: 1.6rem;
        height: 4.8rem;
        transition: opacity 1.5s;
    }

    .nav{
        position: relative;
    }

    .nav-link{
        font-size: 1.7rem;
        padding: 0;
        margin: auto 0;
    }

    .nav-list-larger{
          position: fixed;
          top: 0;
          left: 0;
          width: 0;
          height: 0;
          display: block;
          padding: 10.5rem 5rem;
          z-index: 1000;
          box-sizing: border-box;
          opacity: 0;
          visibility: hidden;
          transition: opacity .3s;
    }

    .active .nav-list-larger{
        width: 100%;
        height: 100vh;
        opacity: 1;
        visibility: visible;
    }

    .active .nav-link-bag{
        opacity: 0;
        transition: opacity .3s;
    }

    .nav-list-larger .nav-item{
        width: 100%;
        justify-content: flex-start;
        border-bottom: 2px solid rgba(255,255,255,.1);
    }

    .nav-list-larger .nav-item:nth-child(9){
        border-bottom: none;
    }

    .active .nav-list-larger .nav-item{
        animation: fadeIn .5s ease-in-out;
    }

    @keyframes fadeIn {
        from{
            opacity: 0;
        }
        to{
            opacity: 1;
        }
    }
}

 @keyframes appear {
     from{
         transform: scale(0);
     }
     to{
         transform: scale(1);
     }
 } 
 ```
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Cubing Website</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <header>
        <div class="container">
            <nav class="nav">
                <ul class="nav-list nav-list-mobile">
                    <li class="nav-item">
                        <div class="mobile-menu">
                            <span class="line line-top"></span>
                            <span class="line line-bottom"></span>
                        </div>
                    </li>
                    <li class="nav-item">
                        <a href="#" class="nav-link nav-link-apple"></a>
                    </li>
                    <li class="nav-item">
                        <a href="#" class="nav-link nav-link-bag"></a>
                    </li>
                </ul>
                <!-- nav list nav mobile -->
                <ul class="nav-list nav-list-larger">
                    <li class="nav-item nav-item-hidden">
                        <a href="index.html" class="nav-link nav-link-apple n1"></a>
                    </li>
                    <li class="nav-item">
                        <a href="#" class="nav-link n2">Mac</a>
                    </li>
                    <li class=" nav-item">
                        <a href="#" class="nav-link n3">iPad</a>
                    </li>
                    <li class="nav-item">
                        <a href="#" class="nav-link n4">iPhone</a>
                    </li>
                    <li class="nav-item">
                        <a href="#" class="nav-link n5">Watch</a>
                    </li>
                    <li class="nav-item" >
                        <a href="#" class="nav-link n6">TV</a>
                    </li>
                    <li class="nav-item">
                        <a href="#" class="nav-link n7">Music</a>
                    </li>
                    <li class="nav-item">
                        <a href="#" class="nav-link n8">Support</a>
                    </li>
                    <li class="nav-item">
                        <a href="#" id="search" onclick="navbar();" class="nav-link nav-link-search n9"></a>
                    </li>
                    <li class="nav-item v2">
                        <a href="#" class="nav-link nav-link-bag n10"></a>
                    </li>
                    <li class="searchbox" id="searchbox">
                        <form>
                        <button class="confirm" disabled></button>
                        <input  type="text" class="search" id="box" placeholder="Search here" autocorrect="off" autocapitalize="off" autocomplete="off" spellcheck="false">
                        <span class="close-btn" onclick="navbarRemove();">
                            <span class="close-btn-left"></span>
                            <span class="close-btn-right"></span>
                        </span>
                        </form>
                    </li>
                </ul>
                <!-- nav list nav mobile -->
            </nav>
        </div>
    </header>
<script src="main.js"></script>
<script src="https://code.jquery.com/jquery-3.5.1.js"></script>
<script type="text/javascript">
    $(document).ready(function(){
        $('#search').click(function(){
            $('.nav-link').addClass('hide-item')
            $('.searchbox').addClass('active')
            $('.nav-link').removeClass('active')
            $('.search').focus();
        })
        $('.close-btn').click(function(){
            $('.nav-link').removeClass('hide-item')
            $('.searchbox').removeClass('active')
            $('.nav-link').addClass('active')
        })
    })
</script>
</body>
</html> 

Помощь была бы очень признательна.

Ответ №1:

Не знаю почему, но прям focus() не работает, наверное, из-за visibility: hidden этого. Но, если вы добавите setTimeout , что это работает отлично и плавно, проверьте это на JSFiddle

Ответ №2:

После тестирования этого, мне кажется .focus() , что is вызывается до того, как ввод снова станет видимым, из-за включенного css-правила transition-delay .searchbox.active . Вы можете попробовать одну из двух вещей, и они оба сработали для меня:

  • Задержите фокусировку:
 setTimeout(function(){
  $('.search').focus();
}, 1000);
 
  • Или удалите visibility: hidden; правило css из .searchbox input {} .
 .searchbox {
    position: absolute;
    top: 0;
    left: 50%;
    transform: translate(-47%, -45%);
    width: 600px;
    height: 44px;
    opacity: 0;
    /* visibility: hidden; */
    transition: .6s;
}

.searchbox.active {
    opacity: 1;
    /* visibility: visible; */
    transition-delay: .6s;
    transform: translate(-50%, -45%);
}