CSS缩放高度以匹配宽度 - 可能与外形尺寸

Posted

技术标签:

【中文标题】CSS缩放高度以匹配宽度 - 可能与外形尺寸【英文标题】:CSS scale height to match width - possibly with a formfactor 【发布时间】:2012-06-29 21:08:10 【问题描述】:

我在 twitterBootstrap 基本响应式设计网站中实现了 GoogleMapsV3 地图。

但我的问题很简单:我有:

<div id="map"></map>

#map width: 100%; height: 200px 

我希望能够将高度更改为外形尺寸。就像在这个“我梦中的 CSS”中

#map  width: 100%; height: width * 1.72 

我尝试过忽略高度、设置为自动以及各种类型的参数 - 但只是为了让 div 总是在我身上塌陷。

我写一个 js 解决方案没有问题,但希望有一个简单干净的 CSS 解决方案,可能是 CSS3

如果不可能,那么让我摆脱这种情况的最佳方法是什么? (计时器、事件……或类似的)

【问题讨论】:

【参考方案1】:

来了。纯 CSS。您确实需要一个额外的“容器”元素。

小提琴

(实际上是 tinkerbin):http://tinkerbin.com/rQ71nWDT (小叮当死了。)

解决方案。

注意 我在整个示例中使用的是 100%。你可以使用任何你喜欢的百分比。

由于高度百分比是相对于父元素的高度,我们不能依赖它。我们必须依靠别的东西。幸运的是,填充是相对于宽度的——无论是水平填充还是垂直填充。在padding-xyz: 100% 中,100% 等于框宽度的 100%。

不幸的是,填充就是这样,填充。内容框的高度为 0。没问题!

粘贴一个绝对定位的元素,给它 100% 的宽度和 100% 的高度,并将其用作您的实际内容框。 100% 高度有效,因为绝对定位元素的百分比高度是相对于它们相对定位的框的填充框。

html

<div id="map_container">
  <div id="map">
  </div>
</div>   

CSS:

#map_container 
  position: relative;
  width: 100%;
  padding-bottom: 100%;


#map 
  position: absolute;
  width: 100%;
  height: 100%;

【讨论】:

