Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.02.2019, 11:32
Интересующийся
Отправить личное сообщение для olifus Посмотреть профиль Найти все сообщения от olifus
 
Регистрация: 06.02.2016
Сообщений: 10

Как не создавать DIV, а присваивать style существующему DIV
Здравствуйте!
Есть плавающий сайдбар, в целом работает как надо, за одним исключением. Пока прокрутка не началась, DIV #sidebar имеет только необходимые вложения кода и прописанный class="", но как только начинается прокрутка, скрипт плавающего сайдбара добавляет внутрь еще один вложенный DIV, которому и прописываются style. Вроде этого:
style="background: rgba(0, 0, 0, 0) none repeat scroll 0% 0%; background-blend-mode: normal; border-block-end: 0px none rgb(0, 0, 0); border-block-start: 0px none rgb(0, 0, 0); border: 0px none rgb(0, 0, 0); border-radius: 0px; border-collapse: separate; border-inline-end: 0px none rgb(0, 0, 0); border-inline-start: 0px none rgb(0, 0, 0); border-spacing: 0px; box-shadow: none; outline: rgb(0, 0, 0) none 0px; outline-offset: 0px; overflow-wrap: normal; overflow: visible; padding-block-end: 0px; padding-block-start: 0px; padding: 0px 15px; padding-inline-end: 15px; padding-inline-start: 15px; box-sizing: border-box; width: 390px; top: -324.5px;"

Визуально это никак не влияет, но вот блок рекламы от РСЯ в момент возникновения дополнительного оборачивания DIV перестает отображаться и его можно увидеть только после обновления страницы.

Как сделать, чтобы style прописывались в родительском блоке DIV, то есть, у которого id="sidebar", а не создавался вложенный DIV?

Скрипт плавающего сайдбара:
(function() {
    var a = document.querySelector('#sidebar'),
        b = null,
        K = null,
        Z = 0,
        P = 55,
        N = 0; // если у P ноль заменить на число, то блок будет прилипать до того, как верхний край окна браузера дойдёт до верхнего края элемента, если у N — нижний край дойдёт до нижнего края элемента. Может быть отрицательным числом
    window.addEventListener('scroll', Ascroll, false);
    document.body.addEventListener('scroll', Ascroll, false);

    function Ascroll() {
        var Ra = a.getBoundingClientRect(),
            R1bottom = document.querySelector('#main').getBoundingClientRect().bottom;
        if (Ra.bottom < R1bottom) {
            if (b == null) {
                var Sa = getComputedStyle(a, ''),
                    s = '';
                for (var i = 0; i < Sa.length; i++) {
                    if (Sa[i].indexOf('overflow') == 0 || Sa[i].indexOf('padding') == 0 || Sa[i].indexOf('border') == 0 || Sa[i].indexOf('outline') == 0 || Sa[i].indexOf('box-shadow') == 0 || Sa[i].indexOf('background') == 0) {
                        s += Sa[i] + ': ' + Sa.getPropertyValue(Sa[i]) + '; '
                    }
                }
                b = document.createElement('div');
                b.className = "stop";
                b.style.cssText = s + ' box-sizing: border-box; width: ' + a.offsetWidth + 'px;';
                a.insertBefore(b, a.firstChild);
                var l = a.childNodes.length;
                for (var i = 1; i < l; i++) {
                    b.appendChild(a.childNodes[1]);
                }
                a.style.height = b.getBoundingClientRect().height + 'px';
                a.style.padding = '0';
                a.style.border = '0';
            }
            var Rb = b.getBoundingClientRect(),
                Rh = Ra.top + Rb.height,
                W = document.documentElement.clientHeight,
                R1 = Math.round(Rh - R1bottom),
                R2 = Math.round(Rh - W);
            if (Rb.height > W) {
                if (Ra.top < K) { // скролл вниз
                    if (R2 + N > R1) { // не дойти до низа
                        if (Rb.bottom - W + N <= 0) { // подцепиться
                            b.className = 'sticky';
                            b.style.top = W - Rb.height - N + 'px';
                            Z = N + Ra.top + Rb.height - W;
                        } else {
                            b.className = 'stop';
                            b.style.top = -Z + 'px';
                        }
                    } else {
                        b.className = 'stop';
                        b.style.top = -R1 + 'px';
                        Z = R1;
                    }
                } else { // скролл вверх
                    if (Ra.top - P < 0) { // не дойти до верха
                        if (Rb.top - P >= 0) { // подцепиться
                            b.className = 'sticky';
                            b.style.top = P + 'px';
                            Z = Ra.top - P;
                        } else {
                            b.className = 'stop';
                            b.style.top = -Z + 'px';
                        }
                    } else {
                        b.className = '';
                        b.style.top = '';
                        Z = 0;
                    }
                }
                K = Ra.top;
            } else {
                if ((Ra.top - P) <= 0) {
                    if ((Ra.top - P) <= R1) {
                        b.className = 'stop';
                        b.style.top = -R1 + 'px';
                    } else {
                        b.className = 'sticky';
                        b.style.top = P + 'px';
                    }
                } else {
                    b.className = '';
                    b.style.top = '';
                }
            }
            window.addEventListener('resize', function() {
                a.children[0].style.width = getComputedStyle(a, '').width
            }, false);
        }
    }
	})()

Последний раз редактировалось olifus, 24.02.2019 в 11:34.
Ответить с цитированием
  #2 (permalink)  
Старый 24.06.2020, 23:26
Аспирант
Отправить личное сообщение для zulfukar Посмотреть профиль Найти все сообщения от zulfukar
 
Регистрация: 10.06.2020
Сообщений: 43

Сообщение от olifus Посмотреть сообщение
Здравствуйте!
Есть плавающий сайдбар, в целом работает как надо, за одним исключением. Пока прокрутка не началась, DIV #sidebar имеет только необходимые вложения кода и прописанный class="", но как только начинается прокрутка, скрипт плавающего сайдбара добавляет внутрь еще один вложенный DIV, которому и прописываются style. Вроде этого:
style="background: rgba(0, 0, 0, 0) none repeat scroll 0% 0%; background-blend-mode: normal; border-block-end: 0px none rgb(0, 0, 0); border-block-start: 0px none rgb(0, 0, 0); border: 0px none rgb(0, 0, 0); border-radius: 0px; border-collapse: separate; border-inline-end: 0px none rgb(0, 0, 0); border-inline-start: 0px none rgb(0, 0, 0); border-spacing: 0px; box-shadow: none; outline: rgb(0, 0, 0) none 0px; outline-offset: 0px; overflow-wrap: normal; overflow: visible; padding-block-end: 0px; padding-block-start: 0px; padding: 0px 15px; padding-inline-end: 15px; padding-inline-start: 15px; box-sizing: border-box; width: 390px; top: -324.5px;"
Здравствуйте. Вы разобрались с этим? У меня та же проблема. Не понимаю откуда вообще берутся эти стили.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обновить содержимое div (или какую функцию вызвать)? unity555 Events/DOM/Window 3 19.12.2017 16:38
Как создать div на чужом сайте? liz2887yoko Элементы интерфейса 0 29.10.2017 03:09
Как правильно обновить div из БД в MVC??? espltd AJAX и COMET 2 11.04.2014 01:28
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
Вывести на печать DIV как его видно в браузере (с учетом фона с стилей) unomomento Элементы интерфейса 4 28.12.2013 00:43