自己是一名从事了多年开发的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展示,我们需要明确下面几点:
大家可以看下面这几张图,红色的是图片本身,虚线框就是展示出来的区域,便于理解:宽图:
长图:
CSS的background-size:
单独使用CSS的话,我们可以轻松的实现上面这个效果,主要利用到的属性就是background-size这个属性,可以先从概念上了解一下这个属性:
background-size: length|percentage|cover|contain
我们可以采用background-size:cover;比较合适,在保证纵横比的情况下,如果图片超过背景区域,将多余部分隐藏即可,同时设置background-position: center center;将主要内容居中显示。
CSS的object-fit:
HTML5新增的<img />标签的属性object-fit也可满足需求,但是要注意兼容性。
object-fit: fill|contain|cover|scale-down|none|initial|inherit;
主要用到以下属性:
如果是一个单大图,我们可以直接给一个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等于具体的设置的百分比。
其实从代码的优雅程度上来说,采用我们上面讲解的纯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>,来实现这种效果,基本逻辑是:
这里的核心是如何根据外框的宽高来动态计算出图片的位移,我们可以封装一个方法来计算,具体的逻辑可以看注释:
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的这种非常小的图片,可能需要单独特殊逻辑处理了。
*请认真填写需求信息,我们会在24小时内与您取得联系。