16.09.2018, 16:57
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
j0hnik,
давай подождём макета
|
|
16.09.2018, 18:10
|
Интересующийся
|
|
Регистрация: 19.09.2014
Сообщений: 19
|
|
Сообщение от рони
|
EvgenyTryap,
сделайте минимальный макет, иначе можно только гадать.
|
<!DOCTYPE html>
<html>
<head>
<style>
html *{
margin:0;
padding:0;
}
.block{
height: 500px;
}
#content{
height: 1500px;
overflow-y: auto;
}
.wrapper{
height:1500px;
position:relative;
}
.footer{
background:#F00;
height:300px;
border-top: rgb(255, 255, 0) 1px dashed;
}
.sidebar{
height:50px;
position:fixed;
bottom:0;
left:0;
right:0;
background-color:#FF0000;
}
.sidebar.move{
position:absolute;
}
</style>
<script>
window.addEventListener('DOMContentLoaded', function() {
var footer = document.querySelector('.footer'),
sidebar = document.querySelector('.sidebar'),
top, height;
document.addEventListener('scroll', function() {
top = footer.getBoundingClientRect().top;
height = document.documentElement.clientHeight;
sidebar.classList[top < height ? "add" : "remove"]('move');
});
});
</script>
</head>
<body>
<div class="block">
<div id="content">
<div class="wrapper">
<p>Your website content here.</p>
<div class="sidebar">fixed block</div>
</div>
<div class="footer">
<p>footer text</p>
</div>
</div>
</div>
</body>
</html>
Подскажите, пожалуйста, как это реализовать если прокрутка в блоке div (id="content") реализована?
Последний раз редактировалось EvgenyTryap, 16.09.2018 в 19:02.
|
|
16.09.2018, 19:09
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
EvgenyTryap,
не знаю, как это реализовать, плохо знаю css, чтоб сделать фиксированный блок в блоке.
|
|
16.09.2018, 19:51
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
EvgenyTryap,
ниже это не решение, это танцы с бубном ... макет того что требуется сделать, насколько я вас понял.
<!DOCTYPE html>
<html>
<head>
<style>
html *{
margin:0;
padding:0
}
.block{
position: relative;
overflow: hidden;
height: 300px;
width: 600px;
margin: 30px auto
}
#content {
height: 300px;
position: relative;
background-color: #D3D3D3;
overflow-y: auto;
overflow-x: hidden;
}
.wrapper{
height: 1500px;
}
.footer{
background-color: #8B4513;
height:300px;
border-top: rgb(255, 255, 0) 1px dashed;
}
.sidebar{
height:50px;
position: absolute;
top : 250px;
width: 100%;
background-color:#FF0000;
z-index: 100;
}
</style>
<script>
window.addEventListener('DOMContentLoaded', function() {
var footer = document.querySelector('.footer'),
sidebar = document.querySelector('.sidebar'),
content = document.querySelector('#content'),
topFooter = footer.offsetTop, height = content.clientHeight,
heightsidebar = sidebar.clientHeight;
content.addEventListener('scroll', function() {
var scroll = content.scrollTop + height;
var topSidebar = "0";
var position = "relative";
if(topFooter > scroll ){
topSidebar = (scroll - heightsidebar)+ "px";
position = "absolute"
}
sidebar.style.top = topSidebar;
sidebar.style.position = position;
});
});
</script>
</head>
<body>
<div class="block">
<div id="content">
<div class="wrapper">
<p>Your website content here.</p>
</div>
<div class="sidebar">fixed block</div>
<div class="footer">
<p>footer text</p>
</div>
</div>
</div>
</body>
</html>
|
|
16.09.2018, 20:17
|
Интересующийся
|
|
Регистрация: 19.09.2014
Сообщений: 19
|
|
Да, именно это я и пытался сделать!)
|
|
16.09.2018, 21:53
|
|
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
рони, применил position: sticky; к вашему коду
<!DOCTYPE html>
<html>
<head>
<style>
html * {
margin: 0;
padding: 0;
}
.block {
height: 300px;
width: 600px;
margin: 30px auto;
}
#content {
height: 300px;
overflow: auto;
background-color: #D3D3D3;
}
.wrapper {
height: 1500px;
}
footer {
background-color: #8B4513;
height: 300px;
border-top: 1px dashed yellow;
}
.sidebar {
height: 50px;
position: -webkit-sticky; /* Safari */
position: sticky;
bottom: 0;
background-color: red;
}
</style>
</head>
<body>
<div class="block">
<div id="content">
<div class="wrapper">
<p>Your website content here.</p>
</div>
<div class="sidebar">fixed block</div>
<footer>
<p>footer text</p>
</footer>
</div>
</div>
</body>
</html>
Поддержка браузерами очень хорошая caniuse.com/#feat=css-sticky, в супер старых браузерах содержимое всё-равно остаётся доступным
UPD Если нужно, чтобы блок был именно так как с position: sticky? то можно примерно так эмулировать...
<!DOCTYPE html>
<html>
<head>
<style>
html * {
margin: 0;
padding: 0;
}
.block {
height: 300px;
width: 600px;
margin: 30px auto;
}
#content {
height: 300px;
overflow: auto;
background-color: #D3D3D3;
}
.wrapper {
height: 250px;
overflow: auto;
}
footer {
background-color: #8B4513;
height: 300px;
border-top: 1px dashed yellow;
}
.sidebar {
height: 50px;
bottom: 0;
background-color: red;
}
@supports(position: sticky) {
.wrapper {
height: auto;
}
.sidebar {
position: sticky;
}
}
</style>
</head>
<body>
<div class="block">
<div id="content">
<div class="wrapper">
<p style="padding-bottom: 1500px;">
Пусть содержимое длинное...
Your website content here.
</p>
</div>
<div class="sidebar">fixed block</div>
<footer>
<p>footer text</p>
</footer>
</div>
</div>
</body>
</html>
Последний раз редактировалось Malleys, 16.09.2018 в 22:29.
|
|
16.09.2018, 22:05
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
Malleys,
рассматривал этот вариант, в ie не работает, может есть правильная эмуляция (position: sticky или полифил какой для ie?
|
|
17.09.2018, 09:46
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
ок, надо подумать, а реально сделать фиксированный блок в блоке, или position:fixed "выносит" фиксированный блок из блока и нет вариантов?
|
|
14.10.2018, 12:49
|
Интересующийся
|
|
Регистрация: 06.02.2016
Сообщений: 10
|
|
Здравствуйте.
Как убрать дергание/мигание плавающего блока при прокрутке страницы?
$(window).scroll(function() {
var sb_m = 50; /* отступ сверху и снизу */
var mb = 200; /* высота подвала с запасом */
var st = $(window).scrollTop();
var sb = $(".sticky-block");
if (sb.length === 0) return;
var sbi = $(".sticky-block .inner");
var sb_ot = sb.offset().top;
var sbi_ot = sbi.offset().top;
var sb_h = sb.height();
if (sb_h + $(document).scrollTop() + sb_m + mb < $(document).height()) {
if (st > sb_ot) {
var h = Math.round(st - sb_ot) + sb_m;
sb.css({
"paddingTop": h
});
} else {
sb.css({
"paddingTop": 0
});
}
}
});
|
|
24.06.2020, 23:53
|
Аспирант
|
|
Регистрация: 10.06.2020
Сообщений: 43
|
|
Здравствуйте. Установил скрипт _http://sticky01.blogspot.com/2013/09/4.html и все работает. Единственное как только начинаешь прокрутку блока в код блока добавляется лишний div со стилями, которые портят вид блока. Помогите избавиться от них.
Вот код блока
<aside id="aside1">
<span><h5>{blockname}</h5></span>
<div>
{blockcont} // это вывод данных блока (Лента новостей)
</div>
</aside>
<div class="clear"></div>
<style>
.sticky {
position: fixed;
z-index: 101;
}
.stop {
position: relative;
z-index: 101;
}
</style>
<script>
(function(){
var a = document.querySelector('#aside1'), b = null, P = 0; // если ноль заменить на число, то блок будет прилипать до того, как верхний край окна браузера дойдёт до верхнего края элемента. Может быть отрицательным числом
window.addEventListener('scroll', Ascroll, false);
document.body.addEventListener('scroll', Ascroll, false);
function Ascroll() {
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.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 Ra = a.getBoundingClientRect(),
R = Math.round(Ra.top + b.getBoundingClientRect().height - document.querySelector('.blockRows').getBoundingClientRect().top + 30); // селектор блока, при достижении верхнего края которого нужно открепить прилипающий элемент; Math.round() только для IE; если ноль заменить на число, то блок будет прилипать до того, как нижний край элемента дойдёт до футера
if ((Ra.top - P) <= 0) {
if ((Ra.top - P) <= R) {
b.className = 'stop';
b.style.top = - R +'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);
}
})()
</script>
С начала прокрутки в код после <aside id="aside1"> добавляется
<div style="background: rgba(0, 0, 0, 0) none repeat scroll 0% 0%; background-blend-mode: normal; border-block: 0px none rgb(51, 51, 51); border: 0px none rgb(51, 51, 51); border-radius: 0px; border-collapse: separate; border-end-end-radius: 0px; border-end-start-radius: 0px; border-inline: 0px none rgb(51, 51, 51); border-spacing: 0px; border-start-end-radius: 0px; border-start-start-radius: 0px; box-shadow: none; outline: rgb(51, 51, 51) none 0px; outline-offset: 0px; overflow-anchor: auto; overflow-block: visible; overflow-inline: visible; overflow-wrap: normal; overflow: visible; padding-block: 0px; padding: 0px; padding-inline: 0px; box-sizing: border-box; width: 320px;" class="">
сайт: _http://new.313news.net блок справа Лента новостей
Последний раз редактировалось zulfukar, 24.06.2020 в 23:57.
|
|
|
|