【问题标题】:CSS Scale and Transform causing overlapsCSS Scale 和 Transform 导致重叠
【发布时间】:2019-01-12 01:34:28
【问题描述】:

在 HTML 页面中,我尝试使用 CSS 转换比例属性来实现缩放功能。在 HTML 页面中,我有更多的 div 元素,所有元素都使用绝对位置技术放置。然后我将 scale 属性应用于每个 div,我可以看到类似缩放,但所有 div 位置都相互折叠。那么如何在应用缩放后避免塌陷并保持彼此之间的间隙。

请建议我如何停止重叠以及如何根据 scale 属性计算每个元素的左侧和顶部位置。

var zoomScale = 1;

$(document).ready(function(){
  
  $("#zoomin").click(function(){
    if(zoomScale >=4 ) return;
    zoomScale = zoomScale +1;
    dispStatus();
    applyZoomIn();
  });

  function applyZoomIn(){
    $(".zoomable").each(function(index){
      var left = $(this).position().left;
      var top = $(this).position().top;
      var newLeft = left*zoomScale +"px";
      var newTop = top*zoomScale +"px";
      $(this).css('transform',' scale('+zoomScale+','+zoomScale+')')
    });
  }

  function dispStatus(){
    $("#displayStatus").text("Current Zoom Scale : "+zoomScale);
  }
  
  dispStatus();
  
});
#container{
     width:500px;
     height:500px;
     border:1px solid red;
     position:relative;
     overflow:auto;
}
.zoomable{
  background-color:lightblue;       
  border:1px solid red;
  width:100px;
  height:100px;
  position:absolute;
  transform-origin: top left;      
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<button id="zoomin"> Zoom In</button>
<div id="displayStatus"></div>
<br/><br/>
<div id="container">
   <div class="zoomable">First Div</div>
   <div class="zoomable" style="left:105px">Second Div</div>
</div>

JSFiddle Link

【问题讨论】:

  • 如果您可以使用 CSS3 Flexbox 和 Grid 布局定位您的元素,浏览器将负责转换父 flex/grid 项目!或者您可以为transform-origin 设置一个点,并且相同。
  • 只需将.zoomable 类添加到.container div 而不是里面的类。

标签: javascript jquery html css css-transforms


【解决方案1】:

您可以将.zoomable div 添加到另一个父级(称为.inner-container)并为其添加缩放功能。这样.container div 就不会被缩放,而可缩放的 div 将保持位置。

请看下面的片段:

var zoomScale = 1;
$(document).ready(function(){
	 $("#zoomin").click(function(){
    if(zoomScale >=4 ) return;
    zoomScale = zoomScale +1;
    dispStatus();
    applyZoomIn();
  });

  function applyZoomIn(){
      $(".inner-container").css('transform',' scale('+zoomScale+','+zoomScale+')');
  }

 
  function dispStatus(){
   $("#displayStatus").text("Current Zoom Scale : "+zoomScale);
  }

  dispStatus();

});
    
    .zoomable{
      background-color:lightblue;       
      width:100px;
      height:100px;
      position:absolute;
      border:1px solid red;
    }
    #container{
    width:500px;
    height:500px;
    border:1px solid red;
    position:relative;
    overflow:auto;
    }
    .inner-container{
      transform-origin: top left; 
    }
   
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="zoomin"> Zoom In</button>

<div id="displayStatus"></div>
<br/><br/>

<div id="container">
  <div class="inner-container">
    <div class="zoomable">First Div
    </div>
    <div class="zoomable" style="left:105px">Second Div
    </div>
  </div>
</div>
<br/><br/>

你也可以测试一下here

【讨论】:

  • 如果你这样做,你必须指定具有可缩放类元素的容器元素的类名。它还假设内部容器内的所有东西都应该被缩放,这是一个很大的假设。这个建议非常违反直觉,导致维护问题。
猜你喜欢
  • 2013-08-02
  • 2016-08-28
  • 1970-01-01
  • 2017-12-13
  • 2014-03-05
  • 1970-01-01
  • 2012-12-02
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多