图片不失真自适应水平垂直居中

想到了一个问题
今天在浏览网页的时候看到一种布局突然就想它是怎么实现的呢,看来下发现不是css实现的,是用js实现的觉得如果没有js帮忙呢,就尝试用css看看能不能实现,发现自己基础真的要好好补下了。。哈哈,anyway,需求如下:
  • 图片在屏幕上方块中水平垂直居中
  • 图片宽度和高度都是不确定的
  • 图片宽度和高度自适应其容器,宽度和高度随着容器变化而变化,这时需保证宽高比不变即图片不被拉长或压缩;还需保证宽度和高度都不能超过原始值的大小,这样图片不会失真
尝试实现一下
常见的未知高度的垂直居中的方法选一种就好了。而不失真自适应的原理就是利用我不太常用的max-width: 100%; max-height=100%; 来保证第三条的实现。如果图片的实际宽或高超过了其容器,因为有上面max的限制,浏览器就会按照其容器的宽或高来限制其超出容器。因为图片高度和宽度都没有设为固定值,则他们的比例一直保持着。如果图片的实际宽或高没有超过其容器,则按原始大小呈现,即便容器再变大图片也不会受影响,自然不会变大失真了。有点儿绕。。。表达能力真作急。。。

代码如下:

<div class="block">
    <div class="pic-wrapper">
        <div class="pic">
        <!--  <span class="helper"></span> -->
        <img src="http://placehold.it/700x500/e8117f/ffffff" alt="" />
   </div>
   </div>
       <div class="bottom">
   </div>
</div>

* {
  box-sizing: border-box;
}
html, body {
  height: 100%;
  margin: 0;
  overflow: hidden;
}

.block {
  position: relative;
  height: 100%;
  overflow: hidden;
  padding-bottom: 50px;
}

.pic-wrapper {
  background-color: #fff;
  height: 100%;
  padding: 100px;
  overflow: hidden;
}
.pic {
  position: relative;
  width: 100%;
  height: 100%;
  text-align: center;
  background-color: #ccc;
}
.pic img {
  display: inline-block;
  max-width: 100%;
  max-height: 100%;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
/*   vertical-align: middle; */
}

.helper {
  display: inline-block;
  height: 100%;
/*   vertical-align: middle; */
}

.bottom {
  position: absolute;
  bottom: 0;
  width: 100%;
  height: 50px;
  background-color: #4488ff;
}
CodePen

See the Pen 图片不失真并且自适应水平垂直居中 by Zhang Xiao (@zhang-xiao) on CodePen.