首页 > 解决方案 > div 使用内部内容调整大小并保持纵横比

问题描述

我制作了一个代码笔示例以供完整理解,请查看此链接 https://codepen.io/hasan-irshad/pen/bGpPZzB

这是我用于右下角的代码

if (currentResizer.classList.contains('bottom-right')) {
    const width = original_width + (e.pageX - original_mouse_x);
    const height = original_height + (e.pageY - original_mouse_y)
    if (width > minimum_size) {
      element.style.width = width + 'px'
      element.style.height = 'max-content';
      let Textdiv = document.getElementById('Text');
      let relFontsizew = Textdiv.offsetWidth * 0.25;
      Textdiv.style.fontSize = relFontsizew + 'px';
    }
  }

如果您从右下角调整 div 的大小,它可以正常工作,因为我希望它可以正常工作,从右下角它根据 mouse-X 增加/减少 div 的宽度,并根据内部内容高度增加/减少 div 的高度。这是我想在所有角落实施的行为。

例如,如果我从右下角拖动,所以左上角保持在它的位置,就像我从右上角调整它的大小一样,所以左下角应该保持它的位置。

预期行为 1 外部元素的宽度应取决于 mouse-X 2 字体大小应取决于外部 div 的宽度 3 外部 div 的高度应取决于内部内容高度 4 div 元素不应丢失其位置

下面是一个视频链接,用于演示我想要实现的最终结果。drive.google.com/file/d/1Wgh3GhEOhv1syk_WFmcCGp0UJUyGzS5u/view

有人可以帮我完成这项任务吗?

提前非常感谢!!!!!!!

标签: javascripthtmlcssresize

解决方案


我注释掉你不需要的东西,并插入你应该添加的东西,主要是你不需要设置实际位置,你需要将高度设置为“最大内容”,并且唯一一次添加一个更改字体大小的脚本位于右下角。

          let Textdiv = document.getElementById('Text');
          let relFontsizew = Textdiv.offsetWidth * 0.25;
          Textdiv.style.fontSize = relFontsizew + 'px';

/*Make resizable div by Hung Nguyen*/


function makeResizableDiv(div) {
  const element = document.querySelector(div);
  const resizers = document.querySelectorAll(div + ' .resizer')
  const minimum_size = 20;
  let original_width = 0;
  let original_height = 0;
  let original_x = 0;
  let original_y = 0;
  let original_mouse_x = 0;
  let original_mouse_y = 0;
  for (let i = 0;i < resizers.length; i++) {
    const currentResizer = resizers[i];
    currentResizer.addEventListener('mousedown', function(e) {
      e.preventDefault()
      original_width = parseFloat(getComputedStyle(element, null).getPropertyValue('width').replace('px', ''));
      original_height = parseFloat(getComputedStyle(element, null).getPropertyValue('height').replace('px', ''));
      original_x = element.getBoundingClientRect().left;
      original_y = element.getBoundingClientRect().top;
      original_mouse_x = e.pageX;
      original_mouse_y = e.pageY;
      window.addEventListener('mousemove', resize)
      window.addEventListener('mouseup', stopResize)
    })
    
    function resize(e) {
      if (currentResizer.classList.contains('bottom-right')) {
        const width = original_width + (e.pageX - original_mouse_x);
        const height = original_height + (e.pageY - original_mouse_y)
        if (width > minimum_size) {
          element.style.width = width + 'px'
          element.style.height = 'max-content';
          let Textdiv = document.getElementById('Text');
          let relFontsizew = Textdiv.offsetWidth * 0.25;
          Textdiv.style.fontSize = relFontsizew + 'px';
        }
      }
      else if (currentResizer.classList.contains('bottom-left')) {
        const height = original_height + (e.pageY - original_mouse_y)
        const width = original_width - (e.pageX - original_mouse_x)
        if (height > minimum_size) {
          element.style.height = "max-content"
        }
        if (width > minimum_size) {
          element.style.width = width + 'px'
          element.style.left = original_x + (e.pageX - original_mouse_x) + 'px'
          let Textdiv = document.getElementById('Text');
          let relFontsizew = Textdiv.offsetWidth * 0.25;
          Textdiv.style.fontSize = relFontsizew + 'px';
        }
      }
      else if (currentResizer.classList.contains('top-right')) {
        const width = original_width + (e.pageX - original_mouse_x)
        const height = original_height - (e.pageY - original_mouse_y)
        if (width > minimum_size) {
          element.style.width = width + 'px'
          element.style.height = "max-content"
          //element.style.top = original_y + (e.pageY - original_mouse_y) + 'px'
          let Textdiv = document.getElementById('Text');
          let relFontsizew = Textdiv.offsetWidth * 0.25;
          Textdiv.style.fontSize = relFontsizew + 'px';
        }
      }
      else {
        const width = original_width - (e.pageX - original_mouse_x)
        const height = original_height - (e.pageY - original_mouse_y)
        if (width > minimum_size) {
          element.style.width = width + 'px'
          element.style.left = original_x + (e.pageX - original_mouse_x) + 'px'
        }
        if (height > minimum_size) {
          element.style.height = "max-content"
          //element.style.top = original_y + (e.pageY - original_mouse_y) + 'px'
        }
         let Textdiv = document.getElementById('Text');
          let relFontsizew = Textdiv.offsetWidth * 0.25;
          Textdiv.style.fontSize = relFontsizew + 'px';
      }
    }
    
    function stopResize() {
      window.removeEventListener('mousemove', resize)
    }
  }
}

makeResizableDiv('.resizable')
body,
html {
  background: black;
}
.resizable {
  background: white;
  width: 100px;
  height: 100px;
  position: absolute;
  top: 100px;
  left: 100px;
}

.resizable .resizers{
  width: 100%;
  height: 100%;
  border: 3px solid #4286f4;
  box-sizing: border-box;
}

.resizable .resizers .resizer{
  width: 10px;
  height: 10px;
  border-radius: 50%; /*magic to turn square into circle*/
  background: white;
  border: 3px solid #4286f4;
  position: absolute;
}

.resizable .resizers .resizer.top-left {
  left: -5px;
  top: -5px;
  cursor: nwse-resize; /*resizer cursor*/
}
.resizable .resizers .resizer.top-right {
  right: -5px;
  top: -5px;
  cursor: nesw-resize;
}
.resizable .resizers .resizer.bottom-left {
  left: -5px;
  bottom: -5px;
  cursor: nesw-resize;
}
.resizable .resizers .resizer.bottom-right {
  right: -5px;
  bottom: -5px;
  cursor: nwse-resize;
}
<div class='resizable'>
  <div class='resizers'>
    <div class='resizer top-left'></div>
    <div class='resizer top-right'></div>
    <div class='resizer bottom-left'></div>
    <div class='resizer bottom-right'></div>
    <article id="Text" style=" width:100%; font-size:22px; color:black">Any Text</article>
  </div>
  
</div>


推荐阅读