前几天去一家互联网公司面试,面试官问到了这个应该算是比较简单的问题,在我自认为回答正确时,才知道这道题的答案有很多种,下面就让我们一起来探讨一下这个问题:

思路1:绝对定位居中(原始版)

这个是我回答出来的,也是被各位所熟知的一种方法,设外层div相对定位,内层div绝对定位,top、left分别设为50%,然后通过设置margin-top、margin-left值为宽度的负数就可以成功实现垂直水平居中了:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title>
<style type="text/css">
*{margin: 0;padding:0;}
.outer{
width: 80%;
height: 400px;
background: #ccc;
margin: 0 auto;
position: relative;
}
.inner{
width: 400px;
height: 300px;
background: green;
position: absolute;
top: 50%;left: 50%;
margin-top: -150px;/*设为高度的1/2*/
margin-left: -200px;/*设为宽度的1/2*/
}
</style>
</head>
<body><div class="outer"><div class="inner"></div></div>
</body>
</html>

很常见的,这个经典的方法最大的不足之处是inner的宽度必须是固定值,否则margin-top和margin-left的值将无法设置,为了解决这个问题,我们考虑将使inner发生位移的代码由margin-top、margin-left换成其他形式,换成什么呢?请看第二种方法:

思路2:绝对定位居中(改进版之一)

我们的目的是让inner在top和left方向发生50%偏移之后,再往回偏移一定距离,而css里关于位置偏移的属性还有什么呢?当我们查阅最新版的css3属性之后,发现这样一个属性:selector{transform:translate();},translate代表着水平、垂直方向上的转换(位移),其中当括号内的值设为百分比时,将以元素自身宽度为基准,移位相应的宽度,这样一来,我们的问题就得到了解决:

<style type="text/css">
*{margin: 0;padding:0;}
.outer{
width: 80%;
height: 400px;
background: #ccc;
margin: 0 auto;
position: relative;
}
.inner{
width: 70%;
height: 300px;
background: green;
position: absolute;
top: 50%;left: 50%;
transform: translate(-50%,-50%);/*在水平和垂直方向上各偏移-50%*/
}
</style><body><div class="outer"><div class="inner"></div></div>
</body>

这个方法妥善解决了内层div宽度不确定的问题,但由于使用了css3的新属性,在低版本ie浏览器下是不兼容的。由此,我们想到了第三种方法:

思路3:绝对定位居中(改进版之二)

<style type="text/css">
*{margin: 0;padding:0;}
.outer{
width: 80%;
height: 400px;
background: #ccc;
margin: 0 auto;
position: relative;
}
.inner{
width:70%;
height: 300px;
background: green;
position: absolute;
top: 0;left:0;right:0;bottom:0;/*让四个定位属性都为0*/
margin:auto;/*很关键的一步*/
}
</style>

这个方法,不仅能在inner宽度不确定时发挥作用,还能兼容各种主流浏览器,看上去似乎很完美,但事实上,当我们的需求改为:宽度随内部文字自适应 ,即宽度未设置时,这种方法就无法满足需求了,原因是left、right设为0后,inner在宽度未设置时将占满父元素的宽度。

(你可以在思路二的基础上将inner宽度去掉,内部放一些文字,你会发现在第二种思路下这种需求是可以满足的)

思路4:flex布局居中

flex布局是移动端一种很新潮的布局方法,利用flex布局使元素垂直水平居中,缺点依然是令人头疼的兼容性问题(在ie11-中不起作用),优点是代码量比前几种方法相比略少,方便使用。
让我们一起来了解一下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title>
<style type="text/css">
*{margin: 0;padding:0;}
.outer{width: 80%;height: 400px;background: #ccc;margin:0 auto;
display: flex;/*设置外层盒子display为flex*/
justify-content:center;/*设置内层盒子的水平居中*/
align-items:center;/*设置内层盒子的垂直居中*/
}
.inner{display: inline-block;height: 300px;background: yellow;}
</style>
</head>
<body><div class="outer"><div class="inner">这是一段文字这是一段文字这是一段文字</div></div>
</body>
</html>

以上就是使div垂直+水平居中的四种方式,关于第三种思路中inner无法对内容自适应的问题,目前我还没有想出解决办法,希望高人们能够指点一二。

参考文章:小tip: margin:auto实现绝对定位元素的水平垂直居中--来自张鑫旭-鑫空间-鑫生活

