css解决不了的,就用js解决

Author Avatar
Peipei Wong 12月 20, 2020
  • 在其它设备中阅读本文章

对于展示上的问题,我一向是css能解决的就不要动用js。这个迭代中加了一个放大缩小的功能,放大的话势必要出现横向滚动条,但是在实际上还会有超宽的absolute元素,我写了一个简单的demo

<style>
  .container {
    width: 400px;
    height: 600px;
    border: 1px solid rgb(198, 198, 199);
    margin: 50px auto;
    overflow-y: scroll;
    overflow-x: auto;
  }

  .inner {
    position: relative;
    border: 1px solid blue;
  }

  .mark {
    position: absolute;
    left: 120px;
    top: 120px;
    width: 600px;
    height: 600px;
    border: 2px solid red;
  }

  img {
    width: 120%;
  }
</style>

<div class="container">
  <div class="inner">
    <img src="https://aibici-test.oss-cn-beijing.aliyuncs.com/document-mining-backend/c9325f71bc7df09b10de105835314c2e.jpg" />
    <div class="mark"></div>
  </div>
</div>

mask超级宽,一旦它超出父元素的宽度是,势必会让父元素变宽。我想要的效果是mask不会影响父元素的宽度。于是我开始在这个基础上各种魔改,以达到我的效果。结果折腾了大半天也不可以。

最后是使用js会动态计算inner的宽高。同时我反思了一下这个css方案的失败。img的宽度使用百分比的时候,它依赖于inner的宽度,如果我需要hidden absolute元素的宽度,必须在inner上加overflow: hidden。这样一来,图片超出100%的时候,也是无法滚动的。hidde和scroll互相矛盾;如果给mark加一个父元素testtest来包裹,有一个问题是testtest使用absolute定位式,宽度是等于inner的宽度的,即是inneryou了scroll。

所以最后的方案是使用js去计算inner的宽度,img永远保持width为100%