javascript #html #css #reactjs
#javascript #HTML #css #reactjs
Вопрос:
Я пытаюсь медленно перемещать div слева направо, когда пользователь прокручивает вниз. Он должен оставаться в пределах своего раздела и не должен перемещаться влево при прокрутке вверх.
Мне интересно, как это сделать без использования какого-либо внешнего пакета. Это то, что у меня есть до сих пор, но круг заканчивается прокруткой страницы, и мне нужно, чтобы он оставался на правой стороне, как только он туда попал.
<div className="App">
<div className="sectionOne">
<div className="circle styles" style={{ position: 'absolute', left: `${position}rem` }}></div>
</div>
<div className="sectionTwo"></div>
</div>
const [position, setPosition] = useState('70')
function moveCircle() {
const speed = 5
const scrolltop = window.pageYOffset
const scrollAndSpeed = scrolltop / speed
console.log(scrollAndSpeed.toString())
setPosition(scrollAndSpeed.toString())
}
useEffect(() => {
window.addEventListener(
'scroll',
function () {
requestAnimationFrame(moveCircle)
},
false
)
}, [])
Комментарии:
1. Вы могли бы использовать
Math.min( scrollAndSpeed, pageWidth)
, но вам нужно самостоятельно рассчитать ширину страницы2. @GabrielePetrioli Как бы с помощью этого остановить его от перехода вправо? Я рассчитал ширину страницы с помощью window.innerwidth
3. потому что, если
scrollAndSpeed
превышаетpageWidth
, он будет использоватьpageWidth
вместоscrollAndSpeed
. Итак, вы устанавливаете максимальное значение, которое может быть достигнуто для вашегоposition
. Он не может пройти через это.
Ответ №1:
Я только что заметил, что вы используете rem
для позиционирования.
Так Math.min
что это не сработает для этого сценария. Вы можете использовать функцию css clamp
.
style={{ position: 'absolute', left: `clamp(0vw, ${position}rem, 100vw - 1rem)` }}
Обратите внимание, что 1rem
я вставил туда, должна быть ширина .circle
элемента.