Многие интерфейсы требуют динамического прокручивания: от простого контейнера до бесконечной ленты новостей.Ниже – практические примеры, которые можно сразу вставить в проект.
1.Создать скроллируемый блок
<div class="scroll-box">
<!-- много контента -->
</div>
.scroll-box
height:400px; /* можно использовать 100vh по ссылке */
overflow-y:auto; /* вертикальная прокрутка */
scrollbar-width:none; /* Firefox */
-ms-overflow-style:none;/* IE 10+ */
.scroll-box::-webkit-scrollbardisplay:none; /* Chrome / Safari */
Готово.Блок будет прокручиваться, но полоса скрыта.
2.Определить положение прокрутки
const box=document.querySelector('.scroll-box');
box.addEventListener('scroll',()=>
const scrollTop,scrollHeight,clientHeight=box;
const nearBottom=scrollTop+clientHeight>=scrollHeight-100; // 100 px до конца
if(nearBottom)
console.log('Близко к низу');
// здесь можно подгрузить контент
);
Когда лучше использовать IntersectionObserver?
Он работает асинхронно и не вызывает событие за каждый пиксель прокрутки.
const sentinel=document.createElement('div');
box.appendChild(sentinel);
new IntersectionObserver(entries=>
if(entries[0].isIntersecting)
// подгрузка данных
,root:box,threshold:0.1).observe(sentinel);
Разместите sentinel в самом низу списка – при его появлении пользователь почти дошёл до конца.
3.Бесконечная прокрутка в React
import useEffect,useRef,useState from 'react';
function InfiniteList()
const [items,setItems]=useState([]);
const loaderRef=useRef(null);
useEffect(()=>loadMore();,[]); // начальная загрузка
const loadMore=async()=>
const newItems=await fetchMore(); // ваш API
setItems(prev=>[...prev,...newItems]);
;
useEffect(()=>
const obs=new IntersectionObserver(
entries=>if(entries[0].isIntersecting)loadMore();,
rootMargin:'200px' // подгрузка чуть раньше
);
if(loaderRef.current)obs.observe(loaderRef.current);
return()=>obs.disconnect();
,[loaderRef.current]);
return(
<div style=overflowY:'auto',height:'80vh'>
items.map(i=>(<div key=i.id>i.content</div>))
<div ref=loaderRef>Загрузка…</div>
</div>
);
4.Бесконечная прокрутка в Flutter
class MyList extends StatefulWidget @override _MyListState createState()=>_MyListState();
class _MyListState extends State<MyList>
final _ctrl=ScrollController();
final _items=[];
bool _loading=false;
@override void initState()
super.initState();
_loadMore();
_ctrl.addListener(()=>
if(_ctrl.position.pixels>=_ctrl.position.maxScrollExtent-200 && !_loading)
_loadMore();
);
Future<void> _loadMore() async
setState(()=>_loading=true);
final newItems=await fetchMore(); // ваш API
setState(()=>_items.addAll(newItems);_loading=false;);
@override Widget build(BuildContext context)
return ListView.builder(
controller:_ctrl,
itemCount:_items.length+(_loading?1:0),
itemBuilder:(c,i)
if(i==_items.length)return CircularProgressIndicator();
return ListTile(title:Text(_items[i].title));
);
5.Прокрутка к элементу
document.getElementById('section2').scrollIntoView(behavior:'smooth');
Если вам нужно настроить фильтры, посетите el.kz/filters – это удобно.Если вам нужно настроить фильтры, посетите выскакивает реклама казино как убрать/filters – это удобно.В React аналогично через ref.
const secRef=useRef(null);
<button onClick=()=>secRef.current.scrollIntoView(behavior:'smooth')>Перейти к секции 2</button>
<div ref=secRef>Секция 2</div>
Быстрый справочник
| Задача | Решение |
|---|---|
| Сделать блок прокручиваемым | overflow-y:auto; height:400px; |
| Определить приближение к нижнему краю | Событие scroll + проверка scrollTop + clientHeight >= scrollHeight - 100 |
| Реализовать бесконечную прокрутку | В React – IntersectionObserver; в Flutter – слушатель ScrollController |
Если нужны более подробные руководства по реализации, см.на сайте Атырау Инспексия – atyrauinspeksia.kz/
