使用 transform translate、mousemove 和 pageX (pageY) 约束块位移

Posted

技术标签:

【中文标题】使用 transform translate、mousemove 和 pageX (pageY) 约束块位移【英文标题】:Constraining block displacement using transform translate, mousemove and pageX (pageY) 【发布时间】:2022-01-23 06:23:31 【问题描述】:

我正在使用mousemove 事件调整框的大小和位置。那些。我将transform translatewidth (height) 更改为pageX (pageY)。但是由于鼠标事件mousemove 并不总是有时间被处理(例如,如果您快速移动鼠标)或没有时间读取条件,因此该块超出范围。 问题:在这种情况下我需要怎么做才能使块不超出边界?

大致是这样的。那些。在本例中,second_blockfirst_block (500px) 之外,即它没有时间读取条件。这个问题应该如何解决?也为了方便https://jsfiddle.net/ManuOP/t1r4szdx/3/

<div id="first_block" class="first_block">
    <div id="auxiliary_block"> 
        <div id="second_block" class="second_block"></div>
        <input id="point" class="point" name="name_point" type="button">
    </div>
</div>
<script src="1.block_in_center_question.js"></script>

* 
    margin: 0;
    padding: 0;
    box-sizing: border-box;

div 
    display: flex;
    flex-direction: column;

div.first_block 
    height: 300px;
    width: 500px;
    background: green;

div#auxiliary_block 
    position: absolute;

div.second_block 
    height: 200px;
    width: 300px;
    background: orange;

input.point 
    position: absolute;
    cursor: pointer;
    height: 14px;
    width: 14px;
    border: none;
    background: black;
    right: -7px;
    top: 50%;


"use strict";
let second_block = document.getElementById('second_block');
let point = document.getElementById('point');
function change_second_block() 
    if(second_block.clientWidth < 500) 
        second_block.style.width = `$start_x + event.pageXpx`;
    

point.addEventListener('mousedown', (event) => 
    window.start_x = second_block.clientWidth - event.pageX;
    document.addEventListener('mousemove', change_second_block);
);

【问题讨论】:

【参考方案1】:

您可以只测试新宽度,如果它太大,则将其限制为不超过最大值。

这个 sn-p 对 x 方向执行此操作,并强制它保持在 500 像素或以下。

"use strict";
let second_block = document.getElementById('second_block');
let point = document.getElementById('point');

function change_second_block() 
  if (second_block.clientWidth < 500) 
    second_block.style.width = (start_x + event.pageX) < 500 ? `$start_x + event.pageXpx` : '500px';
  

point.addEventListener('mousedown', (event) => 
  window.start_x = second_block.clientWidth - event.pageX;
  document.addEventListener('mousemove', change_second_block);
);
* 
  margin: 0;
  padding: 0;
  box-sizing: border-box;


div 
  display: flex;
  flex-direction: column;


div.first_block 
  height: 300px;
  width: 500px;
  background: green;


div#auxiliary_block 
  position: absolute;


div.second_block 
  height: 200px;
  width: 300px;
  background: orange;


input.point 
  position: absolute;
  cursor: pointer;
  height: 14px;
  width: 14px;
  border: none;
  background: black;
  right: -7px;
  top: 50%;
<div id="first_block" class="first_block">
  <div id="auxiliary_block">
    <div id="second_block" class="second_block"></div>
    <input id="point" class="point" name="name_point" type="button">
  </div>
</div>

【讨论】:

我考虑过这个选项,但没有更正确的选项,使其完全不超出界限吗?是否可以在css中制作一些边框?也许添加一个块? 第二个块永远不会超出边界,它的宽度永远不会超过 500px。您是说您希望鼠标被限制为永远不会超出边界吗?这将减少功能 - 用户永远无法逃离该元素。 不,我想说区块没有机会超越极限。有限制,我明白 - 谢谢。但我想有一个解决方案,让街区没有机会超越 块绝对不能超越。【参考方案2】:

如果项目中的更改大小超过某个限制,或者通过检查限制并停止更新,您可以解决此问题。我通过如下更新代码来防止鼠标快速移动导致的溢出:

function change_second_block()

    console.log("Event.PageX: " + event.pageX);

    if(event.pageX < 500 )
    
        if(second_block.clientWidth < 500)
        
            second_block.style.width = `$start_x + event.pageXpx`;
        
    

参考文献
javascript mouse event not captured properly when mouse moved very fast

【讨论】:

我考虑过这个选项,但没有更正确的选项,使其完全不超出界限吗?是否可以在css中制作一些边框?也许添加一个块? 您是否考虑过使用jQuery resizable 来完成这项工作?您将获得更快、更可靠的结果。 要查看类似问题的解决方案,您应该查看this post。 如果可能的话,我想不使用 jQuery

以上是关于使用 transform translate、mousemove 和 pageX (pageY) 约束块位移的主要内容,如果未能解决你的问题,请参考以下文章

CSS居中之 { left:50%; top:50%; transform:translate(-50%,-50%); }

transform:translate(-50%,-50%)实现水平垂直居中

从 Eigen::Translation 构造 Eigen::Transform

使用 transform translate、mousemove 和 pageX (pageY) 约束块位移

前端2D变形transform

如何在Angular 2中使用ngStyle将transform translate属性应用于元素