使用变换将div与动画一起居中

  • 本文关键字:动画 一起 div 变换 html css
  • 更新时间 :
  • 英文 :


因此,我正在尝试实现一个在屏幕中间旋转的加载器,我之前使用过transform:translate,例如:

position: absolute;
left:50%;
top:50%;
transform:  translate(-50%,-50%);

我试着实现类似的东西,但左上角似乎在中心,而不是居中。这是我的代码HTML

<section class="waitwrapper" v-else>
<div class="loader"></div>
</section>

CSS

.waitwrapper{
background-color: #455879;
position: relative;
width: 98vw;
height: 97vh;
}
.loader{
border: 16px solid  #f3f3f3;
border-top: 16px solid #455879; /* w3schools loader */
border-radius: 50%;
width: 20%;
aspect-ratio:1;
animation: spin 2s linear infinite;
position: absolute;
left:50%;
top:50%;
transform:  translate(-50%,-50%);
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}

集中一个项的一种受信任的方法是将display: flex与父元素中的justify-content: centeralign-items: center一起使用。

*, *::before, *::after{
box-sizing:border-box;
}
.waitwrapper{
background-color: #455879;
width: 98vw;
height: 97vh;
display:flex;
justify-content:center;
align-items:center
}
.loader{
border: 16px solid  #f3f3f3;
border-top: 16px solid #455879; /* w3schools loader */
border-radius: 50%;
width: 20%;
aspect-ratio:1;
animation: spin 2s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
<section class="waitwrapper" v-else>
<div class="loader"></div>
</section>

但是为什么您的代码不能很好地工作我必须告诉你,当你在animation中更改transform属性时,实际上你覆盖了它。正因为如此,transform: translate(-50%, -50%);不再起作用。为了解决这个问题,你可以使用以下解决方案

.waitwrapper{
background-color: #455879;
position: relative;
width: 98vw;
height: 97vh;
}
.loader{
border: 16px solid  #f3f3f3;
border-top: 16px solid #455879; /* w3schools loader */
border-radius: 50%;
width: 20%;
aspect-ratio:1;
animation: spin 2s linear infinite;
position: absolute;
left:50%;
top:50%;
/* transform:translate(-50%,-50%); */
}
@keyframes spin {
0%{
transform: translate(-50%, -50%) rotate(0deg);
}
100% {
transform: translate(-50%, -50%)  rotate(360deg);
}
}
<section class="waitwrapper" v-else>
<div class="loader"></div>
</section>

不要使用转换。在父元素上使用display: flex;,在微调器元素上使用margin: auto;——使其水平和垂直居中。

有关所需更改,请参阅代码注释:

/* Quick reset */ * {margin: 0; box-sizing: border-box; }
.loader-wrapper {
background-color: #455879;
position: fixed; /* why relative? use fixed! Should cover the page? */
z-index: 9999;   /* overlay other elements */
width: 100vw;
height: 100vh;
display: flex; /* use display flex */
}
.loader {
height: 20%;   /* use height instead of width */
aspect-ratio: 1;
margin: auto;  /* center inside the flex parent */
border: 10px solid #f3f3f3;
border-top-color: transparent; /* use transparent instead */
border-radius: 50%;
animation: spin 2s linear infinite;
}
@keyframes spin {
to { transform: rotate(1turn); }
}
<section class="loader-wrapper">
<div class="loader"></div>
</section>

以下是如何使用宽度集居中定位绝对元素的方法之一:

position: absolute;
margin-left: auto;
margin-right: auto;
margin-top: auto;
margin-bottom: auto;
left: 0;
right: 0;
top:0;
bottom:0;
width:20%;

完整片段:

.waitwrapper{
background-color: #455879;
position: relative;
width: 98vw;
height: 97vh;
}
.loader{
border: 16px solid  #f3f3f3;
border-top: 16px solid #455879; /* w3schools loader */
border-radius: 50%;
aspect-ratio:1;
animation: spin 2s linear infinite;
position: absolute;
margin-left: auto;
margin-right: auto;
margin-top: auto;
margin-bottom: auto;
left: 0;
right: 0;
top:0;
bottom:0;
width:20%;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>

<section class="waitwrapper" v-else>
<div class="loader"></div>
</section>
</body>
</html>

最新更新