Определение в JS высоты блока и сдвиг вниз на эту высоту

12 3
R
На сайте с 01.12.2012
Offline
86
539

Всем привет.

Прошу подсказки.

У меня на странице есть три блока, которые необходимо скрыть при помощи margin-bottom на высоту блока и при наведении мыши чтоб они появлялись. Высота этих блоков может изменяться в зависимости от содержимого. Чтобы узнать высоту блока и скрыть его на это величину, написал небольшой код в js.
$(document).ready(function () {
        const mainBoxNews = document.querySelector('.main-box-news');
        if (mainBoxNews) {
                let num = 0;
                let mbnHeight = [];
                let square = [];
                let numBox;

                for (num; num < 3; num++) {
                        numBox = num + 1;
                        // Узнаём высоту блока
                        mbnHeight[num] = document.querySelector('.ms-box-' + numBox + ' .mbn__shor').offsetHeight;
                        // Смещаем  его вниз на эту величину
                        square[num] = document.querySelector('.ms-box-' + numBox + ' .mbn__shor');
                        square[num].style.marginBottom = '-' + mbnHeight[num] + 'px';
                }

                $('.ms-box-1 a').hover(
                        function () {
                                square[0].style.marginBottom = '0';
                        }, function () {
                                square[0].style.marginBottom = '-' + mbnHeight[0] + 'px';
                        }
                );
                $('.ms-box-2 a').hover(
                        function () {
                                square[1].style.marginBottom = '0';
                        }, function () {
                                square[1].style.marginBottom = '-' + mbnHeight[1] + 'px';
                        }
                );
                $('.ms-box-3 a').hover(
                        function () {
                                square[2].style.marginBottom = '0';
                        }, function () {
                                square[2].style.marginBottom = '-' + mbnHeight[2] + 'px';
                        }
                );
        }
});

Данный код всё работает, но при попытке добавить в цикл for функцию, которая меняет значение margin-bottom при наведении, в консоли появляются ошибки и данный код перестает работать.

Напри мер вот так сделать не получается

$(document).ready(function () {
        const mainBoxNews = document.querySelector('.main-box-news');
        if (mainBoxNews) {
                let num = 0;
                let mbnHeight = [];
                let square = [];
                let numBox;

                for (num; num < 3; num++) {
                        numBox = num + 1;
                        // Узнаём высоту блока
                        mbnHeight[num] = document.querySelector('.ms-box-' + numBox + ' .mbn__shor').offsetHeight;
                        // Смещаем  его вниз на эту величину
                        square[num] = document.querySelector('.ms-box-' + numBox + ' .mbn__shor');
                        square[num].style.marginBottom = '-' + mbnHeight[num] + 'px';

                        $('.ms-box-' + numBox + ' a').hover(
                                function () {
                                        square[num].style.marginBottom = '0';
                                }, function () {
                                        square[num].style.marginBottom = '-' + mbnHeight[num] + 'px';
                                }
                        );
                }

        }
});


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

Может кто подсказать, почему не получается добавить в цикл?

Заранее всем признателен за подсказку.



W1
На сайте с 22.01.2021
Offline
305
#1
Radrigo :
необходимо скрыть при помощи margin-bottom

Почему именно  margin-bottom?

