Как не создавать 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); } } })() |
Цитата:
|
Часовой пояс GMT +3, время: 23:41. |