首页 web前端 js教程 详解CSS百分比padding制作图片自适应布局

详解CSS百分比padding制作图片自适应布局

Dec 26, 2017 am 09:39 AM
padding 百分比

<p>本文主要和大家分享详解CSS百分比padding制作图片自适应布局,css知识点:当padding/margin取形式为百分比的值时,无论是left/right,还是top/bottom,都是以父元素的width为参照物的!

<p>一、CSS百分比padding都是相对宽度计算的

<p>在默认的水平文档流方向下,CSS marginpadding属性的垂直方向的百分比值都是相对于宽度计算的,这个和top, bottom等属性的百分比值不一样。

<p>这么设计的原因在我的新书(应该不出几个月就要出版了)中会有说明,这里不展开。

<p>对于padding属性而言,任意方向的百分比padding都现对于宽度计算可以让我们轻松实现固定比例的块级容器,举个例子,假设现在有个<p>元素:

p { padding: 50%; }
登录后复制
<p>

<p>或者:

p { padding: 100% 0 0; }
登录后复制
<p>

<p>或者:

p { padding-bottom: 100%; }
登录后复制
<p>

<p>则这个<p>元素尺寸就是一个宽高1:1的正方形,无论其父容器宽度是多少,这个<p>元素总能保持比例不变。

<p>这种能固定比例的特性什么作用呢?

<p>对于绝大多数都布局,我们并不要求非要比例固定,但是有一种情况例外,那就是图片,因为图片原始尺寸它是固定的。在传统的固定宽度的布局下,我们会通过给图片设定具体的宽度和高度值,来保证我们的图片占据区域稳固;但是在移动端或者在响应式开发情况下,图片最终展现的宽度很可能是不确定的,例如手机端的一个通栏广告,iPhone7下宽度是375,iPhone7 Plus下是414,还有360等尺寸,此时需要的不是对图片进行固定尺寸设定,而是比例设定。

<p>通常有如下一些实现:

<p>

<p>

<p>1. 固定一个高度,然后使用background-size属性控制,如下:

.banner {
 height: 40px;
 background-size: cover;
}
登录后复制
<p>

<p>实时效果如下:

<p>可以看到随着宽度的变化,总会有部分图片区域(宽度或高度)无法显示,并不是完美的做法。

<p>2. 使用视区宽度单位vw,如下:

.banner {
 height: 15.15vw;
 background-size: cover;
}
登录后复制
<p>

<p>如果对兼容性要求不是很高,使用vw也是一个不错的做法,至少理解起来要更轻松一点。

<p>但是,如果我们的图片不是通栏,而是需要离左右各1rem的距离,此时,我们的CSS代码就要啰嗦点了,想要保持完美比例,就使用借助CSS3 calc()计算:

.banner {
 height: calc(0.1515 * (100vw - 2rem));
 background-size: cover;
}
登录后复制
<p>

<p>如果,图片距离两侧的宽度是动态不确定的,则,此时calc()也捉襟见肘了,但,恰恰是普普通通其貌不扬的padding属性,其兼容性和适应性都一级棒。

<p>3. 使用百分比padding,如下:

.banner {
 padding: 15.15% 0 0;
 background-size: cover;
}
登录后复制
<p>

<p>此时无论图片的外部元素怎么变动,比例都是恒定不变的。

<p>二、CSS百分比padding与宽度自适应图片布局

<p>但是有时候我们的图片是不方便作为背景图呈现的,而是内联的<img>,百分比padding也是可以轻松应对的,求套路是比较固定的,图片元素外面需要一个固定比例的容器元素,例如下面的HTML结构:

<br/>
登录后复制
登录后复制

<p class="banner">
 <img src=""banner.jpg>
</p>
登录后复制
<p>

<p>.banner元素同样负责控制比例,然后图片填充.banner元素即可,CSS代码如下:

