移动端巧用margin/padding的百分比实现自适应

写于2017-07-03,搬家至此;
今天遇到了一个曾经认为的世纪大难题----图片完美的自适应;

重要!敲黑板,划重点!!

margin/padding取值形式为百分比的值时,无论是left/right,还是top/bottom,都是以父元素的width为参照物的!-----来自W3C标准

所以,很有必要深入研读下W3C规范;

举个栗子

要求:在每个原图长宽比例不同的情况下,实现如图的效果,且图片宽高是百分比;

前提是不使用js

image.png

我之前的错代码

<li>
      <img src="">
      <img src="">
      <img src="">
</li>
li{
   width:100%;
}
li img {
	width: 32%;
	float: left;
	margin-right: 2%; 
}

结果是这样的————按照图片原始比例高度自适应的;

image.png

解决办法–设置容器的子元素或伪元素padding-bottom/top

使用margin/padding的百分比值来解决自适应高度的关键在于:

容器margin/padding的百分比参照物是父元素的宽度,而容器的width的百分比参照物也是父元素的宽度,俩属性参照物一致,那么想要把这俩属性的值统一起来就很简单了;

img加一个div父容器,用百分比给div一个宽,则给父容器的伪元素padding-bottom的百分比来占位。容器做好之后,img用相对定位top:0;left:0;width:100%;height:100%填满整个div就ok了。经测试,直接给父容器加padding-bottom百分比也可以,但是加在伪元素上更好;

<li>
     <div class="flex-pic">
            <img src="">
     </div>
     <div class="flex-pic">
            <img src="">
     </div>
     <div class="flex-pic">
            <img src="">
     </div>
</li>

li{
    width:100%;
}
li  .flex-pic{

	width: 32%;

	float: left;

	margin-right: 2%; 

	margin-top: 8px;

	position: relative;

	z-index: 2;

	overflow:hidden; 

	background:center center no-repeat;

}

.flex-pic:before{

	content: "";

	display:inline-block;

	padding-bottom:75%;

	width: 100%;

	pointer-events: none;

	z-index: -1;	

}

.flex-pic img{

	width:100%; 

	height:100%; 

    position:absolute;

    top: 0;

    left: 0;

}

总结

自适应的精髓在于宽度,margin/padding设置百分比弥补了元素高度无法自适应地与元素宽度保持一致的缺陷;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现html二级菜单的自动宽度可以使用CSS的flex布局和百分比宽度。 首先,将菜单项放在一个父元素中,使用display:flex来设置flex布局。然后,将菜单项的宽度设置为百分比,这样就可以根据父元素的宽度自动调整菜单项的宽度了。 例如: HTML代码: ``` <div class="menu"> <ul> <li><a href="#">菜单1</a> <ul> <li><a href="#">子菜单1</a></li> <li><a href="#">子菜单2</a></li> <li><a href="#">子菜单3</a></li> </ul> </li> <li><a href="#">菜单2</a> <ul> <li><a href="#">子菜单1</a></li> <li><a href="#">子菜单2</a></li> </ul> </li> <li><a href="#">菜单3</a> <ul> <li><a href="#">子菜单1</a></li> <li><a href="#">子菜单2</a></li> <li><a href="#">子菜单3</a></li> <li><a href="#">子菜单4</a></li> </ul> </li> </ul> </div> ``` CSS代码: ``` .menu { display: flex; justify-content: space-between; } .menu ul { padding: 0; margin: 0; list-style: none; display: flex; } .menu ul li { position: relative; flex: 1; } .menu ul li a { display: block; padding: 10px; background: #f2f2f2; text-align: center; text-decoration: none; color: #333; } .menu ul li ul { position: absolute; top: 100%; left: 0; width: 100%; display: none; background: #fff; z-index: 1; } .menu ul li:hover > ul { display: block; } .menu ul li ul li { display: block; } .menu ul li ul li a { display: block; padding: 10px; background: #f2f2f2; text-align: center; text-decoration: none; color: #333; width: 100%; } ``` 这样,菜单项的宽度将自动根据父元素的宽度进行调整,实现了自适应宽度的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值