整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Html5-CSS之元素的五大居中方式

自己是一名从事了多年开发的web前端老程序员,目前辞职在做自己的web前端私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的web前端学习干货,各种框架都有整理,送给每一位前端小伙伴,想要获取的可以关注我的头条号并在后台私信我:前端,即可免费获取

Html5-CSS之五大居中方式

你是不是也对元素居中的知识点很是模糊?是不是苦于找不到一个总结的通俗易懂的说明?是不是自己懒得去总结?恭喜你,搜到这篇博客! 这是鄙人在前端的学习与实践中总结出的元素的五大居中方式,黏贴了代码并对代码做了解释,希望对迷茫的有所帮助!

下面的居中示例中,统一使用了同一个div作为父元素和p作为子元素

设置一个div,并且设置了div的宽高边框,div里面设置一个块元素p,设置了它的宽高和背景色

css居中方式1

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>五大居中1</title>
<style>
*{margin:0;}
div{width:200px;height:300px;border:2px solid #000;margin:200px auto;
text-align:center;font-size:0;
}
div p{width:100px;height:100px;background:#666;
display:inline-block;vertical-align:middle;
}
div:after{content:"";display:inline-block;height:100%;vertical-align:middle;}
</style>
</head>
<body>
<div>
	<p></p>
</div>
</body>
</html>

这里利用了伪元素让子元素p在div盒子里左右水平居中只需要在它的父元素div里加text-align:center;垂直方向居中需要在父元素后面加了一个伪元素,并使得样式为inline-block;height:100%;就是和父元素一样高,vertical-align:middle;垂直居中,也就是p元素相对与伪元素居中,由于伪元素和div一样高,所以相当于p元素在div里垂直居中。

