如何构建可调整大小的DIV以使用溢出:自动?

伊萨克·奥古斯特

我有一个可调整大小的DIV,可在4个方面调整大小。但是,在某些情况下,此DIV的内容可能会超出其大小。因此,我添加了选项溢出:自动,但是当我使用此选项时,负责调整DIV大小的组件随滚动一起移动。

这是代码:https : //codesandbox.io/s/23kt1?file=/index.html

如何将组件始终固定在DIV的边缘上,以使用户在滚动div时不会移动?

丹斯曼

您需要一个额外的容器来使点对齐。

function resizeable() {
  var resizers = document.querySelectorAll('.n, .s, .w, .e, .nw, .ne, .se, .sw');
  const min = 40;
  for (let i = 0; i < resizers.length; i++) {
    const currentResizer = resizers[i];
    const element = currentResizer.parentElement;
    const parent = currentResizer.parentElement.parentElement;
    let p;
    let c;
    let original_w = 0;
    let original_h = 0;
    let parent_x = 0;
    let parent_y = 0;
    let parent_sx = 0;
    let parent_sy = 0;
    let child_x = 0;
    let child_y = 0;
    let mouse_x = 0;
    let mouse_y = 0;
    let scale_x = 0;
    let scale_y = 0;
    let scroll_x = 0;
    let scroll_y = 0;
    // Mouse events
    currentResizer.addEventListener('mousedown', function(e) {
      first(e);
      document.addEventListener('mousemove', resize);
      document.addEventListener('mouseup', stopResize);
      e.preventDefault();
    });

    // First location & width
    function first(e) {
      c = element.getBoundingClientRect();
      child_y = c.top;
      child_x = c.left;
      p = parent.getBoundingClientRect();
      parent_y = p.top;
      parent_x = p.left;
      parent_sy = parent.scrollTop;
      parent_sx = parent.scrollLeft;
      scroll_y = window.scrollY;
      scroll_x = window.scrollX;
      original_w = parseFloat(c.width).toFixed(2);
      original_h = parseFloat(c.height).toFixed(2);
      scale_y = parseFloat(c.height / element.offsetHeight).toFixed(2);
      scale_x = parseFloat(c.width / element.offsetWidth).toFixed(2);
      mouse_y = e.pageY - scroll_y;
      mouse_x = e.pageX - scroll_x;
    }
    // Resize process
    function resize(e) {
      element.style.position = "absolute";
      if (currentResizer.classList.contains('se')) {
        const width = e.pageX - scroll_x - child_x;
        const height = e.pageY - scroll_y - child_y;
        if (width > min) {
          element.style.width = (width / scale_x) + 'px';
        }
        if (height > min) {
          element.style.height = (height / scale_y) + 'px';
        }
        if (parent.scrollTop < parent.scrollHeight) {
          parent.scrollTop = parent.scrollHeight;
        }
        if (parent.scrollLeft < parent.scrollWidth) {
          parent.scrollLeft = parent.scrollWidth;
        }
      } else if (currentResizer.classList.contains('sw')) {
        const width = original_w - (e.pageX - scroll_x - child_x);
        const height = e.pageY - scroll_y - child_y;
        if (height > min) {
          element.style.height = (height / scale_y) + 'px';
        }
        if (width > min) {
          element.style.left = e.pageX - scroll_x - parent_x + parent_sx + 'px';
          element.style.width = (width / scale_x) + 'px';
        }
        if (parent.scrollTop < parent.scrollHeight) {
          parent.scrollTop = parent.scrollHeight;
        }
      } else if (currentResizer.classList.contains('ne')) {
        const width = e.pageX - child_x - scroll_x;
        const height = original_h - (e.pageY - mouse_y - scroll_y);
        if (width > min) {
          element.style.width = (width / scale_x) + 'px';
        }
        if (height > min) {
          element.style.height = (height / scale_y) + 'px';
          element.style.top = e.pageY - parent_y - scroll_y + parent_sy + 'px';
        }
        if (parent.scrollLeft < parent.scrollWidth) {
          parent.scrollLeft = parent.scrollWidth;
        }
      } else if (currentResizer.classList.contains('nw')) {
        const width = original_w - (e.pageX - scroll_x - child_x);
        const height = original_h - (e.pageY - scroll_y - mouse_y);
        if (width > min) {
          element.style.left = e.pageX - parent_x - scroll_x + parent_sx + 'px';
          element.style.width = (width / scale_x) + 'px';
        }
        if (height > min) {
          element.style.height = (height / scale_y) + 'px';
          element.style.top = e.pageY - parent_y - scroll_y + parent_sy + 'px';
        }
      } else if (currentResizer.classList.contains('e')) {
        const width = e.pageX - scroll_x - child_x;
        if (width > min) {
          element.style.width = (width / scale_x) + 'px';
        }
        if (parent.scrollLeft < parent.scrollWidth) {
          parent.scrollLeft = parent.scrollWidth;
        }
      } else if (currentResizer.classList.contains('s')) {
        const height = e.pageY - scroll_y - child_y;
        if (height > min) {
          element.style.height = (height / scale_y) + 'px';
        }
        if (parent.scrollTop < parent.scrollHeight) {
          parent.scrollTop = parent.scrollHeight;
        }
      } else if (currentResizer.classList.contains('w')) {
        const width = original_w - (e.pageX - scroll_x - child_x);
        if (width > min) {
          element.style.width = (width / scale_x) + 'px';
          element.style.left = (e.pageX - scroll_x - parent_x + parent_sx) + 'px';
        }
      } else if (currentResizer.classList.contains('n')) {
        const height = original_h - (e.pageY - scroll_y - mouse_y);
        if (height > min) {
          element.style.height = (height / scale_y) + 'px';
          element.style.top = e.pageY - parent_y - scroll_y + parent_sy + 'px';
        }
      }

    }
    // When mouse released stop
    function stopResize(e) {
      first(e);
      document.removeEventListener('mousemove', resize);
    }
  }
}
resizeable();
body {
  width: 1200px;
}

