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

本文介绍了一种利用CSS的padding百分比值实现容器高度自适应的技巧,这种方法可以使容器高度与宽度保持一致,解决了图片加载前容器高度为零导致的布局问题。

一个基础却又容易混淆的css知识点

  本文依赖于一个基础却又容易混淆的css知识点:当margin/padding取形式为百分比的值时,无论是left/right,还是top/bottom,都是以父元素的width为参照物的!

W3C的规范:

Note that in a horizontal flow, percentages on ‘margin-top’ and ‘margin-bottom’ are relative to the width of the containing block, 
not the height (and in vertical flow, ‘margin-left’ and ‘margin-right’ are relative to the height, not the width). Note that percentages on ‘padding-top’ and ‘padding-bottom’ are relative to the width of the containing block,
not the height (at least in a horizontal flow; in a vertical flow they are relative to the height).

((absolute relative)定位中 left/right 依赖的是父元素的宽度,top/bottom依赖的是父元素的高度)

例如在移动端实现这样的效果:

在移动端,由于各机型分辨率相差太大,终究靠百分比来实现自适应:

  •   容器宽度设个50%吧,这样一行放俩容器,各占屏幕宽度一半,没问题。
  •   图片宽度设个100%取容器的宽度,没问题。
  •   容器高度没法设置啊,因为容器宽高的参照物不一样,而且需求是高度与宽度一致,所以无法通过为容器高度设置百分比来达成,那就只能靠内容高度撑开了。
  •   容器的内容高度就是图片的高度,若图片是正方形,则图片高度与图片宽度一致,也即与容器宽度一致,看起来没问题是吧?实际上,在浏览器把图片加载出来以前,图片的高度是零,那可就没办法把容器撑开了.

  

 这样一来,即使图片加载速度很快,容器在图片加载前后都会有一个变型的过程,也就是俗称的“闪烁”,而如果图片加载不出来,整体布局就更是难看了。

  现在问题已经出来了,就是如何做到不靠图片本身就能把容器的高度撑开。

 

设置容器的padding-bottom/top

  使用margin/padding的百分比值来解决自适应高度的关键在于:容器margin/padding的百分比参照物是父元素的宽度,而容器的width的百分比参照物也是父元素的宽度,俩属性参照物一致,那么想要把这俩属性的值统一起来就很简单了。

从盒子模型可以看出,虽然容器的内容高度为0,但由于有了跟内容宽度一致的padding,因此整体视觉效果上像是被撑开了。此方案浏览器兼容性很不错,唯一的缺陷是无法给容器设置max-height属性了,因为max-height只能限制内容高度,而不能限制padding

给子元素/伪元素设置margin/padding撑开容器

  从上面的方案看出max-height失效的原因是容器的高度本来就是padding撑的,而内容高度为0,max-height无法起作用。那想要优化这一点,唯一的方法就是利用内容高度来撑开而非padding,这个方案跟消除浮动所用的方案非常相似:给容器添加一个子元素/伪元素,并把子元素/伪元素的margin/padding设为100%,使其实际高度相当于容器的宽度,如此一来,便能把容器的高度撑至与宽度一致了。由于添加子元素与HTML语义化相悖,因此更推荐使用伪元素(:after)来实现此方案。

 
 
 ul li{
            overflow: hidden;
        }
        ul li > .lister {
            float: left;
            width: 50%;
            background-color: #ccc;
            position: relative;
            padding-top: 60%;
        }

 此时视觉效果上与上一方案无异,重点来看看此时容器的盒子模型:

可以看出,此时容器的内容高度与内容宽度一致,妈妈再也不用担心我无法通过max-height来限制容器高度了。

  另外,使用margin的话需要考虑margin折叠的问题(参考),padding则无此烦恼。

容器内部如何添加内容

  上述方案只提及如何不依赖容器内容来撑开容器,那么,在撑开容器后,如何给容器添加内容(图片、文本等)呢?

  答案很简单,那就是利用position: absolute;

ul li > .lister img {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            padding: 10%;
        }

        ul li > .lister p {
            position: absolute;
            top: 84%;
            left: 0;
            text-align: center;
            width: 100%;
        }

后补

宽高不一致的自适应怎么做?

  有朋友可能会问,上面提到的都是宽度与高度一致的情况,如果不一致那怎么办呢?其实自适应的重点在于,元素的宽高必须维持一个固定的比例,比如说宽高一致比例就是1:1,宽是高的两倍那就是2:1,只要这个比例是明确而且固定的,那么只需要相应地修改margin/padding的百分比值即可适应不同的宽高比例。

 

