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

所属分类: 网页制作 / CSS 阅读数: 1295
收藏 0 赞 0 分享

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

简化问题,我们可以理解为实现一个高度和宽度比为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的百分比是根据父容器计算的,不是当前容器,根本满足不了我们的需求。效果如下:
201624114439239.jpg (423×143)

父容器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-aligncenter;   
  5.     background: lightblue;   
  6. }   
  7. .semicircle {   
  8.     border-top:5px solid #fff;   
  9.     border-radius: 100%;   
  10. }   
  11.   
  12. .semicircle:before {   
  13.     content:"";   
  14.     displayinline-block;   
  15.     padding-bottom: 100%;   
  16. }  

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

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

该方法的原理很清晰:

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

设置:before元素边界,解析原理:
201624114500101.jpg (423×491)

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

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

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

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

 

对于实现2*2正方形网格
201624114515193.jpg (421×766)

CSS Code复制内容到剪贴板
  1. *------main code-------*/   
  2.         body {   
  3.           width: 100%;   
  4.           margin:0;   
  5.           text-aligncenter;   
  6.         }   
  7.         div{   
  8.           displayinline-block;   
  9.           width: 50%;   
  10.           background: lightblue;   
  11.           font-size12px;   
  12.           positionrelative;   
  13.           vertical-alignmiddle;   
  14.         }   
  15.   
  16.         div:before {   
  17.             content:"";   
  18.             displayinline-block;   
  19.             padding-bottom: 100%;   
  20.             vertical-alignmiddle;   
  21.   
  22.         }   
  23.   
  24.         /*------other code-------*/  
  25.         div:nth-child(2),div:nth-child(3){   
  26.             background: pink;   
  27.         }   
  28.   
  29.   
  30.         span {   
  31.             displayinline-block;   
  32.             vertical-alignmiddle;   
  33.             font-size: 6em;   
  34.             color#fff;   
  35.         }          

       

更多精彩内容其他人还在看

CSS配合JavaScript做酷的动态页面效果

  利用CSS配合JavaScript的可以做很多更酷的动态页面效果,在本教程的最后给大家简单介绍一下CSS配合JS的应用。首先,要搞清楚事件和动作的概念。在客户端脚本中,JavaScript 通过对事件进行响应来获得与用户的交互。例如,当用户单击一个按钮或者在某段文字上移动鼠标
收藏 0 赞 0 分享

WEB标准,Web前端开发工程师必备技术列表

  想要打造并拥有一流的Web产品开发团队,在团队成员基础能力上一定要下功夫。对于Web前端产品开发来说,仅仅掌握Web1.0时代简单的"网页套接"是完全不够的。我结合自己的团队配备,特此罗列了Web前端产品工程师所涉及的技能列表如下:   通过许多实际项目,
收藏 0 赞 0 分享

用CSS制作Alpha滤镜测试板

alpha滤镜给制作网页特效提供了较大的创作空间,但由于它控制参数较多,在实际应用时,为了确定一组合适的参数值,不得不反复调整修改,在编辑窗口和预览窗口来回倒腾,甚是麻烦,本文介绍了一种简单的方法。制作一个“Alpha滤镜参数测试板”,在测试板上输入参数
收藏 0 赞 0 分享

非常流行的所谓的气泡窗口

普通的Alt无法自定义风格,而Sweet Titles通过JS脚本与CSS的集合.自定义了这种伪Alt风格. 前一段时间非常流行的,就所谓的气泡窗口(鼠标移到链接处出现的). 我们这里实现的用的是Sweet Titles的插件.显示效果完全由CSS控制.. 先下载Sweet Ti
收藏 0 赞 0 分享

CSS教程:li和ul标签用法举例

LI代码的格式化: A).运用CSS格式化列表符: ul li{ list-style-type:none; } B).如果你想将列表符换成图像,则: ul li{ list-style-type:none; list-style-image: url(/blog/images/
收藏 0 赞 0 分享

CSS教程:CSS中的定位(position)

  使用CSS来定位页面内层的位置,一直是比较难以掌握的事情,很多时候,往往被绝对定位的元素,总是以浏览器的左上角为坐标原点,此时,如果浏览器的大小改变,被定义的层就会偏离设计想要的位置,让人很挠头。   其实,要想控制好层的绝对定位,只要理解CSS中关于定位
收藏 0 赞 0 分享

CSS教程:盒模型(BOX Model)

  如果想熟练掌握DIV和CSS的布局方法,首先要对盒模型有足够的了解。每个HTML元素都可以看作一个装了东西的盒子,盒子里面的内容到盒子的边框之间的距离即填充(padding),盒子本身有边框(border),而盒子边框外和其他盒子之间,还有边界(margin),如图1所示。
收藏 0 赞 0 分享

无延迟翻滚的图形与CSS混合风格按钮

  在一个具有图形背景的按钮中添加CSS风格的文本,这种建立按钮的方法结合了具有CSS翻滚(CSS rollover)标记的开发速度和效率,从而有效地提高按钮外表图像的三维效果。   相比于常规的图形按钮,这些图形/CSS混合按钮可易于建立和载入,因为你只需要为空白按钮外面
收藏 0 赞 0 分享

css里expression实现界面对象的批量控制

用过css样式我们就知道, 可以定义一批对象的class属性来指定同一个样式来统一界面. 但如何统一同类型的对象的事件? 比如:界面有无数个 <img src="**.jpg"> 如何实现鼠标经过此图片, 图片的src变成是**_over.jpg?
收藏 0 赞 0 分享

CSS教程:水平对齐(text-align)

  水平对齐(text-align),用以设定元素内文本的水平对齐方式。   1.语法   text-align具体参数如下: 语法:text-align:left|right|center|justify 说明:设定元素内文本的水平对齐方式。 参数:left:左
收藏 0 赞 0 分享
查看更多