.banner {
 padding: 15.15% 0 0;
 position: relative;
}
.banner > img {
 position: absolute;
 width: 100%; height: 100%;
 left: 0; top: 0;
}
登录后复制
<p>

<p>效果就达成了!

<p>眼见为实,去年起点中文网手机版诸多页面的通栏广告就都是这么实现的,最终的效果参见下面的gif截图(如果图无法显示,可以评论反馈):

<p>

<p>可以看到,无论屏幕宽度多宽,我们的广告图片比例都是固定的,不会有任何剪裁,不会有任何区域缺失,布局就显得非常有弹性,也更健壮。

<p>————-

<p>其实,我之前一直低估百分比padding的实际应用价值,因为有vw单位的存在,毕竟理解vw看上去要更简单一些,所以,一直就没做相关技巧的介绍。但是,随着图片相关布局处理越来越多,我发现,百分比padding的实用价值要比想象的大,要比vw单位适用场景更多,兼容性更好(百分比特性IE6+支持,图片100%覆盖IE8+支持)。

<p>对于复杂布局,如果图片的宽度是不固定的自适应的,我们通常会想到这么一个取巧的做法,就是只设定图片的宽度,例如:

img { width: 100%; }
登录后复制
<p>

<p>此时浏览器默认会保持图片比例显示,图片宽度大了,高度也跟着一起变大;图片宽度小了,高度也跟着一起变小。开发人员似乎无需关心图片真实比例是怎样的。

<p>然而这种技巧有一个非常不好的体验问题,那就是随着页面加载的进行,图片占据的高度会有一个从0到计算高度的图片变化,视觉上会有明显的元素跳动,代码层面会有布局重计算。

<p>所以对图片高宽进行同时约定还是有必要的,但是同时要保证宽度自适应,似乎有点难度。记住,如果遇到这种需求场景,没有比百分比padding布局更好的做法!

<p>缩小浏览器宽度可以看到不同宽度下的布局效果,Gif效果截图如下:

<p>

<p>此demo难点就是图片自适应同时保持比例,以及页面刷新的时候没有布局稳固不晃动,其核心HTML和CSS代码如下:

<br/>
登录后复制
登录后复制

<p class="works-item-t">
  <img src="./150x200.png">
</p>
登录后复制
<p>

.works-item-t {
 padding-bottom: 133%;
 position: relative;
}
.works-item-t > img {
 position: absolute;
 width: 100%; height: 100%;
}
登录后复制
<p>

<p>可以看到,当把垂直方向padding值只使用padding-bottom表示的时候,如果没有text-align属性干扰,<img>元素的left:0;top:0是可以省略的。

<p>对于这种图片宽度100%容器,高度按比例的场景,padding-bottom的百分比值大小就是图片元素的高宽比,就这么简单。

<p>但,有时候,图片宽度并不是100%容器的,例如,图片宽度50%容器宽度,图片高宽比4:3,此时,CSS垂直方向百分比就666了,如下:

.img-box {
 padding: 0 50% 66.66% 0;
}
登录后复制
<p>相关推荐:

<p>一个CSS+div高度自适应布局模型_html/css_WEB-ITnose

<p>CSS3自适应全屏焦点图切换的特效怎么做

<p>响应式和自适应有什么区别

<p>

以上是详解CSS百分比padding制作图片自适应布局的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何在Python中将分数转换为百分比? 如何在Python中将分数转换为百分比? Aug 25, 2023 pm 01:25 PM

分数和百分比是在金融、数据分析和统计等各个领域中使用的两个基本数学概念。将分数转换为百分比是一种简单但必要的操作,它使我们能够以更易理解的方式表示分数值。Python是最流行的编程语言之一,提供了几种将分数转换为百分比的方法,理解这些方法对于在Python中处理数据的人来说至关重要。本文深入探讨了在Python中将分数转换为百分比的过程。我们将探索不同的方法来执行此操作,并提供示例以帮助您理解每种方法。无论您是初学者还是经验丰富的Python程序员,本文都为您提供了在Python中执行此关键操作

