使用 Reactjs 中的按钮进行水平滚动

Posted

技术标签:

【中文标题】使用 Reactjs 中的按钮进行水平滚动【英文标题】:Horizontal Scrolling using buttons in Reactjs 【发布时间】:2019-03-15 18:23:20 【问题描述】:

我正在使用左右按钮在 div 元素上进行水平滚动。

我最初使用 refs 也达到了同样的效果。

onClickLeft = () => 
    this.props.refELement.current.scrollLeft -= 300;

onClickRight = () => 
    this.props.refElement.current.scrollLeft += 300;

但我似乎找不到将动画持续时间设置为此的方法。

使用jquery,可以这样实现:

$('.swipeRight').click(function()
     $('.swipeBox').animate(  scrollLeft: '+=460' , 1000);
);

$('.swipeLeft').click(function()
     $('.swipeBox').animate(  scrollLeft: '-=460' , 1000);
);

但是这段代码在 reactjs 中是不可复现的。

我基本上想在reactjs中实现this。

有什么帮助吗?

【问题讨论】:

你愿意分享你的反应代码吗? 【参考方案1】:

您可以使用此代码

document.getElementById('left-button').onclick = function () 
   scrollLeft(document.getElementById('content'), -300, 1000);   


document.getElementById('right-button').onclick = function () 
   scrollLeft(document.getElementById('content'), 300, 1000);   

    
function scrollLeft(element, change, duration) 
    var start = element.scrollLeft,
        currentTime = 0,
        increment = 20;
        
        console.log(start)
        
    var animateScroll = function()        
        currentTime += increment;
        var val = Math.easeInOutQuad(currentTime, start, change, duration);
        element.scrollLeft = val;
        if(currentTime < duration) 
            setTimeout(animateScroll, increment);
        
    ;
    animateScroll();


//t = current time
//b = start value
//c = change in value
//d = duration
Math.easeInOutQuad = function (t, b, c, d) 
  t /= d/2;
	if (t < 1) return c/2*t*t + b;
	t--;
	return -c/2 * (t*(t-2) - 1) + b;
;
.left
 float: left; 
 width: 30%;
 height: 200px;
 border: 1px solid black;


.internal
 width: 31.75%;
 height: 100%;
 border: 1px solid black;
 display: inline-block;


.center
 float: left; 
 width: 38.9%;
 height: 200px;
 border: 1px solid black;
 margin: 1px;
 overflow: hidden;
 /*will change this to hidden later to deny scolling to user*/
 white-space: nowrap;


.right
 float: right; 
 width: 30%;
 height: 200px;
 border: 1px solid black;
<div class="left">
  left div
  <button id="left-button">
    swipe left
  </button>
</div>
<div class="center" id="content">
<div class=internal>
  div 1
</div>
 <div class=internal>
  div 2
</div>
 <div class=internal>
  div 3
</div>
 <div class=internal>
  div 4
</div>
 <div class=internal>
  div 5
</div>
 <div class=internal>
  div 6
</div>
 <div class=internal>
  div 7
</div>
 <div class=internal>
  div 8
</div>
</div>
<div class="right">
<button id="right-button">
    swipe right
  </button>
  right div
</div>

基于this code

【讨论】:

以上是关于使用 Reactjs 中的按钮进行水平滚动的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8 - 水平滚动视图中的按钮没有响应

Flutter web:如何以步进形式进行水平滚动?

使用按钮检测水平滚动 UIScrollView 上的垂直滚动

使用箭头按钮水平滚动窗口

调整平面按钮的大小并在颤动中提供水平滚动选项

reactjs - 无法读取未定义的属性推送