【问题标题】:How do I make an parent resize when child element image is resize in percentage?当子元素图像按百分比调整大小时,如何调整父级大小?
【发布时间】:2016-07-24 12:09:43
【问题描述】:

我有一个块级元素,它有一个“图像”作为子元素。当我按百分比缩小图像时,块级元素不适合图像的新大小,但是块级父元素保持子图像的 100% 位置。

我希望父元素尊重大小,因为我以百分比更改子元素大小。这是显示问题的链接:

http://codepen.io/rosn/pen/ZOoGgm

codepen html:

<a href="#">
  <img src="https://s-media-cache-ak0.pinimg.com/236x/f6/35/e7/f635e7cdfcf59c09236a44df28f53d92.jpg" alt="" />
</a>

codepen css:

a{
  display: inline-block;
  border: 1px solid red; 
}

img{
    width: 70%;
    border: 1px solid blue;
}

尝试在 Bootstrap 中解决的问题: 更准确地说,这个问题是在引导导航中引起的,当时我在“navbar-brand”中应用了更大的图像。当我减小屏幕尺寸时,“navbar-brand”在“nav-collapse”按钮下方流动,如图所示。

为了使徽标变小并适合与“导航折叠”按钮在同一行中,我尝试使用媒体查询以百分比为单位缩小图像,但是以红色边框显示的父级不会与缩小图像。

这里是实际问题的引导代码链接: http://codepen.io/rosn/pen/JKvGvr?editors=1100

这个屏幕截图显示了使用百分比宽度以小尺寸下降的徽标图像。请减小屏幕宽度,您将重现该问题。

【问题讨论】:

  • 1) 您的 codepen 使用 width: 10vw; 而不是 width: 70%;。你需要哪个值? 2)请将您的引导代码添加到您的答案中。
  • @GlebKemarsky 我已将 vw 更改为 %。您现在可以在我的代码笔中看到 % 的问题。使用大众解决了这个问题,但我不确定使用大众。使用百分比引起的实际问题仍然存在。
  • 70% 仅表示70% of the width of the parent block。在您的codepen 中,&lt;a&gt; 块是图像的父块。所以这不是问题,而是您要求的行为。

标签: css twitter-bootstrap responsive-design


【解决方案1】:

1) 图片

  1. vw是窗口宽度的百分比; % 是父块宽度的百分比。 In your codepen &lt;a&gt; 块是图像的父块。所以70% 只是意味着70% of the width of the &lt;a&gt;。因此,图像右侧的空白空间不是问题。这是您要求的行为。

  2. 您可以使用媒体查询来控制图像在不同尺寸屏幕上的宽度。例如:

    img { width: 30vw; } }
    @media (min-width: 481px) { img { width: 20vw; } }
    @media (min-width: 768px) { img { width: 10vw; } }
    
  3. 默认情况下,图像的 display 属性值为 inline。因此,父块的边界偏离图像的下边缘。所以你需要重新定义这个属性为block

  4. 在演示中,我更喜欢使用the outline property 而不是border 属性:

    大纲不占用空间,它们绘制在内容之上。

http://codepen.io/glebkema/pen/wWjrWN

a {
  display: inline-block;
  outline: 1px solid red; 
}

img {
  display: block;
  outline: 1px solid blue;
  width: 30vw;
}
@media (min-width: 481px) { img { width: 20vw; } }
@media (min-width: 768px) { img { width: 10vw; } }
<a href="#">
  <img src="https://s-media-cache-ak0.pinimg.com/236x/f6/35/e7/f635e7cdfcf59c09236a44df28f53d92.jpg" alt="" />
</a>

2) 引导

  1. 您可以以像素为单位设置图像大小,父块将调整为:

    http://codepen.io/glebkema/pen/grzPyN

@import url('https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css');

.navbar-brand {
  outline: 1px solid red;
  padding: 0 15px;
}
  
.navbar-brand img {
  outline: 1px solid blue;
  width: 50px;
}
<div class="jumbotron">
  <div class="container">

    <nav class="navbar navbar-default">
      <div class="container-fluid">

        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="#">	
            <img src="https://s-media-cache-ak0.pinimg.com/236x/f6/35/e7/f635e7cdfcf59c09236a44df28f53d92.jpg" alt="" />
          </a>
        </div>

        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
          <ul class="nav navbar-nav">
            <li class="active"><a href="#">home<span class="sr-only">(current)</span></a></li>
            <li><a href="#">our services</a></li>
            <li><a href="#">tour package</a></li>
            <li><a href="#">custom tour</a></li>
            <li><a href="#">travel partners</a></li>
            <li><a href="#">contactus</a></li>
          </ul>
        </div>
        
      </div>
    </nav>

    <div class="row text-center">
      <h1>Intro text</h1>    
      <a class="btn btn-primary btn-lg" href="#" role="button">Book a trip</a>
    </div>

  </div><!--container end -->