CSS 边界属性详解:padding,margin 和 border CSS 边界属性详解:padding,margin 和 border Oct 21, 2023 am 11:07 AM

CSS边界属性详解:padding,margin和borderCSS是一种用于控制和布局网页元素的样式表语言。在网页设计中,边界属性是其中一项非常重要的部分。本文将详细介绍CSS中边界属性的使用方法,并提供具体的代码示例。padding(内边距)padding属性用于设置元素的内边距,即元素内容和元素边界之间的空间。我们可以用正数或百分比值来设置内边距

Python程序获取单词频率的百分比 Python程序获取单词频率的百分比 Sep 08, 2023 pm 06:29 PM

在本文中,我们将学习如何在Python中以百分比形式获取词频。假设我们已经获取了一个字符串输入列表。现在,我们将找到给定输入字符串列表中每个单词的百分比。公式(OccurrenceofXword/Totalwords)*100使用的方法使用sum()、Counter()、join()和split()函数使用join()、split()和count()函数使用operator模块的countOf()函数。方法一:使用sum()、Counter()、join()和split()函数join()是Py

CSS 文本排版属性详解:text-overflow 和 white-space CSS 文本排版属性详解:text-overflow 和 white-space Oct 20, 2023 am 11:19 AM

CSS文本排版属性详解:text-overflow和white-space在网页设计中,文本排版是一个非常重要的环节,通过合理的排版可以使文本更易读、更美观。CSS提供了一些属性来控制文本的显示方式,其中包括text-overflow和white-space。本文将详细介绍这两个属性的用法和示例代码。一、text-overflow属性text

css中的padding属性怎么用 css中的padding属性怎么用 Dec 07, 2023 pm 02:58 PM

在CSS中,padding属性用于设置元素的内边距。这意味着它定义了元素内容和其边框之间的空间。基本语法为“padding: value;”。

linux top命令详解 linux top命令详解 Feb 20, 2024 am 09:20 AM

按1可以看每个cpu的使用情况第一行当前时间运行时间当前登陆用户负载均衡(1分钟、5分钟、10分钟)loadaverage数据每5秒检查一次活跃进程数,计算出的值。若除以逻辑CPU数量后超过5,表示系统超负荷。第二行总共248个进程1个正在运行247个休眠0个停止0个僵尸进程第三行us(userspace):用户空间占用cpu的百分比sy(sysctl):内核空间占用cpu的百分比ni()—改变过优先级的进程占用CPU的百分比id(idolt):空闲CPU百分比wa(wait):IO等待占用CP

如何在 iPhone 上启用电池百分比显示? 如何在 iPhone 上启用电池百分比显示? May 08, 2023 pm 12:07 PM

如何在iPhone上显示电池百分比以前,您必须向下滑动才能打开控制中心才能找到剩余电池电量的确切百分比。但是,在锁定屏幕的顶部边缘查看精确电池百分比的选项又回来了。要在iPhone上显示电池百分比:从iPhone主屏幕打开“设置”应用程序。向下滑动“设置”菜单,然后从列表中点击“电池”。接下来,将电池百分比按钮切换到打开位置。最后,您会在屏幕右上角的电池图标上方看到准确的剩余电量百分比。启用该功能后,百分比数字将在您浏览锁定屏幕、主屏幕和大多数应用程序时显示。看不到电池百分比?如果您没有看到打

CSS 盒模型属性探索:padding,margin 和 border CSS 盒模型属性探索:padding,margin 和 border Oct 20, 2023 pm 03:09 PM

CSS盒模型属性探索:padding,margin和borderCSS盒模型是网页布局的重要概念之一。在前端开发中,了解和正确使用padding,margin和border属性是关键。本文将深入探讨这三个属性的用法和相互之间的关联,并提供具体的代码示例。一、盒模型简介盒模型由四个部分组成:content(内容),padding(内边距),bo

See all articles