需求描述:移动端实现横跨页面半圆。(类似问题,实现4x4的正方形网格)
实例讲解如何使用CSS保持页面内容宽高比

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

需要解决问题:

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

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

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

       4,兼容移动端。

编写html

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

 

思考一,使用height:100%,

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

  存在问题,height的百分比是根据父容器计算的,不是当前容器,根本满足不了我们的需求。效果如下:
实例讲解如何使用CSS保持页面内容宽高比

父容器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.   
  2. body{   
  3.     margin:0;   
  4.     width: 100%;   
  5.     background: lightblue;   
  6. }   
  7.   
  8. .semicircle {   
  9.     width: 100%;   
  10.     height: 0;   
  11.   
  12.     padding-bottom: 100%;   
  13.     border-top:5px solid #fff;   
  14.     border-radius: 100%;   
  15. }  

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

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

对照表

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:5px solid #fff;   
  9.     border-radius: 100%;   
  10. }   
  11.   
  12. .semicircle:before {   
  13.     content:"";   
  14.     display: inline-block;   
  15.     padding-bottom: 100%;   
  16. }  

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

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

该方法的原理很清晰:

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

设置:before元素边界,解析原理:
实例讲解如何使用CSS保持页面内容宽高比

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

CSS Code复制内容到剪贴板
  1. .semicircler img {   
  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保持页面内容宽高比

CSS Code复制内容到剪贴板
  1. *------main code-------*/   
  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.   
  16.         div:before {   
  17.             content:"";   
  18.             display: inline-block;   
  19.             padding-bottom: 100%;   
  20.             vertical-align: middle;   
  21.   
  22.         }   
  23.   
  24.         /*------other code-------*/  
  25.         div:nth-child(2),div:nth-child(3){   
  26.             background: pink;   
  27.         }   
  28.   
  29.   
  30.         span {   
  31.             display: inline-block;   
  32.             vertical-align: middle;   
  33.             font-size: 6em;   
  34.             color: #fff;   
  35.         }          

       

广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。