跳到内容
新问题

对这个项目有疑问吗?注册一个免费的GitHub帐户以打开一个问题,并联系其维护者和社区。

单击“注册GitHub”,表示您同意我们的服务条款隐私声明。我们偶尔会向您发送与帐户相关的电子邮件。

已经在GitHub上了?登录到您的帐户

根据拖动距离设置滚动速度 #23082

已合并
显示文件树
隐藏文件树
更改自所有提交
提交
文件筛选器

按扩展筛选

按扩展筛选

对话
无法加载注释。
跳转到
跳转到文件
无法加载文件。
差异视图
差异视图
89处变更:87处增加,2处删除 软件包/块编辑器/src/components/block-draggable/index.js
原始文件行号 差异线编号 差异线更改
向上展开 @@ -4,8 +4,42 @@
从“@wordpress/components”导入{Draggable};
从“@wordpress/data”导入{useSelect,useDispatch};
从“@wordpress/element”导入{useEffect,useRef};
从“@wordpress/dom”导入{getScrollContainer};

const BlockDraggable=({children,clientIds,cloneClassname})=>{
常量SCROLL_INACTIVE_DISTANCE_PX=50;
常量SCROLL_INTERVAL_MS=25;
常量PIXELS_PER_SECOND_PER_DISTANCE=5;
恒速_多功能=
像素_PER_SECOND_PER_DISTANCE*(SCROLL_INTERVAL_MS/1000);

函数startScrollingY(nodeRef,velocityRef){
return setInterval(()=>{
if(节点引用当前&&velocityRef.current){
const newTop=nodeRef.current.scrollTop+velocityRef.curren;

节点参考当前滚动({
顶部:newTop,
//行为:“平滑”//似乎会影响性能,最好使用较小的滚动间隔
} );
}
},SCROLL_INTERVAL_MS);
}

函数getVerticalScrollParent(节点){
if(节点===空){
返回null;
}

return getScrollContainer(节点);
}

const BlockDraggable=({
儿童,
客户端ID,
克隆类名称,
在DragStart上,
在DragEnd上,
} ) => {
const{srcRootClientId,索引,isDraggable}=useSelect(
(选择)=>{
常数{
全部展开 @@-30,6+64,14@@const BlockDraggable=({children,clientIds,cloneClassname})=>{
[客户端ID]
);
const isDragging=useRef(false);

//@todo-为水平滚动执行此操作
const dragStartY=useRef(空);
constvelocityY=useRef(空);
const scrollParentY=useRef(空);

const scrollEditorInterval=useRef(null);
复制链接
贡献者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息

你认为有没有办法将逻辑提取到一个专用挂钩中,因为它有点模糊了组件的代码。这样的(或接近的)方法有效吗?

const[onDragStart,onDragOver,onDrageEnd]=使用ScrollOnDrag()

复制链接
贡献者 作者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息

也许 吧。我没有太多的带宽来完善它,所以你可以随意摆弄它,并提出一个更好的替代方案。


const{startDraggingBlocks,stopDragging Blocks}=使用调度(
'核心/块编辑器'
);
全部展开 @@-40,6+82,11@@const BlockDraggable=({children,clientIds,cloneClassname})=>{
if(是Dragging.current){
stopDraggingBlocks();
}

if(scrollEditorInterval.current){
clearInterval(scrollEditorInterval.current);
scrollEditorInterval.current=null;
}
};
}, [] );

全部展开 @@-60,13+107,51@@const BlockDraggable=({children,clientIds,cloneClassname})=>{
cloneClassname={cloneClassname}
elementId={blockElementId}
传输数据={transferData}
onDragStart={()=>{
onDragStart={(事件) => {
startDraggingBlocks();
isDragging.current=true;
dragStartY.current=事件客户端Y;

//查找要滚动的最近父项
scrollParentY.current=getVerticalScrollParent(
document.getElementById(块元素Id)
);
scrollEditorInterval.current=startScrollingY(
滚动家长Y,
速度Y
);
if(onDragStart){
onDragStart();
}
} }
onDragOver={(事件)=>{
const distanceY=事件客户端Y-拖动开始Y.current;
if(距离Y>SCROLL_INACTIVE_DISTANCE_PX){
速度Y电流=
速度_综合*
(距离Y-SCROLL_INACTIVE_DISTANCE_PX);
}else if(距离Y<-SCROLL_INACTIVE_DISTANCE_PX){
速度Y电流=
速度_综合*
(距离Y+SCROLL_INACTIVE_DISTANCE_PX);
}其他{
速度Y.current=0;
}
线条上的注释+128+139
复制链接
贡献者

@塔尔丹 塔尔丹 2020年6月18日

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息

我遇到的一个可用性问题是,如果你从屏幕的顶部或底部拖动,该功能的效率会降低。

当从顶部向下拖动时,如果我想瞄准一个不需要滚动到但更靠近屏幕下部的块,我发现当我向下移动光标时,我会很快滚动过目标。

相反,当从屏幕顶部附近向上拖动时,页面不会滚动得很快,因为我无法将光标向上移动太远。

一个答案可能是根据光标向屏幕边缘移动的百分比(或者可能是滚动容器)进行速度计算,使用伪代码向下移动(我没有考虑到非活动滚动距离):

常数 可移动距离 = 屏幕高度 - 拖动开始Y现在的;
常数 拖动距离 = 事件客户Y - 拖动开始Y现在的;
常数 距离百分比 = 拖动距离 / 可移动距离;
//distancePercentage的值要小得多,因此必须调整VELOCITY_MULTIPLIER。
速度Y现在的 = 速度_综合 * 距离百分比

一个有趣的迭代也可能是尝试简化计算(例如。https://easings.net/#easeInQuart)这样一来,速度一开始就不会太快,但值得一次尝试一件事。

复制链接
贡献者 作者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息

这些都是很好的建议。考虑到这个补丁已经被认为是一个改进,我建议我们将其作为未来工作的门票,并将其合并。这样,我们可以比较多个策略,而不会错过5.5窗口。

复制链接
贡献者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息

@重力轨道我仍然担心可用性,我觉得让页面开始滚动很容易,但很难让它停在正确的位置。

鉴于其他人表示他们对这一变化感到满意,让我们继续努力,并将其作为后续行动加以解决👍

你提到你没有太多时间来做这件事,如果我在后续公关中尝试这个建议会更好吗?

复制链接
贡献者 作者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息

如果你能用你的建议做一个后续公关,我会很高兴。很高兴参加测试。

} }
onDragEnd={()=>{
stopDraggingBlocks();
isDragging.current=false;
dragStartY.current=null;
scrollParentY.current=null;

if(scrollEditorInterval.current){
clearInterval(scrollEditorInterval.current);
scrollEditorInterval.current=null;
}

if(onDragEnd){
onDragEnd();
}
} }
>
{({onDraggableStart,onDraggableEnd})=>{
向下展开
原始文件行号 差异线编号 差异线更改
向上展开 @@-39,7+39,10@@函数块上下文工具栏({focusOnMount,…props}){
aria-label={__(“块工具”)}
{…道具}
>
<区块工具栏/>
<块工具栏
onDragStart={props.onDragStart}
onDragEnd={props.onDragEnd}
/>
</NavigableToolbar>
</div>
);
向下展开
22处变更:19处新增,3处删除 packages/block-editor/src/components/block-list/block-poover.js
原始文件行号 差异线编号 差异线更改
向上展开 @@-31,6+31,7@@功能选择器(选择){
是带格式文本的插入符号,
获取设置,
获取最后一个MultiSelectedBlockClientId,
是拖动块,
}=选择('核心/块编辑器');
返回{
isNavigationMode:isNavigation模式(),
全部展开 @@-40,6+41,7@@功能选择器(选择){
hasMultiSelection:hasMulti Selection(),
hasFixedToolbar:getSettings().hasFixed工具栏,
lastClientId:getLastMultiSelectedBlockClientId(),
isDragging:isDragingBlocks(),
};
}

全部展开 @@-60,6+62,7@@函数块弹出({
具有MultiSelection,
has固定工具栏,
lastClientId,
正在拖动,
}=使用Select(选择器,[]);
const isLargeViewport=useViewportMatch('medium');
const[isToolbarForced,setIsToolbarForzed]=使用状态(false);
向下展开 向上展开 @@-96,7+99,8@@函数块弹出({
! 应该显示面包屑&&
! 应显示上下文工具栏&&
! 是工具栏强制&&
! 显示空块侧插入器
! 显示空块侧面插入器&&
! 正在拖动
) {
返回null;
}
向下展开 向上展开 @@-136,6+140,14@@功能块Popover({
setIsInserterShown(假);
}

函数onDragStart(){
setIsToolbarForced(true);
}

函数onDragEnd(){
setIsToolbarForced(假);
}

//定位在锚的上方,向右弹出,定位在
//左角。对于侧插入器,向左弹出,然后
//位置在右角。
向下展开 向上展开 @@-165,8+177,10@@函数块弹出({
onBlur={()=>设置IsToolbarForced(false)}
应锚包括衬垫
//Popover计算一次宽度。通过重新安装触发重置
//组件。
key={shouldShowContextualToolbar}
//组件。我们包括shouldShowContextualToolbar和isToolbarForced
//键中,以防止在isToolbarForced=true时意外卸载组件,
//例如,在拖放过程中
key={shouldShowContextualToolbar||isToolbarForced}
复制链接
贡献者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息

我无法确定这一改变会产生什么影响,更新评论将是一件好事。

复制链接
贡献者 作者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息

基本上,如果isToolbar强制不是键的一部分,则当应显示上下文工具栏变化。

我会推动一个改变来解释这一点。

复制链接
贡献者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息

@埃拉特里克斯也许我们不再需要这个键了,因为当Popover中的宽度/高度发生变化时,我们会重新计算?

>
{(shouldShowContextualToolbar ||isToolbarForced)&&(
<迪夫
向下展开 向上展开 @@-198,6+212.8@@函数块弹出({
//它应该将工具栏的焦点放在挂载之后。
focusOnMount={isToolbarForced}
数据对齐={align}
onDragStart={onDragStart}
onDragEnd={onDragEnd}
/>
) }
{应显示面包屑(&S)(
向下展开
12处变更:增加10处,删除2处 包/组件/src/draggable/README.md
原始文件行号 差异线编号 差异线更改
向上展开 @@-24,15+24,23@@附加到拖放事件的任意数据对象。

###在DragStart上

拖动开始时要调用的函数。
拖动开始时调用的函数。此回调从“dragstart”事件接收“event”对象作为其第一个参数。

-类型:`Function`
-必需:否
-默认值:`noop`

###onDragOver上

将要拖动的元素拖动到有效的拖放目标上时调用的函数。此回调从`dragover`事件接收`event`对象作为其第一个参数。

-类型:`函数`
-必需:否
-默认值:`noop`

###在DragEnd上

A函数成为拖动结束时调用。
拖动结束时调用的函数。此回调从`dragend`事件接收`event`对象作为其第一个参数

-类型:`函数`
-必需:否
向下展开
20处变更:增加18处,删除2处 包/组件/src/draggable/index.js
原始文件行号 差异线编号 差异线更改
向上展开 @@-38,7+38,11@@class可拖动扩展组件{
event.proventDefault();

this.resetDragState();
this.props.setTimeout(onDragEnd);

//允许从异步代码访问合成事件。
// https://reactjs.org/docs/events.html#event-联营
event.persist();
this.props.setTimeout(onDragEnd.bind(this,event));
}

/**
全部展开 @@-61,6+65,12@@class可拖动扩展组件{
//更新光标坐标。
this.cursorLeft=事件客户端X;
this.cursorTop=事件客户端Y;

const{onDragOver=noop}=this.props;

//“onDragOver”中的“event”不是SyntheticEvent
//因此它不需要`event.persist()`。
this.props.setTimeout(onDragOver.bind(this,event));
}

/**
向下展开 向上展开 @@-150,7+160.10@@class可拖动扩展组件{
document.body.classList.add('is-dragging-components-draggable');
document.addEventListener('dragover',this.onDragOver);

this.props.setTimeout(onDragStart);
//允许从异步代码访问合成事件。
// https://reactjs.org/docs/events.html#event-联营
event.persist();
this.props.setTimeout(onDragStart.bind(this,event));
}

/**
全部展开 @@-165,6+178,9@@class可拖动扩展组件{
this.cloneWrapper=空;
}

this.cursorLeft=空;
this.cursorTop=空;

//重置光标。
document.body.classList.remove('is-dragging-components-draggable');
}
向下展开
1个更改:1个添加和0个删除 包/组件/src/draggable/style.scss
原始文件行号 差异线编号 差异线更改
向上展开 @@-16,6+16,7@@body.is-dragging-components可拖动{
背景:透明;
指针-事件:无;
z索引:z索引(“.components-draggable__clone”);
不透明度:0.7;

> * {
//这需要特定性,因为默认情况下主题是要定义这些内容的。
向下展开