</div><!--jumbotron end -->

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
  1. 或者您可以在像素中设置父块的宽度。并将width: 100%; 属性应用于图像。

    http://codepen.io/glebkema/pen/PzZNPo

@import url('https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css');

.navbar-brand {
  outline: 1px solid red;
  padding: 0 15px;
  width: 80px;
}
  
.navbar-brand img {
  outline: 1px solid blue;
  width: 100%;
}
<div class="jumbotron">
  <div class="container">

    <nav class="navbar navbar-default">
      <div class="container-fluid">

        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="#">	
            <img src="https://s-media-cache-ak0.pinimg.com/236x/f6/35/e7/f635e7cdfcf59c09236a44df28f53d92.jpg" alt="" />
          </a>
        </div>

        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
          <ul class="nav navbar-nav">
            <li class="active"><a href="#">home<span class="sr-only">(current)</span></a></li>
            <li><a href="#">our services</a></li>
            <li><a href="#">tour package</a></li>
            <li><a href="#">custom tour</a></li>
            <li><a href="#">travel partners</a></li>
            <li><a href="#">contactus</a></li>
          </ul>
        </div>
        
      </div>
    </nav>

    <div class="row text-center">
      <h1>Intro text</h1>    
      <a class="btn btn-primary btn-lg" href="#" role="button">Book a trip</a>
    </div>

  </div><!--container end -->
</div><!--jumbotron end -->

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>

【讨论】:

  • 我使用相同的技术临时修复它。但我发现使用 vw 会导致图像徽标非常小,尝试在小型媒体断点之一。我很欣赏你的解决方案,但如果有更好的方法,请推荐。使用百分比的原始问题本身也很奇怪,想知道人们是如何使用百分比的。
  • 在小媒体上,您可以通过媒体查询使用不同宽度的图像。例如:@media (max-width: 480px) { img { width: 30vw; } }.
  • @rosnk 我已经更新了我的答案。但我仍然不确定我是否理解您想要实现的目标。
【解决方案2】:

您可能需要考虑两件事,

1。 Bootstrap 为navbar-brand 设置了固定高度(50px)。

所以,它不允许任何子元素超过 50px。我们需要将其重置为

.navbar-brand{
 height:auto;
}

另外,您还需要设置padding:0 以使您的图像更大。

2。直接为&lt;img&gt; 应用宽度不是一个好主意。

在你的情况下,你已经给了width:30%。这使得它以移动分辨率在下一行流动。因此,您可以忽略宽度并尝试为图像指定高度。

试试这个,

.navbar-brand{
  border: 1px solid red;
  height:auto;
  padding:0;
}
  
  .navbar-brand img{
    width: auto;
    max-height:48px;
    vertical-align:center;
    border: 1px solid blue;
}

查看您的 codepen 的这个分叉和更新版本。 http://codepen.io/anon/pen/WxJRmL?editors=1100

谢谢!

【讨论】:

    【解决方案3】:

    我不确定是否可以使用纯 CSS 选项。您的 display: inline-block 正在创建一个包含 100% 所需空间的框,即使您已告诉子图像仅在其中渲染 70%。

    你可以把 display: inline-block 去掉,然后用一个迷你桌子包裹你的锚元素(因为桌子有一种固有的“缩小以适应”的心态)但是桌子经常得到不好的代表,而且有点笨拙强制这个结果。

    编辑:所需空间的 100%,我的意思是内联块内托管的子元素所需的空间。因此,即使您将孩子缩小到 70% 或 50%,内联块也已经为 100% 维度的元素“保留”了空间。

    【讨论】:

    • display: inline-block 不会创建占用 100% 可用空间的框,您正在考虑 display: block;inline-block 允许您执行设置 widthheightinline 元素的想法。
    • 我不同意你的观点,我想我只是不清楚我的意思(对不起)。我的意思是这个盒子被创建来覆盖它自己的孩子的原始大小所需的 100% 的空间。
    • 再次抱歉,没有一开始就澄清这一点。因为这是问题的背景,所以我掩饰了它。如果您能理解并接受我的澄清,请取消投票?谢谢。
    • 这里有解决方案来演示:codepen.io/anon/pen/XKqmxJ
    • 抱歉,表格不是合适的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 2018-03-10
    • 2011-12-12
    • 1970-01-01
    相关资源
    最近更新 更多