Проверьте, отображается ли элемент на экране

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

Проблема в том, что кнопка сама по себе не работает и что меню активируется при нажатии на экран, поэтому моя попытка проверить, виден ли div или нет, я также пытался использовать функцию с getBoundingClientRect();, что предлагают многие, но я остался с document.body.contains(MyElement). Это мой JavaScript:

function myFunction(x) {
        x.classList.toggle("change");
        document.getElementById("dropdown-meniu-content").classList.toggle("show");}
 $(document).click(function(event) { 
    if ( document.body.contains(document.getElementById('dropdown-meniu-content') ) ) {
        if (!$(event.target).closest('#dropdown-meniu-content').length) {
        document.getElementById("dropdown-meniu-content").classList.toggle("show");
                    document.getElementById("buton-meniu").classList.toggle("change");
        }        
}

}); CSS:

    .logo {
            float: left;
            margin-top: 10px;
            margin-left: 5px;
            width: 200px;
            height: 100px;
        }
        .meniu {
            float: right;
            width: auto;
        }
        .buton-meniu {
            display: block;
            cursor: pointer;
            width: 35px;
            margin-right: 30px;
            margin-top: 40px;
        }
        .bar1, .bar2, .bar3 {
            width: 35px;
            height: 5px;
            background-color: black;
            margin: 6px 0;
            transition: 0.4s;
        }
        .change .bar1 {
            -webkit-transform: rotate(-45deg) translate(-9px, 6px);
            transform: rotate(-45deg) translate(-9px, 6px);
        }
        .change .bar2 {
            opacity: 0;
        }
        .change .bar3 {
            -webkit-transform: rotate(45deg) translate(-8px, -8px);
            transform: rotate(45deg) translate(-8px, -8px);
        }
        .dropdown-meniu {
            position: relative;
            display: inline-block;
        }
        .dropdown-meniu-content {

            top: 110px;
            position: fixed;
            background-color: #d6d6d6;
            width: 30%;
            max-width: 10000px;
            height: 100%;
            box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
            z-index: 1;
            overflow: hidden;
            right: 0;
            transform: translateX(100%);
            transition: transform 0.5s ease;
        }
        .show {
            transform: translateX(0%);
        }

И HTML:

<div class = "meniu">
        <div class = "dropdown-meniu">
            <div id = "buton-meniu" class = "buton-meniu" onclick = "myFunction(this)">
                <div class = "bar1"></div>
                <div class = "bar2"></div>
                <div class = "bar3"></div>
            </div>
            <div id = "dropdown-meniu-content" class = "dropdown-meniu-content">
                <div class = "dropdown-ferestre">
                    <div id = "buton-ferestre" class = "buton-ferestre">Ferestre</div>
                    <div id = "dropdown-ferestre-content" class = "dropdown-ferestre-content">
                        <p id = "demo"></p>
                    </div>
                </div>
            </div>
        </div>
    </div>

Если вы не хотите просматривать код, JSFiddle находится здесь: https://jsfiddle.net/1qrtb424/18/

Спасибо за помощь!

Итак, вы хотите, чтобы меню отображалось только при нажатии на button-meniu, а меню при щелчке мышью в любом месте документа скрывать?

xuhaib 18.04.2018 15:40

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

TakeDown 18.04.2018 15:41
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
135
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Я хотел меньше переделывать ваш javascript, но мне потребовалось немного времени, чтобы запомнить решение проблемы распространения (нажатие кнопки также по умолчанию считается щелчком по документу, если вы не добавляете event.stopPropagation), и это было проще для меня переписать. Однако те же принципы могут быть применены в вашем решении.

Между прочим, это очень хороший переход от бургера к кнопке x.

var button = document.querySelector('#buton-meniu');
var content = document.querySelector('#dropdown-meniu-content');

button.addEventListener('click', function(e) {
  e.stopPropagation();
  e.currentTarget.classList.toggle('change');
  content.classList.toggle('show');
}, true)

document.addEventListener('click', function() {
  if (content.classList.contains('show')) {
    content.classList.remove('show');
    button.classList.remove('change');
  }
})

content.addEventListener('click', function(e) {
  e.stopPropagation();
})
.logo {
            float: left;
            margin-top: 10px;
            margin-left: 5px;
            width: 200px;
            height: 100px;
        }
        .meniu {
            float: right;
            width: auto;
        }
        .buton-meniu {
            display: block;
            cursor: pointer;
            width: 35px;
            margin-right: 30px;
            margin-top: 40px;
        }
        .bar1, .bar2, .bar3 {
            width: 35px;
            height: 5px;
            background-color: black;
            margin: 6px 0;
            transition: 0.4s;
        }
        .change .bar1 {
            -webkit-transform: rotate(-45deg) translate(-9px, 6px);
            transform: rotate(-45deg) translate(-9px, 6px);
        }
        .change .bar2 {
            opacity: 0;
        }
        .change .bar3 {
            -webkit-transform: rotate(45deg) translate(-8px, -8px);
            transform: rotate(45deg) translate(-8px, -8px);
        }
        .dropdown-meniu {
            position: relative;
            display: inline-block;
        }
        .dropdown-meniu-content {

            top: 110px;
            position: fixed;
            background-color: #d6d6d6;
            width: 30%;
            max-width: 10000px;
            height: 100%;
            box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
            z-index: 1;
            overflow: hidden;
            right: 0;
            transform: translateX(100%);
            transition: transform 0.5s ease;
        }
        .show {
            transform: translateX(0%);
        }
<div class = "meniu">
        <div class = "dropdown-meniu">
            <div id = "buton-meniu" class = "buton-meniu" >
                <div class = "bar1"></div>
                <div class = "bar2"></div>
                <div class = "bar3"></div>
            </div>
            <div id = "dropdown-meniu-content" class = "dropdown-meniu-content">
                <div class = "dropdown-ferestre">
                    <div id = "buton-ferestre" class = "buton-ferestre">Ferestre</div>
                    <div id = "dropdown-ferestre-content" class = "dropdown-ferestre-content">
                        <p id = "demo"></p>
                    </div>
                </div>
            </div>
        </div>
    </div>

ваше решение работает так, как задумано, и у меня нет никаких скрытых мотивов проверять, отображается ли мое меню. Я подумал, что это будет лучший способ обойти проблему. не могли бы вы указать мне ссылку или руководство по событиям распространения? Я новичок в javascript и очень хочу его изучить (я уже немного знаю C++ и PHP). еще раз спасибо!

TakeDown 18.04.2018 16:05

Я бы хотел, чтобы у меня было направление, куда бы я тебя послал. MDN всегда является моим первым справочником, хотя обычно больше для документов, чем для руководств, но у них есть один: developer.mozilla.org/en-US/docs/Learn/JavaScript/…. FreeCodeCamp обычно довольно хорош, и у них также есть объяснение: medium.freecodecamp.org/…

wassona 18.04.2018 16:08

будет ли W3Schools достаточно хороша? Я изучил у них CSS, HTML и некоторые из PHP, и это кажется хорошим сайтом, но люди говорят, что он устарел и тому подобное.

TakeDown 18.04.2018 16:10

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

wassona 18.04.2018 16:12

большое спасибо за ответ. Я буду использовать оба источника для изучения и, конечно же, переполнение стека, когда я где-то застряну.

TakeDown 18.04.2018 16:24

Другие вопросы по теме