Radrigo :
$(document).ready(function () {         
    const mainBoxNews = document.querySelector('.main-box-news');

Что за винегрет? Вы не знаете селекторов jQuery?

Radrigo :
в консоли появляются ошибки и данный код перестает работать

Ну так смотрите ошибки и исправляйте код.

Мой форум - https://webinfo.guru –Там я всегда на связи
R
На сайте с 01.12.2012
Offline
86
#2
webinfo #:

Почему именно  margin-bottom?

Не принципиально. Просто решил сделать так и оно работает.

R
На сайте с 01.12.2012
Offline
86
#3
webinfo #:

Что за винегрет? Вы не знаете селекторов jQuery?

Я новичок и только учусь. Таким образом решил сделать проверку по классу. Если он есть в наличии, тогда данный код будут выполняться. Это неправильно?

R
На сайте с 01.12.2012
Offline
86
#4
webinfo #:

Ну так смотрите ошибки и исправляйте код.

Если бы знал как исправить, здесь не спрашивал бы.

При наведении мыши на блоке появляется куча подобных ошибок

"Uncaught TypeError: square[num] is undefined"
W1
На сайте с 22.01.2021
Offline
305
#5
Radrigo #:
Это неправильно?

Мне просто стало интересно, зачем Вы используете обычный JS при подключенном  jQuery. Обычно используют либо то, либо другое, если нет особой необходимости в перемешивании. Если учитесь - то пожалуйста.

W1
На сайте с 22.01.2021
Offline
305
#6
Radrigo #:
"Uncaught TypeError: square[num] is undefined"

Используйте var при объявлении переменной, если пока не понимаете область видимости.

А вообще, все эти манипуляции с массивами непонятны, если Вы нигде больше не используете эти массивы. Проще оперировать обычными переменными.

R
На сайте с 01.12.2012
Offline
86
#7
webinfo #:

Используйте var при объявлении переменной, если пока не понимаете область видимости.

А вообще, все эти манипуляции с массивами непонятны, если Вы нигде больше не используете эти массивы. Проще оперировать обычными переменными.

К сожалению var не помогла. Такая же ошибка. Массивы используют для того, чтобы не создавать для каждого блока отдельные переменные. Например с высотой блоков: mbnHeight1, mbnHeight2 и т.п.. Не совсем понимаю, как это сделать без массивов в цикле
$(document).ready(function () {
                var num = 0;
                var mbnHeight = [];
                var square = [];
                var numBox;

                for (num; num < 3; num++) {
                        numBox = num + 1;
                        // Узнаём высоту блока
                        mbnHeight[num] = document.querySelector('.ms-box-' + numBox + ' .mbn__shor').offsetHeight;
                        // Смещаем  его вниз на эту величину
                        square[num] = document.querySelector('.ms-box-' + numBox + ' .mbn__shor');
                        square[num].style.marginBottom = '-' + mbnHeight[num] + 'px';

                        $('.ms-box-' + numBox + ' a').hover(
                                function () {
                                        square[num].style.marginBottom = '0';
                                }, function () {
                                        square[num].style.marginBottom = '-' + mbnHeight[num] + 'px';
                                }
                        );
                }

});
W1
На сайте с 22.01.2021
Offline
305
#8
Radrigo #:
Не совсем понимаю, как это сделать без массивов в цикле

Так же, как Вы поступаете с numbox.

T7
На сайте с 19.09.2018
Offline
63
#9
Radrigo #:
Я новичок и только учусь.

$ на помойку. Попробуйте пойти по такому пути.

    document.querySelectorAll('.mbn__shor').forEach (
      e => {
        const a = e.querySelector('a');
        if (a) {
            a.addEventListener('mouseover', ev=>{
              console.log('mouseover',
                e, // элемент .mbn__shor
                a, // элемент а в .mbn__shor
                ev, // event
                ev.target.parentNode.previousSibling,
                ev.target.parentNode.previousElementSibling,
                ev.target.parentNode.nextSibling,
                ev.target.parentNode.nextElementSibling,
              );
            });

            a.addEventListener('mouseout', ev=>{
              console.log('mouseout', ev.target.offsetWidth);
            });
        }
      });
ф12, и посмотрите, что там чего. В итоге, все получится💪


А jQuery, да лучше на помойку..

R
На сайте с 01.12.2012
Offline
86
#10
timo-71 #:

$ на помойку. Попробуйте пойти по такому пути.

ф12, и посмотрите, что там чего. В итоге, все получится💪


А jQuery, да лучше на помойку..

Что-то не срабатывает ваш код

Имеются примерно таких три блока с классами ms-box-1, ms-box-2 и ms-box-3.

                        <section class="ms-box-1"><a href="/">
                                        <div class="mbn">
                                                <h3>White Keep Assault</h3>
                                                <div class="mbn__shor">Maecenas tempus, tellus eget condimentum rhoncus, sem quam...</div>
                                        </div>
                                </a></section>

Надо чтобы блог с классом mbn__shor был скрыт при загрузке и появлялся при наведении мышки на ссылку. Примерно так.


12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий