首页 > 其他分享 >使一个div垂直+水平居中的几种方法

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

时间:2023-10-21 10:39:35浏览次数:29  
标签:居中 top 50% 几种 inner div margin left



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

  • 思路1:绝对定位居中(原始版)
  • 思路2:绝对定位居中(改进版之一)
  • 思路3:绝对定位居中(改进版之二)
  • 思路4:flex布局居中


思路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无法对内容自适应的问题,目前我还没有想出解决办法,希望高人们能够指点一二。


标签:居中,top,50%,几种,inner,div,margin,left
From: https://blog.51cto.com/u_12591679/7964503

相关文章

  • Educational Codeforces Round 149 (Rated for Div. 2)
    这场D被切穿了。A题答案为x或者x-11B题答案就是最长的连续一段的长度+1证明的话大概可以将它看成是几段连续上升和下降的段,然后在峰谷、峰顶分别填上最小、最大,剩下的就依次递增或递减就行。C题将一段连续的0/1视作一个块,那么我们最小化这个块的数量就行。D题如果猜到......
  • Codeforces Round 863 (Div. 3) B. Conveyor Belts
    给一个\(n\timesn\)的矩阵,\(n\)是偶数。将矩阵按圈分割,同一圈的位置可以不消耗代价移动,可以消耗一个代价移动到相邻圈。给出\(n,x_1,y_1,x_2,y_2\),询问\((x_1,y_1)\)移动到\((x_2,y_2)\)的代价最小是多少。显然对每个圈可以选择左上角作为定点。显然直线\(......
  • Codeforces Round 865 (Div. 2) B. Grid Reconstruction
    给一个\(2\timesn\)的网格,且\(n\)是偶数。你需要将\(1\sim2\timesn\)填入这个网格。一条路径是从\((1,1)\)开始,每次只能向右或向下,到\((2,n)\)结束时,所经过的位置。按经过点的顺序标号,一两条路径的代价是\(cost=a_1-a_2+a_3-a_4+\cdots=\sum_{i=1......
  • javascript 数组对象根据id去重的几种方法
    例如:想去除重复id为1的项arr=[{id:1,name:'张三',age:20},{id:1,name:'张三',age:20},{id:2,name:'李四',age:20},{id:3,name:'马五',age:20},];方法一通过forEach再通过some方法判断数组是否包含当前对象id,不包含则添加so......
  • Codeforces Round 902 (Div. 2, based on COMPFEST 15 - Final Round)
    \(D.EffectsofAntiPimples\)对每个数字能到达的所有位置先预处理最大值,那么就代表选择这个数字之后真实的贡献,那么对这样的预处理值,最小值显然只有一种做法,为\(2^0\),第二小的值应该可以与最小值一起选择,所以答案为\(2^1\),以此类推之后,每个值乘上对应的2的幂次之后求和即......
  • CSS水平垂直居中
    使用flex布局<divclass="content"> <divclass="box"> </div></div>.content{height:100vh;display:flex;justify-content:center;align-items:center;}【注意】若垂直居中失效,是因为content盒子缺少高度,height:100%无法撑开盒子......
  • css元素水平垂直居中
    1、单行文字的处理<html><head><style>/*要点,设置行高和DIV的行高一行*/#div{background-color:antiquewhite;height:100px;line-height:100px;text-alig......
  • Codeforces Round 872 (Div. 2) B. LuoTianyi and the Table
    给一个\(n\timesm\)的矩阵和\(n\timesm\)个数,你需要把这些数填入矩阵。保证\[\sum_{i=1}^n\sum_{j=1}^m\left(\mathop{max}\limits_{1\leqx\leqi,1\leqy\leqj}a_{x,y}-\mathop{min}\limits_{1\leqx\leqi,1\leqy\leqj}a_{x,y}\right)......
  • AtCoder Regular Contest 167——B - Product of Divisors
    题目很明显,给定 所有因数的积不断除以最多能除几次。首先,很容易发现,对于每一对因子,都可以对答案得出B的贡献,设A的因子数目为n。将A进行质因数分解,PBa1,PBa2,PBa3……PBam,那么因数个数就是质因子加一的乘积。那么因子对数也就是前者一半。答案就是B乘因子对数除以二注意此处......
  • Educational Codeforces Round 149 (Rated for Div. 2) C. Best Binary String
    给一个字符串\(s\)包含\(0,1,?\)。定义一个\(01\)串\(s\)的\(cost\)为:选择\(s\)的任意一个子段\([l,r]\)并\(reverse\)。将\(s\)变为一个非降序序列时的\(reverse\)最小次数即\(cost\)。你可以让\(s\)的\(?\)换成\(0/1\),使新\(s\)的\(cost\)......