Вопрос по позиционированию css/js

180
01 февраля 2018, 19:57

Насколько я знаю свойство position: fixed позиционируется относительно объекта window то есть окна браузера. Вопрос в следующем: как можно спозиционировать элемент таким образом чтобы он был будто fixed относительно нужного блока на странице (допустим колонки сайдбара). Знаю такой баг - если у нужного контейнера поиграться с transform: translate; и дочернему элементу этого контейнера дать position: fixed то позиционироваться он будет будто у него position: absolute. Но мне нужно чтобы это была такая себе иммитация fixed, чтобы элемент был в рамках viewport пока он над ним.

Заранее прошу прощения что так сумбурно объяснил суть вопроса, но лучше сформулировать пока что не могу.

Answer 1

В зависимости от того, какая нужна поддержка Если Ие, и всякая шушера не нужна, то вот вам вариант position: sticky;

.fixed {
  position: sticky;
  top: 0;
}

https://codepen.io/anon/pen/jZPQEG

если нет, то только js. Вот, самый простой вариант, с установкой top

var $aside = $('.aside'),
    $main_fixed = $('.fixed'),
    aside_fixed_height = $aside.outerHeight(true) - $main_fixed.outerHeight(true),
    main_fixed_position_top = $aside.position().top,
    this_top = 0,
    this_top_end = 0;
$(window)
  .resize(function(){
    aside_fixed_height = $aside.outerHeight(true) - $main_fixed.outerHeight(true),
    main_fixed_position_top = $aside.position().top;
  })
  .scroll(function(){
    this_top = $(this).scrollTop();
    this_top_end = this_top - main_fixed_position_top;
    if(this_top_end < 0) {
      this_top_end = 0;
    }
    if(this_top_end > aside_fixed_height) {
      this_top_end = aside_fixed_height;
    }
    $main_fixed.css( 'top', this_top_end);
  });

https://codepen.io/anon/pen/NyqOwN

Answer 2

$(window).on('scroll', function() { 
  var outer = $('.outer'), 
    inner = $('.inner'); 
  //console.log(outer.offset().top, $(window).scrollTop()); 
  if ($(window).scrollTop() >= outer.offset().top && $(window).scrollTop() <= outer.offset().top + outer.height() - inner.height()) { 
    inner.css('top', $(window).scrollTop() - outer.offset().top) 
    console.log($(window).scrollTop(), outer.offset().top) 
  } else if ($(window).scrollTop() < outer.offset().top) { 
 
    inner.css('top', 0) 
  } 
});
body { 
  height: 2000px; 
  padding: 250px 0; 
} 
 
.outer { 
  height: 500px; 
  background: orange; 
  position: relative; 
} 
 
.inner { 
  height: 50px; 
  width: 50px; 
  position: absolute; 
  left: 0; 
  top: 0; 
  background: darkblue; 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<div class="outer"> 
  <div class="inner"> 
  </div> 
</div>

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

READ ALSO
Slick slider или как фиксить баг свойства centerMode?

Slick slider или как фиксить баг свойства centerMode?

Доброго времени суток! Есть некоторые баги slick-слайдера, возможно кто-то стыкался или подскажет как это обойтиКак всё обустроено: Делаю слайдер...

526
проверка полей на заполненость

проверка полей на заполненость

Ребят доброй ночи! Подскажите , пишу проверку полей на заполненность в табах, нужно что бы пока поля не заполнены нельзя было переключаться...

216
Скрипт вставки данных popup в textarea по клику

Скрипт вставки данных popup в textarea по клику

Как сделать, чтоб при нажатии на кнопку

161
Удалить параметр запроса Angular 5

Удалить параметр запроса Angular 5

Как сделать переход на страницу текущую, но без одного из параметров? Например из wwwexpample

200