实例讲解如何如何使用CSS保持页面内容宽高比

我们从自然手上收到的最大礼物就是生命。我必须拼命的奔跑我知道有很多人等着看我狼狈跌倒的下场嘲笑我不自量力

需求描述:移动端实现横跨页面半圆。(类似问题,实现4x4的正方形网格)

简化问题,我们可以理解为实现一个高度和宽度比为1:2的块。

需要解决问题:

       1,高度和宽度按照一定比例。

       2,外容器高度和宽度不确定。

       3,尽量不使用图片和脚本替代。

       4,兼容移动端。

编写html

XML/HTML Code复制内容到剪贴板
  1. <divclass="semicircle"></div>

 

思考一,使用height:100%,

CSS Code复制内容到剪贴板
  1. body{
  2. margin:0;
  3. width:100%;
  4. background:lightblue;
  5. }
  6. .semicircle{
  7. width:100%;
  8. height:100%;
  9. border-top:5pxsolid#fff;
  10. border-radius:100%;
  11. }

  存在问题,height的百分比是根据父容器计算的,不是当前容器,根本满足不了我们的需求。效果如下:

父容器body的高度百分比为其子容器所填充的高度关联,即便设置body高度100%,由于子容器即semicircle所填充的实际高度为边界的5,无法将父容器“全部撑开”,因此无法通过设定父容器的高度为百分比指定宽高按照一定比例的容器。

思考二,设定padding-top或padding-bottom为100%
The percentage is calculated with respect to the width of the generated box's containing block [...] (source: w3.org, emphasis mine)

百分比宽度的计算与所生成盒子的包含块宽度有关。padding-top、padding-bottom的百分比是根据父容器的width(宽度)计算的,而不是height(高度)。其他比例实现对照表

aspect ratio padding-bottom value
16:9 56.25%
4:3 75%
3:2 66.66%
8:5 62.5%
CSS Code复制内容到剪贴板
  1. body{
  2. margin:0;
  3. width:100%;
  4. background:lightblue;
  5. }
  6. .semicircle{
  7. width:100%;
  8. height:0;
  9. padding-bottom:100%;
  10. border-top:5pxsolid#fff;
  11. border-radius:100%;
  12. }

思考三,使用vw单元
使用vw单元设定元素高度和宽度,vm的大小是通过viewport的宽度设定的,因此可以通过该方法保持容器按照一定比例显示。一单位的vw等于百分之一的viewport宽度,即100vw等于100%viewport宽度。

CSS Code复制内容到剪贴板
  1. body{
  2. margin:0;
  3. width:100%;
  4. background:lightblue;
  5. }
  6. .semicircle{
  7. width:100vw;
  8. height:100vw;
  9. border-top:5pxsolid#fff;
  10. border-radius:100%;
  11. }

对照表

aspect ratio multiply width by
1:1 1
1:3 3
4:3 0.75
16:9 0.5625


思考四,使用伪元素和inline-block布局

CSS Code复制内容到剪贴板
  1. body{
  2. width:100%;
  3. font-size:0;
  4. text-align:center;
  5. background:lightblue;
  6. }
  7. .semicircle{
  8. border-top:5pxsolid#fff;
  9. border-radius:100%;
  10. }
  11. .semicircle:before{
  12. content:"";
  13. display:inline-block;
  14. padding-bottom:100%;
  15. }

虽然代码有点复杂,但是灵活性强,可以实现更多类似的效果。

当需求改成实现一个横跨屏幕80%的宽度的半圆,我们只需要在.semicircle中添加属性width:80%;,顺便也把容器居中实现了。

该方法的原理很清晰:

参考思考一,无法通过高度100%来扩充外容器高度,那么可以通过伪元素,插入一个高度和宽度一致的元素,将容器撑开成一比一高度的容器。注意,该方法实现半圆,实际需要宽高为一比一的容器,即占用空间为上述方法的两倍。

设置:before元素边界,解析原理:

思考五,使用图片,兼容低档次移动设备。

CSS Code复制内容到剪贴板
  1. .semicirclerimg{
  2. width:100%;
  3. background-repeat:no-repeat;
  4. background-size:100%100%;
  5. background-image:url(../img/autoresized-picture.jpg);
  6. }

使用脚本,css更加简洁明了,目标清晰。

CSS Code复制内容到剪贴板
  1. div.style.height=div.offsetWidth+"px";

对于实现2*2正方形网格

CSS Code复制内容到剪贴板
  1. *------maincode-------*/
  2. body{
  3. width:100%;
  4. margin:0;
  5. text-align:center;
  6. }
  7. div{
  8. display:inline-block;
  9. width:50%;
  10. background:lightblue;
  11. font-size:12px;
  12. position:relative;
  13. vertical-align:middle;
  14. }
  15. div:before{
  16. content:"";
  17. display:inline-block;
  18. padding-bottom:100%;
  19. vertical-align:middle;
  20. }
  21. /*------othercode-------*/
  22. div:nth-child(2),div:nth-child(3){
  23. background:pink;
  24. }
  25. span{
  26. display:inline-block;
  27. vertical-align:middle;
  28. font-size:6em;
  29. color:#fff;
  30. }

到此这篇关于实例讲解如何如何使用CSS保持页面内容宽高比就介绍到这了。喜迎阴晴圆缺,笑傲风霜雨雪更多相关实例讲解如何如何使用CSS保持页面内容宽高比内容请查看相关栏目,小编编辑不易,再次感谢大家的支持!

您可能有感兴趣的文章
css让页脚保持在底部位置的四种方案

CSS如何使用Flex和Grid布局如何实现3D骰子

Flex布局史上最简单使用语法教程

新的CSS 伪类函数 :is() 和 :where()示例详解

纯CSS打字动画的如何实现示例