正是我想要的。但是由于我认为的其他因素,它在我的环境中不起作用(在 twitterbootstrap 中,或者由于内容是通过 json 注入的事实)......而且由于 greg 有一个简单的 js......我会去的 @JOPLOmacedo,您提供的链接现在已损坏。 :( 要将此示例更改为其他比例(例如 2:1),您只需更改 padding-bottom(在本例中为 50%)而不是 100% 的其他实例 不,它没有。你可能错过了一些小东西。在这里查看jsbin.com/moficipako/edit?html,css,output 这个答案不正确!填充是根据包含框计算的,即父框(参见:W3C)。所以它只适用于#map_container 的宽度为100% 的情况。如果您将#map_container 的宽度设置为固定宽度,例如250px 你会看到高度仍然等于父元素的宽度。【参考方案2】:

您可以尝试使用vw 作为高度。 https://developer.mozilla.org/en/docs/Web/CSS/length

类似

div#map 
     width: 100%;
     height: 60vw;

这会将 div 的宽度设置为视口宽度的 60%。您可能需要使用 calc 进行调整以将填充考虑在内……

【讨论】:

你能再解释一下吗?为什么这不给 div 一个 60% 视图宽度的高度和一个 100% 的父级宽度? 这里是视口单位的支持表。 caniuse.com/#feat=viewport-units @LukeP height: 60% 尝试* 将高度设置为 父元素高度 的 60%,而 height: 60vw 将高度设置为 视口宽度,所以它们是完全不同的。 (*仅当父级具有设定的高度时才有效,而不是让它保持在它需要的高度以包含它的子级,这通常是您想要做的)【参考方案3】:

为此,您将需要使用 javascript,或依赖受支持的 calc() CSS 表达式。

window.addEventListener("resize", function(e) 
    var mapElement = document.getElementById("map");
    mapElement.style.height = mapElement.offsetWidth * 1.72;
);

或使用 CSS calc(在此处查看支持:http://caniuse.com/calc)

#map 
    width: 100%;
    height: calc(100vw * 1.72)

【讨论】:

height: calc(width * 1.75) 无论如何都无效 在我添加了一些单位之前,它对我不起作用:mapElement.style.height = Math.floor(mapElement.offsetWidth * 1.72) + 'px'; height:calc (100vw * 1.75) 有效 - vw 表示视图宽度 @cyrille 175vw 还不够吗?! 我希望 calc(height * 2)calc(width * 2) 有效【参考方案4】:
.video 
    width: 100%;
    position: relative;
    padding-bottom: 56.25%; /* ratio 16/9 */


.video iframe 
    border: none;
    position: absolute;
    width: 100%;
    height: 100%;

16:9

底部填充 = 9/16 * 100 = 56.25

【讨论】:

很遗憾,这不起作用。它只是在 div 的底部添加空间。【参考方案5】:

试试视口

您可以使用宽度数据并相应地计算高度

此示例适用于 150x200 像素的图片

width: calc(100vw / 2 - 30px);
height: calc((100vw/2 - 30px) * 1.34);

【讨论】:

【参考方案6】:

我需要做“流动”的矩形而不是正方形....所以感谢 JOPL....只花了一分钟....

#map_container 
     position: relative;
     width: 100%;
     padding-bottom: 75%;



#map 
    position:absolute;
    width:100%;
    height:100%;

【讨论】:

【参考方案7】:

您可以设置其beforeafter 以强制保持恒定的宽高比

HTML:

<div class="squared"></div>

CSS:

.squared 
  background: #333;
  width: 300px; 

.squared::before 
  content: '';
  padding-top: 100%;
  float: left;

.squared::after 
  content: '';
  display: block;
  clear: both;

【讨论】:

【参考方案8】:

让我将 JS 解决方案描述为单独的答案:

function handleResize()

  var mapElement = document.getElementById("map");
  mapElement.style.height = (mapElement.offsetWidth * 1.72) + "px";


<div id="map" onresize="handleResize()">...</div>

(或动态注册事件监听器)。

mapElement.style.width * 1.72 不起作用,因为它要求在元素上显式设置宽度,使用width DOM 属性或内联样式的width CSS 属性。

【讨论】:

【参考方案9】:

用 Jquery 解决

$(window).resize(function () 
    var width = $("#map").width();
    $("#map").height(width * 1.72);
);

【讨论】:

【参考方案10】:

我用 YouTube 的 IFRAME 做了类似的事情,其中​​ iframe 位于始终根据纵向/横向更改的网格内,因此此代码适用于:

所以这个问题的代码是:

// Layout resize
let height = window.innerHeight;
let width = window.document.getElementById('player').parentNode.clientWidth;
    height = width / 1.77;
<div id="player"></div>

... etc ..

function onYouTubeIframeAPIReady() 
          // Layout resize
          let height = window.innerHeight;
          let width = window.document.getElementById('player').parentNode.clientWidth;
              height = width / 1.77;

          player = new YT.Player('player', 
            width: '100%',
            height: height,            
            videoId: currentVideoId,
            playerVars: 
              'autoplay': 0,
              'loop': 0,
              'mute': 0,
              'controls': 0,
              'enablejsapi': 1,
              'playsinline': 0,
              'rel': 0,
              'widget_referrer': 'http://my domain ...'
            ,
            events: 
              'onReady': onPlayerReady,
              'onStateChange': onPlayerStateChange,
              'onError': onError
            
          );
        

【讨论】:

【参考方案11】:
#map  
    width: 100%; 
    height: 100vw * 1.72 

【讨论】:

以上是关于CSS缩放高度以匹配宽度 - 可能与外形尺寸的主要内容,如果未能解决你的问题,请参考以下文章

CSS背景图像以适应宽度,高度应按比例自动缩放

CSS背景图像以适应宽度,高度应按比例自动缩放

FFMPEG - 宽度/高度不能被 2 整除(缩放以生成 MBR 输出)

使用 CSS 缩放对象元素高度与宽度成比例 + 常量

自动缩放图像以匹配文本高度

使用 CSS 将 div 内的图像向上和/或向下缩放以适应图像的最大边