还有其它的宽高自适应方案吗?

  当然有,比如说css3新推出的长度单位vw,就是以屏幕宽度为参照物的,只要给元素的width和height都用上vw单位,那width跟height就可以轻易设成一样的了,不过既然是css3,浏览器兼容性肯定成问题:

 

总结

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

 

总结来自:http://www.gzhijing.com/html/news/2016-1-20/949.html

 

转载于:https://www.cnblogs.com/xiaofenguo/p/6072860.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化并行计算等改进策略。; 适合人群:具备一定Python编程基础优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
<think>嗯,用户问的是CSS中marginpadding使用百分比时的规则。这个问题看起来不复杂,但里面可能有些细节需要注意。首先,我得确认百分比到底是相对于哪个元素的哪个属性计算的。 记得标准里说过,marginpadding百分比值都是相对于包含块的宽度来计算,无论是上下还是左右边距。比如,如果一个元素的包含块宽度是1000px,那么margin-top: 10%就是100px,不管是垂直还是水平方向都是这样。那为什么会有这样的设计呢?可能是因为在流动布局中,宽度通常是自适应的,而高度可能不确定,所以统一用宽度作为基准,保持一致性。 不过,用户可能会遇到一些特殊情况,比如绝对定位元素的情况。绝对定位元素的包含块可能是最近的定位祖先,这时候百分比的计算就会基于那个祖先的宽度。但如果是固定定位,可能相对于视口的宽度。这些情况需要分清楚。 然后,有没有例外情况呢?比如,在Flex或Grid布局中,这个规则是否适用?根据我的记忆,即使是在Flex或Grid容器里,marginpadding百分比依然是根据包含块的宽度来计算,但可能需要考虑主轴方向的影响。不过,这可能需要进一步验证。 接下来,用户可能会想知道如何应用这些规则,比如实现宽高比固定的盒子。比如,设置padding-top为50%可以创建一个宽高比为2:1的容器。这时候内部内容需要用绝对定位来填充,避免内容溢出。这个方法在响应式设计中挺常见的,特别是处理图片或视频的比例。 还有,用户可能遇到父元素宽度变化时,边距填充如何自适应。比如,父容器宽度是屏幕的百分比,子元素的marginpadding会随着父宽度的变化自动调整,这在响应式布局中非常有用。 需要注意的陷阱有哪些?比如,父元素没有明确宽度时,百分比计算可能会失效。例如,父元素是块级元素但宽度由内容决定,这时候子元素的百分比边距可能不如预期。或者,当包含块的宽度为0时,百分比值也会是0,导致布局问题。 此外,用户可能想知道如何调试这些问题。比如使用浏览器的开发者工具检查元素的计算样式,确认包含块的宽度是否符合预期,或者边距填充的计算值是否正确。 最后,应该提醒用户不同浏览器是否有一致的行为。大多数现代浏览器应该遵循标准,但旧版本可能存在差异,不过现在这种情况可能较少见了。如果用户遇到不一致的情况,可能需要检查文档类型或CSS重置是否应用正确。 总结一下,回答需要涵盖百分比计算的基准,应用实例,注意事项,以及常见问题解决方法。同时,引用相关的CSS规范,比如CSS盒模型模块中的定义,来增强答案的权威性。</think>### CSS中marginpadding百分比使用规则 #### 1. 百分比基准 - **margin****padding**的百分比值均相对于**包含块(containing block)的宽度**计算,包括垂直方向(如`margin-top`、`padding-bottom`)[^1]。 - 例如,若父元素宽度为`1000px`,子元素设置`margin-top: 10%`时,实际值为`1000px × 10% = 100px`。 #### 2. 规则细节 - **水平方向**:直接按父元素宽度计算,如`margin-left: 5%`即父宽度的5%。 - **垂直方向**:同样基于父元素宽度而非高度,例如`padding-bottom: 20%`等于父宽度的20%。 - **绝对定位元素**:若包含块为定位祖先,则基于该祖先的宽度计算。 #### 3. 应用场景 - **响应式宽高比**:通过`padding-top`实现固定比例容器: ```css .container { width: 100%; padding-top: 50%; /* 宽高比2:1 */ position: relative; } .content { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } ``` - **自适应间距**:父元素宽度变化时,边距自动按比例调整。 #### 4. 注意事项 - **父元素无明确宽度**:若父元素宽度由内容决定(如`display: inline-block`),百分比计算可能失效。 - **高度依赖性场景**:需通过JavaScript动态计算高度相关百分比。 #### 5. 调试技巧 - 使用浏览器开发者工具查看`Computed`标签,验证百分比计算后的实际像素值。 - 检查包含块是否被意外修改(如父元素`overflow`或`position`属性影响)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值