div {
  position: absolute;
  background-color: grey;
}

.regular {
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: red;
  overflow: auto;
  position: absolute;
}

.n,
.s,
.w,
.e,
.nw,
.ne,
.se,
.sw {
  position: absolute;
  width: 18px;
  height: 18px;
  border: 1px solid grey;
  border-radius: 20px;
  background-color: #fff;
  z-index: 1;
}

.n:hover,
.s:hover,
.w:hover,
.e:hover,
.nw:hover,
.ne:hover,
.se:hover,
.sw:hover {
  background-color: red;
}

.nw {
  top: -10px;
  left: -10px;
  cursor: nw-resize;
}

.ne {
  top: -10px;
  left: calc(100% - 10px);
  cursor: ne-resize;
}

.sw {
  top: calc(100% - 10px);
  left: -10px;
  cursor: sw-resize;
}

.se {
  top: calc(100% - 10px);
  left: calc(100% - 10px);
  cursor: se-resize;
}

.n {
  top: -10px;
  left: calc(50% - 10px);
  cursor: n-resize;
}

.w {
  top: calc(50% - 10px);
  left: -10px;
  cursor: w-resize;
}

.e {
  top: calc(50% - 10px);
  left: calc(100% - 10px);
  cursor: e-resize;
}

.s {
  top: calc(100% - 10px);
  left: calc(50% - 10px);
  cursor: s-resize;
}

.container {
  position: relative;
  width: 300px;
  height: 300px;
}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="/src/styles.css" />
</head>

<body>


  <div class="container">
    <div class="nw"></div>
    <div class="ne"></div>
    <div class="sw"></div>
    <div class="se"></div>
    <div class="n"></div>
    <div class="s"></div>
    <div class="w"></div>
    <div class="e"></div>
    <div class="regular">

      <p>SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS</p>
      <p>SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS</p>
      <p>SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS</p>
      <p>SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS</p>
      <p>SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS</p>
      <p>SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS</p>
      <p>SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS</p>
      <p>SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS</p>
      <p>SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS</p>
      <p>SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS</p>

    </div>
  </div>



  <script src="/src/index.js"></script>
</body>

</html>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用JQuery,如何执行可调整大小的div以使其适合其子控件?

来自分类Dev

如何使div可调整大小

来自分类Dev

如何让 CSS 溢出和高度:计算在可调整大小的 div 中工作

来自分类Dev

使用自动布局可调整大小的UICollectionViewCell

来自分类Dev

在使用可调整大小的 Jquery 增加 div 的大小时如何滚动?

