纯css实现div高度自适应

背景

在开发活动页h5的情况下,很多元素都是背景图加DIV构成的,在如今响应式布局的要求下,很多能自动调整尺寸的元素能够做到高宽自适应,如img,通过{width:50%;height:auto;}实现图片高度跟随宽度比例调整。

然而,用的最多的标签一哥Div却不能做到自动调整(要么从父级继承,要么自行指定px,要么给百分比!但是这个百分比是根据父级的高度来计算的,根本不是根据元素自身的宽度,那么就做不到Div的宽高达成一定的比例=-=),所以造成某些定位于某些背景图片上的内容区域不能自适应,造成某些机型样式对齐困难。

解决办法

最开始的思路就是像react-native一样通过获取宽度,通过比例求出高度。所以需要通过js动态判断div的宽度来设置高度。

window.onresize = function(){}

感觉实现起来很别扭就放弃了。

仔细回顾了下css,最终通过padding来实现此功能;我们能够知道宽度的自适应是根据viewport的width来调整的,比如{width:50%}就是浏览器可视区域的50%,resize之后也会自动调整。

而height指定百分比后,他会自行找到viewport的height来调整,跟width没有任何关系,自然两者不能达到比例关系了。通过这个思路,要找到一个能跟viewport的width扯上裙带关系的属性,就能解决这个问题了。

这个属性就是padding,padding是根据viewport的width来调整的,巧就巧在padding-top和padding-bottom也是根据viewport的width来计算的,那么通过设置这个属性就能跟width达成某种比例关系了,

我们首先指定元素的width为父级元素的90%(父级元素为任意有高宽的元素)

.father{
    max-width: 768px;
    height: 100%;
    margin: 0 auto;
    background-color: #222;
}

这个时候我们再设置element的height为0,padding-bottom:90%;

.element{
    width: 90%;
    margin: 0 auto;
    background-color: #eee;
    height: 0;
    padding-bottom: 90%;
}

element就变成了一个宽度90%,高度为0(但是他有90%width的padding-bottom)的自适应宽度的正方形了,效果如下图


image.png
image.png

这个时候可能有人要问了,这个div的高度为0,那如果我要在element里放置元素呢,那岂不是overflow了,这里就要提到overflow属性了,它的计算是包括div的content和padding的,也就是说,

原来你的div可能是个{width:50px;height:50px;padding:0}的div,现在变成{width:50px;height:0;padding-bottom:50px;}的div了,尺寸还是一样的,通过指定这个div的子元素的定位,一样可以正常显示

这样就可以通过设定父级元素father、我们需要的元素element、子级元素datail来实现任意情况下该需求(div宽高定比例)。

你可能感兴趣的:(纯css实现div高度自适应)