热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

web图片居中处理的方法是什么

这篇文章主要讲解了“web图片居中处理的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学

这篇文章主要讲解了“web图片居中处理的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“web图片居中处理的方法是什么”吧!

我们在日常使用移动APP的时候,特别是一些资讯类的APP,都会有图片展示的相关UI,例如今日头条APP的单大图和三图模式,如下图:单图:

web图片居中处理的方法是什么

三图:

web图片居中处理的方法是什么

或者是类似微博或者朋友圈这种9宫格的图片展示效果,如下图:

web图片居中处理的方法是什么

对于这些图片,如果你单纯的以为直接用几个,配置一下src地址,然后渲染在页面上,那就大错特错了

对于这种类型的UI展示,我们需要明确下面几点:

  1. 图片在上传后,会有不同的大小,有的是长图(长大于宽),有的是宽图(宽大于长),或者是一些接近正方形的图片。

  2. 在保证图片原本长宽比的情况下,要想将图片显示在一个正方形的区域内,或者是固定长宽的区域内,是必须要截取一部分图片展示的。

  3. 采用CSS或者Javascript都可以实现这种效果。

大家可以看下面这几张图,红色的是图片本身,虚线框就是展示出来的区域,便于理解:宽图:

web图片居中处理的方法是什么

长图:

web图片居中处理的方法是什么

CSS的background-size:

单独使用CSS的话,我们可以轻松的实现上面这个效果,主要利用到的属性就是background-size这个属性,可以先从概念上了解一下这个属性:

background-size: length|percentage|cover|contain
  • length:设置背景图像的高度和宽度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 “auto”。

  • percentage:以父元素的百分比来设置背景图像的宽度和高度。第一个值设置宽度,第二个值设置高度。如果只设置一个值,则第二个值会被设置为 “auto”。

  • cover:在保持图像的纵横比的前提下,以适合铺满整个容器并将图像缩放成将完全覆盖背景定位区域的最小大小。优点是背景图片全部覆盖所属元素区域;缺点是超出的部分会被隐藏。

  • contain:与cover相反,在保持图像的纵横比的情况下,以适合铺满整个容器,并将图像缩放成将适合背景定位区域的最大大小。优点是图片不会出现变形,同时背景图片被完全展示出来;缺点是当所属元素的宽高比与背景图片的宽高比不同时,会出现背景留白。

我们可以采用background-size:cover;比较合适,在保证纵横比的情况下,如果图片超过背景区域,将多余部分隐藏即可,同时设置background-position: center center;将主要内容居中显示。

CSS的object-fit:

HTML5新增的标签的属性object-fit也可满足需求,但是要注意兼容性。

object-fit: fill|contain|cover|scale-down|none|initial|inherit;

主要用到以下属性:

  • fill:默认,不保证保持原有的比例,内容拉伸整个内容容器。

  • contain:保持原有尺寸比例,内容被缩放,参考background-size:contain。

  • cover:保持原有尺寸比例,但部分内容可能被剪切,参考background-size:cover。

  • scale-down:保持原有尺寸比例。内容的尺寸与 none 或 contain 中的一个相同,取决于它们两个之间谁得到的对象尺寸会更小一些,更加智能。

代码效果demo:

如果是一个单大图,我们可以直接给一个div设置background-image,然后设置background-image即可,代码如下:


    .one-img {
     width: 100%;
     padding-top: 50%;
     background-image: url('https://gpic.qpic.cn/gbar_pic/osL7w6JTehzgKuaKrPEJ8V3lia1zoLaPShY05MdBofOpBye0yNpRXYA/');
     background-size: cover;
     background-position: center center;
   }

效果如下图:

web图片居中处理的方法是什么

代码中图片来源于网络

这里有一个知识点,我们如果想要实现屏幕的适配,div的长宽是绝不可以写成固定值px的,所以宽度可以设置成100%,这样如果在大屏幕下,图片自身会变大,但是高度我们是无法设置一个合适的百分比的,这里我们借助了padding-top属性,将padding-top设置成百分比,可以让一个div的高度被撑开,具体的值依据宽度的值,即50%表示是宽度(width:100%)的50%。

三张连续图,代码如下:

    

   

   

   

 

.three-img-wrap {
    margin-top: 5px;
    width: 100%;
    overflow: hidden;
  }
.three-img {
    float: left;
    width: 33.3333%;
    padding-top: 33.3333%;
    border-right: 1px solid #fff;
    background-size: cover;
    background-position: center center;
    box-sizing: border-box;
  }

效果如下:

web图片居中处理的方法是什么

每个div,设置float:left来实现横向平铺,注意一下这里不建议使用display:inline-block,会出现都得空隙,如果想要实现9宫格,将这3个复制2份即可。

或者是另外一种3+2+1显示方式图,代码如下:

.three-img-other-wrap {
     margin-top: 5px;
     width: 100%;
     overflow: hidden;
}

.three-img-other-1 {
     width: 66.6666%;
     padding-top: 66.6666%;
     float: left;
     border-right: 1px solid #fff;
     background-size: cover;
     background-position: center center;
     box-sizing: border-box;
   }