css居中方式2

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>五大居中2</title>
<style>
*{margin:0;}
div{position:relative;width:300px;height:400px;border:1px solid #000;margin:100px auto;}
p{position:absolute;left:0;bottom:0;right:0;top:0;margin:auto;width:100px;height:100px;background:#f99;}
</style>
</head>
<body>
<div>
	<p></p>
</div>
</body>
</html>

这里利用了定位居中

子元素p设置position:absolute脱离文档流,默认以html作为父元素,所以我们给父元素div设置position:relative;使得p以div为父元素做位置的变动,left:0;tight:0;top:0;bottom:0;(只有设置了定位的元素才可以使用这种方式来移动),最后margin:auto;就会水平和垂直都居中。

css居中方式3

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>五大居中3</title>
<style>
*{margin:0;}
div{display:flex;justify-content:center;align-items:center;width:300px;height:400px;border:1px solid #000;margin:100px auto;}
p{width:100px;height:100px;background:#f99;}
</style>
</head>
<body>
<div>
	<p></p>
</div>
</body>
</html>

这里利用了弹性盒居中

父元素div设置成弹性盒样式,justify-content:center;主轴居中

align-items:center;垂直居中(而且这两个只能设置在父元素上,弹性盒知识)

css居中方式4

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>五大居中4</title>
<style>
*{margin:0;}
div{position:relative;width:300px;height:400px;border:1px solid #000;margin:100px auto;}
p{width:100px;height:100px;background:#f99;position:absolute;
left:50%;top:50%;margin:-50px 0 0 -50px;}
</style>
</head>
<body>
<div>
	<p></p>
</div>
</body>
</html>

利用定位线左上角居中,然后左移子元素宽度的一半,再上移子元素高度的一半。

css居中方式5

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>五大居中5</title>
<style>
*{margin:0;}
div{position:relative;width:300px;height:400px;border:1px solid #000;margin:100px auto;}
p{position:absolute;width:100px;height:100px;background:#f99;left:50%;top:50%;
	transform:translate(-50%,-50%);}
</style>
</head>
<body>
<div>
	<p></p>
</div>
</body>
</html>

利用动画移动属性transform

结语

相信看了上面的有关Html5、css的元素五大居中方式,你们就可以解决自己的小问题了,但是也要养成一个总结的好习惯。好记性不如烂笔头!以前留下来的话语总是有他的道理。Come on!

原文链接:https://blog.csdn.net/qq_38110274/article/details/102756968

习css大家是不是对元素居中的知识点很是模糊?是不是苦于找不到一个总结的通俗易懂的说明?是不是自己懒得去总结?今天小编在前端的学习与实践中总结出的元素的五大居中方式,黏贴了代码并对代码做了解释,希望对迷茫的有所帮助!

下面的居中示例中,统一使用了同一个div作为父元素和p作为子元素

设置一个div,并且设置了div的宽高边框,div里面设置一个块元素p,设置了它的宽高和背景色

css居中方式1

这里利用了伪元素让子元素p在div盒子里左右水平居中只需要在它的父元素div里加text-align:center;垂直方向居中需要在父元素后面加了一个伪元素,并使得样式为inline-block;height:100%;就是和父元素一样高,vertical-align:middle;垂直居中,也就是p元素相对与伪元素居中,由于伪元素和div一样高,所以相当于p元素在div里垂直居中。

css居中方式2

这里利用了定位居中

子元素p设置position:absolute脱离文档流,默认以html作为父元素,所以我们给父元素div设置position:relative;使得p以div为父元素做位置的变动,left:0;tight:0;top:0;bottom:0;(只有设置了定位的元素才可以使用这种方式来移动),最后margin:auto;就会水平和垂直都居中。

css居中方式3

这里利用了弹性盒居中

父元素div设置成弹性盒样式,justify-content:center;主轴居中

align-items:center;垂直居中(而且这两个只能设置在父元素上,弹性盒知识)

css居中方式4

利用定位线左上角居中,然后左移子元素宽度的一半,再上移子元素高度的一半。

css居中方式5

利用动画移动属性transform

小编是一个有着5年工作经验的架构师,关于web前端,自己有做材料的整合,一个完整学习web前端的路线,学习材料和工具。需要的伙伴可以私信我,发送“前端”等3秒后就可以获取领取地址,免费送给大家。对于学习web前端有任何问题(学习方法,学习效率,如何就业)都可以问我。希望你也能凭自己的努力,成为下一个优秀的程序员!

结语

相信看了上面的有关Html5、css的元素五大居中方式,你们就可以解决自己的小问题了,但是也要养成一个总结的好习惯。好记性不如烂笔头!以前留下来的话语总是有他的道理。Comeon!

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

三图:

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

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

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

  1. 图片在上传后,会有不同的大小,有的是长图(长大于宽),有的是宽图(宽大于长),或者是一些接近正方形的图片。
  2. 在保证图片原本长宽比的情况下,要想将图片显示在一个正方形的区域内,或者是固定长宽的区域内,是必须要截取一部分图片展示的。
  3. 采用CSS或者JavaScript都可以实现这种效果。

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

长图:

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新增的<img />标签的属性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即可,代码如下:

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

效果如下图:

代码中图片来源于网络

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

三张连续图,代码如下:

    <div class="three-img-other-wrap">
     <div class="three-img-other-1 img-1"></div>
     <div class="three-img-other-2 img-2"></div>
     <div class="three-img-other-3 img-3"></div>
   </div>
.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;
   }

效果如下:

每个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;
}
<div class="three-img-other-wrap">
   <div class="three-img-other-1 img-1"></div>
   <div class="three-img-other-2 img-2"></div>
   <div class="three-img-other-3 img-3"></div>
</div>

效果如下:

图片之间的缝问题:

从上面的效果图来看,每张图片之间都有一定的间距(一般是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这种方式相交于<img>方式需要写更多的逻辑。

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

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

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

  1. 首先需要知道图片的宽高。
  2. 给每个<img>设置src之后,需要同时设置一个父div用来包裹这个<img>。
  3. 同时父div需要设置overflow:hidden,然后根据外框的大小,和图片的宽高,动态设置<img>的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技能中,图片居中处理是一个非常重要的技能,也是用的比较多的一种技能,当然还有一些极端情况例如遇到面条图,或者是长宽小于10px的这种非常小的图片,可能需要单独特殊逻辑处理了。