来自分类Dev

如何从各个角度制作可调整大小的div?

来自分类Dev

jQuery UI可调整大小-使用溢出来调整表列大小

来自分类Dev

可调整大小的div内div内的文本溢出浮动div

来自分类Dev

防止ui可调整大小的句柄自动触发溢出滚动条

来自分类Dev

修复了可调整大小的HTML表上的标头,包括自动水平滚动溢出

来自分类Dev

如何使用可调整大小的圆角矩形作为KeyIcon

来自分类Dev

如何使JScrollPane可调整大小

来自分类Dev

如何创建可调整大小的MessageDialog

来自分类Dev

如何使 fxml 布局可调整大小

来自分类Dev

如何获得可拖动和可调整大小的图像以及仅可调整div的图像?

来自分类Dev

如何防止 jquery 可调整大小的 div 接收调整大小的单击事件

来自分类Dev

使用jQuery可调整大小的处理程序附加和调整div的大小

来自分类Dev

带有溢出的包含项目的可调整大小的容器。组合溢出:可见且可调整大小

来自分类Dev

如何使 2 个 div 的中间可调整大小以更改大小?(我正在使用引导程序 4)

来自分类Dev

如何使用jQuery和jQuery UI保持div相对于可调整大小的div的宽度?

来自分类Dev

将整个svg调整为可调整大小的div

来自分类Dev

如何根据内部元素的大小创建可调整大小的div

来自分类Dev

jQuery UI可调整大小的自动隐藏句柄

来自分类Dev

使用自动布局单击按钮即可调整UIView的大小

来自分类Dev

如何在可调整大小的引导面板中使子div占据父div的全部空间?

来自分类Dev

如何在可调整大小的引导面板中使子div占据父div的全部空间?

来自分类Dev

如何在表头中使用可调整大小的 jquery 以及如何在调整表头大小时扩展父 div?

来自分类Dev

使控件可调整大小

来自分类Dev

JavaFx可调整大小

Related 相关文章

  1. 1

    使用JQuery,如何执行可调整大小的div以使其适合其子控件?

  2. 2

    如何使div可调整大小

  3. 3

    如何让 CSS 溢出和高度:计算在可调整大小的 div 中工作

  4. 4

    使用自动布局可调整大小的UICollectionViewCell

  5. 5

    在使用可调整大小的 Jquery 增加 div 的大小时如何滚动?

  6. 6

    如何从各个角度制作可调整大小的div?

  7. 7

    jQuery UI可调整大小-使用溢出来调整表列大小

  8. 8

    可调整大小的div内div内的文本溢出浮动div

  9. 9

    防止ui可调整大小的句柄自动触发溢出滚动条

  10. 10

    修复了可调整大小的HTML表上的标头,包括自动水平滚动溢出

  11. 11

    如何使用可调整大小的圆角矩形作为KeyIcon

  12. 12

    如何使JScrollPane可调整大小

  13. 13

    如何创建可调整大小的MessageDialog

  14. 14

    如何使 fxml 布局可调整大小

  15. 15

    如何获得可拖动和可调整大小的图像以及仅可调整div的图像?

  16. 16

    如何防止 jquery 可调整大小的 div 接收调整大小的单击事件

  17. 17

    使用jQuery可调整大小的处理程序附加和调整div的大小

  18. 18

    带有溢出的包含项目的可调整大小的容器。组合溢出:可见且可调整大小

  19. 19

    如何使 2 个 div 的中间可调整大小以更改大小?(我正在使用引导程序 4)

  20. 20

    如何使用jQuery和jQuery UI保持div相对于可调整大小的div的宽度?

  21. 21

    将整个svg调整为可调整大小的div

  22. 22

    如何根据内部元素的大小创建可调整大小的div

  23. 23

    jQuery UI可调整大小的自动隐藏句柄

  24. 24

    使用自动布局单击按钮即可调整UIView的大小

  25. 25

    如何在可调整大小的引导面板中使子div占据父div的全部空间?

  26. 26

    如何在可调整大小的引导面板中使子div占据父div的全部空间?

  27. 27

    如何在表头中使用可调整大小的 jquery 以及如何在调整表头大小时扩展父 div?

  28. 28

    使控件可调整大小

  29. 29

    JavaFx可调整大小

热门标签

归档