【问题标题】:How to create a centered <div> which automatically shrinks if it doesn't fit within the viewport?如何创建一个居中的 <div> 如果它不适合视口,它会自动缩小?
【发布时间】:2016-11-17 19:00:40
【问题描述】:

我想让我的 HTML5 视频框在具有固定宽度的

中垂直和水平居中。棘手的是,当视口的高度或宽度小于视频时,我希望视频缩小以完全适合视口。

当然我想在没有 JavaScript 的情况下完成大小调整。我很好,如果旧版浏览器无法调整大小。

我实际上找到了一个非常好的解决方案(参见下面的代码)。但是我对此感觉很不好,因为基于 WebKit 的浏览器对某些 CSS 的理解不同于 IE 11、10 和 9(而 FireFox 在这两者之上)

为了达到预期的效果,我将视频和外部容器 (#parent) 的最大宽度设置为 100%。

但这不适用于 Internet Explorer 11、10 和 9。看起来 IE 将 #parent video {max-width:100%} 解释为 100% 的视频而不是包含块。因此,视频会从其容器中伸出,并且不会调整大小。但是,如果我设置#parent video {width:100%},IE 会表现良好。

另一方面,基于 WebKit 的浏览器(Safari、Chrome、新 Opera)需要#parent video {width:auto}。否则,如果视口的垂直尺寸太小希望视频缩小,它们的行为就会不好。 (在我的示例中,您将看到蓝色背景,视频应完全覆盖。)

所以我的问题是:

  • 标准怎么说:是 WebKit 还是 IE 正确?或者 FireFox 和 Edge 是否正确,将最大宽度和/或宽度设置为 100%(或两者)都可以?
  • 我的代码和目标是否可能与此无关,CSS 有什么可能并且只是偶然?
  • 您知道完成此自收缩视频的更好解决方案吗?

这是我的“解决方案”:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=Edge" >

  <script type="text/javascript">
    document.documentElement.setAttribute('data-useragent', navigator.userAgent);
  </script>

  <style>
  #parent{
    position: fixed;
    left: 20px;  top: 0;
    height: 100%;  width: 600px;
    max-width: 100%;  max-width: calc(100% - 40px);
    background-color: gray;
    display: flex;
    align-items: center;  justify-content:center;
  }
  #parent > div {
    position: relative;
    border: 10px solid white;
    background-color:blue;
    margin: 30px;
  }
  #parent video {
    display: block;
    object-fit: contain;
    max-height: calc(100vh - 80px);
    max-width: 100%;
    width: 100%; /* needed by IE and older browsers (e.g. FireFox 21) */
  }
  @supports(display:flex){ /* all newer browser (but not IE 11 & IE 10, which have flex but not @supports) */
    #parent video {
    width: auto; /* needed by Chrome, Safari and new Opera (while FireFox and Edge are also fine with width:100%) */
    }
  }
  #parent div#close {
    position: absolute;
    right: -17px;  top: -17px;  width: 20px; height: 20px;
    border: 1px solid gray;  border-radius: 100%;  background-color: white;
  }


  /* additional styling for older browsers not supporting flexbox */
  #parent {
    text-align:center;
    white-space:nowrap;
  }
  #parent::after {
    display:inline-block;
    vertical-align:middle;
    content:" ";
    height:100%; width:0;
  }
  #parent > div {
    display:inline-block;
    vertical-align:middle;
  }
  html[data-useragent*='Presto'] #parent,
  html[data-useragent*='MSIE 10.0'] #parent {
    display:block; /* IE10 and old Opera have a broken flexbox implementation */
  }
  </style>

</head>

<body>

  <div id="parent">
    <div id="inner">
      <video controls>
        <source src="http://techslides.com/demos/sample-videos/small.mp4" type="video/mp4"/>
        <source src="http://techslides.com/demos/sample-videos/small.ogv" type="video/ogg"/>
      </video>
      <div id="close">X<div>
    </div>
  </div>

</body>
</html>

这是一个小提琴https://jsfiddle.net/6vu42zxr

【问题讨论】:

  • 那么在 IE 和 Chrome 中,相同的 CSS 工作方式不同,对吧?
  • 没错:IE 需要#parent video {width:100%},Chrome/Safari/Opera 需要#parent video {width:auto},而 FireFox 和 Edge 可以同时使用

标签: html css html5-video


【解决方案1】:

我的理解是您在 IE 和 Webkit 浏览器上遇到 CSS 问题。为什么不为 IE 浏览器正确分离 CSS?这将只针对 IE 浏览器。这样您就可以为 IE 和 chrome 以及其他浏览器提供单独的 CSS。

针对所有版本的 IE 仅 CSS:

<!--[if IE]>
    <link rel="stylesheet" type="text/css" href="all-ie-only.css" />
<![endif]-->

除了 IE 浏览器之外的所有目标:

<!--[if !IE]><!-->
    <link rel="stylesheet" type="text/css" href="not-ie.css" />
 <!--<![endif]-->

仅针对 IE 7 浏览器:

<!--[if IE 7]>
    <link rel="stylesheet" type="text/css" href="ie7.css">
<![endif]-->

仅针对 IE 6 浏览器:

<!--[if IE 6]>
    <link rel="stylesheet" type="text/css" href="ie6.css" />
<![endif]-->

目标 IE 8 和 LOWER 浏览器:

<!--[if lt IE 9]>
    <link rel="stylesheet" type="text/css" href="ie8-and-down.css" />
<![endif]-->

为什么要使用条件样式表?

  • 保持您的代码不受黑客攻击且有效。
  • 保持主样式表整洁。
  • 易于编辑和维护仅 IE 的 CSS。
  • 请记住,这些条件标记可用于加载 JavaScript 或任何与 IE 浏览器相关的内容。

【讨论】:

  • 感谢您的努力,但您知道条件 cmets 在 IE10 及更高版本中不再工作吗? (所以如果我强制 IE10 和 IE11 以 IE9 兼容模式呈现我的页面,我只能使用它们,我不喜欢这样做)此外,我不需要知道如何为不同的浏览器提供不同的 CSS(有几种可用的技术)。我想知道我的代码是否可靠。那么根据规范哪个 CSS 是正确的?或者我可以实现相同的目标而不需要针对不同的浏览器使用不同的 CSS?
猜你喜欢
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 2020-01-30
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多