我遇到以下问题:我希望 tariffCard > div 在单击时位于屏幕中央。我需要居中动画。因此,我决定不通过使用 JQuery 更改左/顶部位置来执行此操作,因为这会使动画变得粗糙。
因此我选择遵循以下策略:
- 计算需要在 X 轴和 Y 轴上移动元素多少像素才能使其居中;
var leftPos = $(this).offset().left;
var topPos = $(this).offset().top;
var cardWidth = $(this).width();
var cardHeight = $(this).height();
var docWidth = $(document).width();
var docHeight = $(document).height();
var main = $(this);
var moveRight = (docWidth - cardWidth)/2 - leftPos;
var moveTop = (docHeight - cardHeight)/2 - topPos;
- 使用 JQuery 改变 css 转换
$('.selected').css({"transform": "translateX(-" + moveRight + ") translateY(-" + moveTop + ") !important"});
以下问题困扰着我:
出于某种原因,此像素计算似乎不正确。反变换后卡片向右偏移。
我找不到使第二段代码正常工作的方法(更改 css 转换的代码)。因此,我不得不手动测试上述像素计算。
这是完整的代码:
$(document).ready(function(){
$('.tariffCards > div').click(function(){
var leftPos = $(this).offset().left;
var topPos = $(this).offset().top;
var cardWidth = $(this).width();
var cardHeight = $(this).height();
var docWidth = $(document).width();
var docHeight = $(document).height();
var main = $(this);
var moveRight = (docWidth - cardWidth)/2 - leftPos;
var moveTop = (docHeight - cardHeight)/2 - topPos;
// console.log(cardWidth)
// console.log(cardHeight)
// console.log(leftPos)
// console.log(moveRight)
// Cria o Overlay
$("body").append("<div id='overlay'></div>");
$("#overlay")
.height(docHeight)
.css({
'backdrop-filter': 'blur(3px)',
'background-color': 'rgba(0,0,0,0.4)',
'left': 0,
'position': 'absolute',
'top': 0,
'width': '100%',
'z-index': 1
}).fadeIn('3000', function(){
$('#overlay').show();
});
// transform: rotateY(-180deg) translateX(-90%) !important;
// console.log("")
// Some com o scroll
$('body').css('overflow-y', 'hidden');
// Some com os outros Cards
$(main).siblings().css("opacity", 0);
// Gira e centraliza o Card @Rever centralização
setTimeout(function() {
main.toggleClass('not-selected');
main.find('h3').css("opacity", 0);
main.find('span').css("opacity", 0);
main.toggleClass('selected');
// Ainda tenho que pensar como centralizar isso de um modo responsivo
$('.selected').css({"transform": "rotateY(-180deg) translateX(-100%) !important"});
$('.form-report').click(function(e) {
e.stopPropagation();
});
$('#name-input').focus();
}, 200);
setTimeout(function(){
// Organiza o form dentro do Card
$('.selected .form-report').css({
"display":"inherit",
"opacity": 1,
"transform":"scaleX(-1)"
});
}, 600);
});
});
// Ao clicar no Overlay
jQuery('body').on('click', '#overlay', function(){
var main = $('.selected');
$('.form-report').fadeOut('300', function(){
$(this).hide();
});
$('#overlay').fadeOut('300',function(){
$('#overlay').hide();
});
main.toggleClass('selected');
// $('.tariffCards > div')
// .css({"transform":'rotateX(45deg) rotateY(-15deg) rotate(45deg)', "height":"180px"
// });
setTimeout(function() {
main.toggleClass('not-selected');
$('.tariffCards > div').siblings().css("opacity", 1);
$('.tariffCards > div h3').css("opacity", 1);
$('.tariffCards > div span').css("opacity", 1);
}, 900);
// Reaparece com o scroll
$('body').css('overflow-y', 'scroll')
});
.tariffCards {
left: 25%;
position: absolute;
top: 100%;
transform-style: preserve-3d;
z-index: 2;
}
.tariffCards > div {
border-radius: 12px;
color: #fff;
cursor: pointer;
height: 180px;
margin-top: -70px;
overflow: hidden;
position: relative;
transform: rotateX(45deg) rotateY(-15deg) rotate(45deg);
transition: all .9s ease-in-out;
width: 330px;
}
.tariffCards > div h3 {
bottom: 30%;
font-size: 18px;
font-weight: 800;
left: 20%;
position: relative;
transform: rotate(-90deg);
}
.tariffCards > div span {
font-size: 12px;
font-weight: 700;
left: 35%;
opacity: .8;
position: absolute;
top: -6%;
transform: rotate(-90deg);
width: 100%;
}
.tariffCards > .lren {
background-color: #8063e1;
background-image: linear-gradient(135deg, #bd7be8, #8063e1);
box-shadow: 20px 20px 60px rgba(34,50,84,0.5), 1px 1px 0px 1px #8063e1;
}
.tariffCards > div.movi {
background-color: #3f58e3;
background-image: linear-gradient(135deg, #7f94fc, #3f58e3);
box-shadow: 20px 20px 60px rgba(34,50,84,0.5), 1px 1px 0px 1px #3f58e3;
}
.tariffCards > div.flry {
background-color: #2c6fd1;
background-image: linear-gradient(135deg, #21bbfe, #2c6fd1);
box-shadow: 20px 20px 60px rgba(34,50,84,0.5), 1px 1px 0px 1px #2c6fd1;
}
.tariffCards > div.pard {
background-color: #352f64;
background-image: linear-gradient(135deg, #415197, #352f64);
box-shadow: 5px 5px 60px rgba(34,50,84,0.9), 1px 1px 0px 1px #352f64;
}
.not-selected{
transition: all .4s ease !important;
/*z-index: -1 !important;*/
}
.not-selected:hover {
transform: rotateX(30deg) rotateY(-15deg) rotate(30deg) translate(-25px, 50px) !important;
}
.selected {
height: 55vh !important;
transform: rotateY(-180deg) translateX(-280px) !important;
z-index: 3 !important;
}
/*Formulário de inscrição*/
.form-report{
display: none;
margin: 0 auto;
opacity: 0;
text-align: center;
transition: all 2s;
width: 80%;
}
.form-report form{
margin-top: 10%;
margin-bottom: 5%;
}
.form-report form input{
color: black;
width:100%;
}
.container-btn a{
background-image: linear-gradient(56deg, #08AEEA 0%, #2AF598 100%);
border:none;
border-radius: 100px;
box-shadow:0px 10px 10px rgba(0,0,0,0.2);;
color: #fff;
display: inline-block;
font-size: 1.3em;
padding: 4% 0;
transition: all .2s;
width: 70%;
}
.container-btn a:hover{
transform: translateY(3px);
}
<!DOCTYPE html>
<html>
<head>
<title>HomePage</title>
<link rel="stylesheet" type="text/css" href="home.css">
</head>
<body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<div class="tariffCards">
<div class="lren not-selected">
<h3>Lojas Renner<br><br>$LREN3</h3>
<span>Atualizado em 2T19</span>
<!--Form aberto ao clicar no relatório-->
<div class='form-report'>
<h2>Receba agora.</h2>
<form>
<input type="text" id='name-input' placeholder="Nome">
<br/>
<input type="text" placeholder="Seu Email">
<br/>
<input type="text" placeholder="Celular (SMS de Confirmação)">
</form>
<br/>
<div class='container-btn'>
<a href="#"><img src='http://edufinance.com.br/wp-content/uploads/2019/08/noun_down-arrow.png' width='12%'>
</a>
</div>
</div>
</div>
<div class="movi not-selected" id='movi3'>
<h3>Movida<br><br>$MOVI3</h3>
<span>Atualizado em 2T19</span>
<!--Form aberto ao clicar no relatório-->
<div class='form-report'>
<h2>Receba agora.</h2>
<form>
<input type="text" id='name-input' placeholder="Nome">
<br/>
<input type="text" placeholder="Seu Email">
<br/>
<input type="text" placeholder="Celular (SMS de Confirmação)">
</form>
<br/>
<div class='container-btn'>
<a href="#"><img src='http://edufinance.com.br/wp-content/uploads/2019/08/noun_down-arrow.png' width='12%'>
</a>
</div>
</div>
</div>
<div class="flry not-selected" id='flry3'>
<h3>Fleury S.A.<br><br>$FLRY3</h3>
<span>Atualizado em 2T19</span>
<!--Form aberto ao clicar no relatório-->
<div class='form-report'>
<h2>Receba agora.</h2>
<form>
<input type="text" id='name-input' placeholder="Nome">
<br/>
<input type="text" placeholder="Seu Email">
<br/>
<input type="text" placeholder="Celular (SMS de Confirmação)">
</form>
<br/>
<div class='container-btn'>
<a href="#"><img src='http://edufinance.com.br/wp-content/uploads/2019/08/noun_down-arrow.png' width='12%'>
</a>
</div>
</div>
</div>
<div class="pard not-selected" id='pard3'>
<h3>Hermes Pardini<br><br>$PARD3</h3>
<span>Atualizado em 2T19</span>
<!--Form aberto ao clicar no relatório-->
<div class='form-report'>
<h2>Receba agora.</h2>
<form>
<input type="text" id='name-input' placeholder="Nome">
<br/>
<input type="text" placeholder="Seu Email">
<br/>
<input type="text" placeholder="Celular (SMS de Confirmação)">
</form>
<br/>
<div class='container-btn'>
<a href="#"><img src='http://edufinance.com.br/wp-content/uploads/2019/08/noun_down-arrow.png' width='12%'>
</a>
</div>
</div>
</div>
</div>
<script type="text/javascript" src='home.js'></script>
</body>
最佳答案
如果您对 CSS 没有任何问题,请使用 CSS 在中心对齐内容。
为什么不是 JavaScript/Jquery:自定义 javascript
/jquery
逻辑会导致性能问题
,因为当我们对齐时HTML
DOM
中的一些元素,然后删除元素并在指定位置呈现。
所以,我认为在页面中呈现后证明 div 不是一个好主意。
为什么使用 CSS:当对象即将呈现时,浏览器
将决定在页面中放置元素的位置,因此使用 CSS
我们保存多次呈现页面中的元素。
所以这可能有帮助
div {
display: flex;
justify-content: center;
}
关于javascript - 如何使用 JQuery 和 Translate 在屏幕中动态居中 div,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57759772/