使一个div垂直+水平居中的几种方法相关推荐

  1. 使一个div居中显示的三种方法

    使一个div居中显示的三种方法 1. <!DOCTYPE html> <html lang="en"> <head><meta chars ...

  2. html这一段div居中显示,使一个div居中显示的三种方法

    使一个我自址哈这工边识框处己按后大都加控不架的div居中显示比抖朋要插支一圈不者地器享说几的三种方法 1. div居中 /*第一种方法*/ div{ width: 200px; height: 200 ...

  3. H5+CSS3 实现div垂直水平居中的几种方式

    实现div垂直水平居中的11种方法 <div class="father"><div class="son"></div> ...

  4. 用css实现垂直水平居中的几种方法

    1.用inline-block和vertical-align来实现居中:这种方法适合于未知宽度高度的情况下. <!DOCTYPE html> <html lang="en& ...

  5. 让一个 div 水平垂直居中的几种方法

    水平垂直居中有好多种实现方式,主要就分为两类:不定宽高和定宽高,以在body下插入一个div为例: 定宽高 使用定位+margin element.style {position: absolute; ...

  6. 如何让一个div垂直水平居中?

    当然有很多种方法都可以实现这种效果,这里就简单说一种通过定位结合margin来实现的方法. 1.首先在body里面准备两个盒子(父盒子和子盒子) <body><div class=& ...

  7. div垂直水平居中经常使用的方法

    通过定位: 父级元素:position: relative; 子元素:  position: absolute; top:50%: left:50%: transform: translate(-50 ...

  8. html div显示页面中间,使一个div始终显示在页面中间

    使一个div始终显示在页面中间 假设我们有一个div层: 首先,我们用css来控制它在水平上始终居中,那么我们的css代码应该是这样: *{margin:0;padding:0;} #myDiv{wi ...

  9. CSS实现DIV垂直水平居中

    CSS实现DIV垂直水平居中 在页面设计中,很多地方都需要div的垂直水平居中,在前端开篇的学习中,也是使用较多的地方,所以我整理了三种方法帮助大家去解决问题,代码可直接使用,仅供参考学习. 方法 方 ...

最新文章

  1. 在蓄电池管理系统中计算机应用,汽车电器与电子技术.docx
  2. 安装完MAVEN后输入mvn -v, 提示不是内部命令的问题
  3. Nexys4 DDR + OV7670 摄像头实时监控系统
  4. 关于Icon,Image,ImageIcon的简单的对比参考 上篇
  5. 操作系统真实的虚拟内存是什么样的
  6. 编程开发之--java多线程学习总结(3)类锁
  7. heartbeat与keepalived对比
  8. 工作了五年才明白的道理,这些原来我一开始就做错了
  9. laravel 原生 sql
  10. 如何使ArcIMS图例显示中文
  11. 尚硅谷大数据开发Day03
  12. Elastic:使用 Elastic Stack 来监督系统日志及指标
  13. java vim编辑器的基本使用_vim编辑器之神的高效率使用
  14. 教大模型自己跳过“无用”层,推理速度×3性能不变,谷歌MIT这个新方法火了...
  15. 嘴对嘴教你如何建立一个支持ctf动态独立靶机的靶场
  16. 腾讯文档服务器异常 编辑内容暂无法保存,腾讯文档怎么编辑不了 编辑不了解决方法...
  17. 如何修改C盘下的hosts文件
  18. Windows本地认证和NTLM认证
  19. 【亲爱的安吉维拉】读后感
  20. 安装Mathtype 7 在 word2016中,解决Word闪退问题

热门文章

  1. php对手时间戳判断,PHP 中判断一个数字是否是Unix 时间戳
  2. 除硬件外计算机系统不可缺少的是,除硬件外,计算机系统不可缺少的另外一部分是( )。...
  3. lisp函数大全 微盘_LISP函数(分类)大全
  4. 电脑显示器不亮主机正常_为什么会突然显示器黑屏但主机正常工作和解决办法。...
  5. 理解注意力机制的好文二
  6. linux登oracle登陆不了,oracle: linux服务器本机不能登陆的解决
  7. qt使用 QMediaPlay 简单播放音乐
  8. 运算符重载(c++细节篇二)
  9. Vue 3响应式原理及实现
  10. Leaflet中使用leaflet-sidebar插件实现侧边栏效果