【问题标题】:Force (rectangular) image to display as square with side length = variable parent div's width强制(矩形)图像显示为边长 = 可变父 div 宽度的正方形
【发布时间】:2022-01-09 01:20:37
【问题描述】:

我有一个居中的 flexbox 父 div,#con,宽度为 %,其中有一个包含图像的 div (.block) 夹在两个填充文本 div(#info#links)之间。如何使用 JS 或 CSS 强制 .block img 成为边长等于 #con 宽度的正方形? .block 可以包含 1x1=1 图像、2x2=4 图像等;因此,background-image 不是一个选项。模仿解决方案here 似乎只有在我将 JS 中的con.width() 替换为特定值(例如,300px,如here 与此placeholder image 所示)时才有效,这是不理想的。

var con = $("#con");
$(".block").css("height", con.width(), "width", con.width());

body {
    font-size:1rem;
    text-align:center;
    margin:0;
    height:100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    overflow:hidden;
}

#con {
    width:50%;
    max-width:300px;
    display:flex;
    flex-flow:row wrap;
    justify-content:center;
    margin:5rem auto;
    border:1px solid black;
}

.block {width:100%; overflow:hidden; background:black;}
.block img {
    position: relative;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    object-fit: cover;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
<div id="con">
<div id="info">...</div>
<div class="block"><img src="https://dbdzm869oupei.cloudfront.net/img/vinylrugs/preview/60150.png"></div>
<div id="links">...</div>
</div>

【问题讨论】:

    标签: javascript html jquery css


    【解决方案1】:

    您不需要 JS:只需使用 aspect-ratio: 1 强制一个正方形纵横比。您可能需要添加 display: block 以确保 &lt;img&gt; 也不会内联显示(这是默认设置)。请参阅下面的概念验证:

    body {
      font-size: 1rem;
      text-align: center;
      margin: 0;
      height: 100vh;
      display: flex;
      align-items: center;
      justify-content: center;
      overflow: hidden;
    }
    
    #con {
      width: 50%;
      max-width: 300px;
      display: flex;
      flex-flow: row wrap;
      justify-content: center;
      margin: 5rem auto;
      border: 1px solid black;
    }
    
    .block {
      width: 100%;
      overflow: hidden;
      background: black;
    }
    
    .block img {
      display: block;
      object-fit: cover;
      width: 100%;
      aspect-ratio: 1;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
    <div id="con">
      <div id="info">...</div>
      <div class="block"><img src="https://dbdzm869oupei.cloudfront.net/img/vinylrugs/preview/60150.png"></div>
      <div id="links">...</div>
    </div>

    如果你想支持不支持aspect-ratio的浏览器,你可以使用伪元素+padding-bottom hack的组合来设置固定的纵横比:

    body {
      font-size: 1rem;
      text-align: center;
      margin: 0;
      height: 100vh;
      display: flex;
      align-items: center;
      justify-content: center;
      overflow: hidden;
    }
    
    #con {
      width: 50%;
      max-width: 300px;
      display: flex;
      flex-flow: row wrap;
      justify-content: center;
      margin: 5rem auto;
      border: 1px solid black;
    }
    
    .block {
      width: 100%;
      overflow: hidden;
      background: black;
      position: relative;
    }
    
    .block::before {
      width: 100%;
      padding-bottom: 100%;
      content: '';
      display: block;
      
    }
    
    .block img {
      display: block;
      object-fit: cover;
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
    <div id="con">
      <div id="info">...</div>
      <div class="block"><img src="https://dbdzm869oupei.cloudfront.net/img/vinylrugs/preview/60150.png"></div>
      <div id="links">...</div>
    </div>

    【讨论】:

    • 在这里我用 JS 打败了自己,并且一直有一个简单的 CSS 答案。谢谢! (我已经接受了这个答案,但我也会对这里显示的“photogrids”进行实验,以防我决定改用 2x2=4 等图像:annasthms.tumblr.com/post/177359244495
    猜你喜欢
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    相关资源
    最近更新 更多