.three-img-other-2 {
     width: 33.3333%;
     padding-top: 33.3333%;
     float: left;
     border-bottom: 1px solid #fff;
     background-size: cover;
     background-position: center center;
     box-sizing: border-box;

}
.three-img-other-3 {
     width: 33.3333%;
     padding-top: 33.3333%;
     float: left;
     background-size: cover;
     background-position: center center;
     box-sizing: border-box;
}

 

 

 


效果如下:

web图片居中处理的方法是什么

图片之间的缝问题:

从上面的效果图来看,每张图片之间都有一定的间距(一般是1px-3px之间),在这里我们如果使用margin来实现的话,我们是无法设置一个具体的数值的,因为我们的长宽都是采用百分比,margin也必须采用百分比,否则会出现错乱,但是在此场景下margin不适合采用百分比,所以我们采用border边框来模拟这个间距:

border-right: 1px solid #fff;
box-sizing: border-box;

需要注意box-sizing: border-box;,这样border将的长度将会计算在整个宽度里面,即border+width等于具体的设置的百分比。

采用Javascript来实现:

其实从代码的优雅程度上来说,采用我们上面讲解的纯Css的方法是比较好的一种方法,但是也有弊端:1. 无法监听图片的加载成功和失败事件,例如onerror或者onload。这会导致我们无法给加载失败的图片一个默认的显示图。2. 我们在实现图片懒加载的逻辑时,div+background-image这种方式相交于方式需要写更多的逻辑。

在这里给大家介绍一下div+background-image和之间的区别:

在网页加载的过程中,以css背景图存在的图片background-image会等到结构加载完成(网页的内容全部显示以后)才开始加载,而html中的标签img是网页结构(内容)的一部分会在加载结构的过程中加载,换句话讲,网页会先加载标签的内容,再加载背景图片background-image,如果你用引入了一个很大的图片,那么在这个图片下载完成之前,后的内容都不会显示。而如果用css来引入同样的图片,网页结构和内容加载完成之后,才开始加载背景图片,不会影响你浏览网页内容。

如果我们想要用Javascript加,来实现这种效果,基本逻辑是:

  1. 首先需要知道图片的宽高。

  2. 给每个设置src之后,需要同时设置一个父div用来包裹这个

  3. 同时父div需要设置overflow:hidden,然后根据外框的大小,和图片的宽高,动态设置的margin或者left,top来产生位移。

这里的核心是如何根据外框的宽高来动态计算出图片的位移,我们可以封装一个方法来计算,具体的逻辑可以看注释:

getImagePosition(img, cW, cH) {
   // cW为外框宽度,// cW为外框高度,
   img.marginTop = img.marginLeft = 0;

   // img.h表示图片本身高度,img.height表示计算设置之后的高度
   // img.w表示图片本身高度,img.width表示计算设置之后的高度

   img.width = cW;
   img.height = cH;

   // 长图 优先设置宽度,然后长图居中
   if (img.h * cW / img.w > cH) {
       img.height = img.h * cW / img.w;
       img.marginTop = (cH - img.height) * 0.5 // 0.5表示居中
   } else {// 宽图 优先设置高度度,然后宽图居中
       img.width = img.w * cH / img.h;
       img.marginLeft = (cW - img.width) * 0.5 // 0.5表示居中
   }

   return img;
}

在计算出图片位移后,外框的宽高也可以使用Javascript来动态设置,例如屏幕宽度的三分之一或者是图片宽度的三分之二,代码如下:

document.body.clientWidth * 0.5
document.body.clientWidth * 2 / 3

感谢各位的阅读,以上就是“web图片居中处理的方法是什么”的内容了,经过本文的学习后,相信大家对web图片居中处理的方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程笔记,小编将为大家推送更多相关知识点的文章,欢迎关注!


推荐阅读
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 本文详细探讨了使用纯JavaScript开发经典贪吃蛇游戏的技术细节和实现方法。通过具体的代码示例,深入解析了游戏逻辑、动画效果及用户交互的实现过程,为开发者提供了宝贵的参考和实践经验。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 探索Web 2.0新概念:Widget
    尽管你可能尚未注意到Widget,但正如几年前对RSS的陌生一样,这一概念正逐渐走入大众视野。据美国某权威杂志预测,2007年将是Widget年。本文将详细介绍Widget的定义、功能及其未来发展趋势。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 本文介绍了如何利用HTTP隧道技术在受限网络环境中绕过IDS和防火墙等安全设备,实现RDP端口的暴力破解攻击。文章详细描述了部署过程、攻击实施及流量分析,旨在提升网络安全意识。 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • 如何使用 `org.apache.tomcat.websocket.server.WsServerContainer.findMapping()` 方法及其代码示例解析 ... [详细]
  • 在处理大规模数据数组时,优化分页组件对于提高页面加载速度和用户体验至关重要。本文探讨了如何通过高效的分页策略,减少数据渲染的负担,提升应用性能。具体方法包括懒加载、虚拟滚动和数据预取等技术,这些技术能够显著降低内存占用和提升响应速度。通过实际案例分析,展示了这些优化措施的有效性和可行性。 ... [详细]
  • 如何使用 `org.eclipse.rdf4j.query.impl.MapBindingSet.getValue()` 方法及其代码示例详解 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
author-avatar
爱你一辈子2502860605
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有