如何使用 JS 为左侧的宽度大小设置动画?
How to animate Width size from left side with JS?
我正在尝试学习如何创建类似于此动画的内容:
https://dribbble.com/shots/5311359-Diprella-Login
所以目前我遇到的问题是 "Green" 或 "Blue" 在我的情况下扩展 > 移动 > 收缩我无法使用 "Width" 获得相同的效果,因为它从右侧,我希望它在移动后从左侧收缩。
附上我的 CodePen:
https://codepen.io/MariusZMM/pen/jJWebK
使用的 JS:
var start = anime.timeline({
easing: 'easeInOutSine',
autoplay: false
});
start
.add({
targets: '.square',
width: 600,
duration: 500
})
.add(
{
targets: '.square',
translateX: 400,
duration: 500
},
'-=100'
)
.add({
targets: '.square',
width: 400,
duration: 500
});
document.querySelector('.btn').onclick = function() {
start.play();
if (start.began) {
start.reverse();
}
};
我也尝试过使用 Padding,但我认为 AnimeJS 不喜欢值 0 0 0 300px
看看这个:
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<style>
.window {
position: absolute;
width: 100%;
height: 100%;
background: #c73030;
z-index: 9999;
}
#box {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 1000px;
height: 500px;
background-color: #f7986c;
z-index: -999;
}
#square {
position: absolute;
top: 0;
width: 400px;
height: 100%;
background-color: cornflowerblue;
}
#btn {
position: absolute;
width: 300px;
height: 70px;
top: 80%;
left: 50%;
transform: translate(-50%, -50%);
background: #444;
}
</style>
</head>
<body>
<div id="box">
<div id="square">
<button id="btn">
<div id="sI">Sign In</div>
</button>
</div>
</div>
<script>
var animated = false;
function animate() {
$('#square').animate({
width: '600',
right: '0'
}, 300, 'swing');
$('#square').animate({
width: '400'
}, 300, 'swing');
$('#square').css("left", "");
animated = true;
}
function reverseAnimate() {
$('#square').animate({
width: '600',
left: '0'
}, 300, 'swing');
$('#square').animate({
width: '400'
}, 300, 'swing');
$('#square').css("right", "");
animated = false;
}
$('#btn').click(function() {
if (!animated) { //If it has not been animated, animate!
animate();
} else {
reverseAnimate();
}
});
</script>
</body>
</html>
我使用了 jQuery 并更改了一些内容以使其看起来更像示例。另外,我喜欢你对 .reverse() 的使用,但我没有在我的案例中使用它。
这是动画的 CSS 版本。
我正在使用一个视觉上隐藏的复选框,按钮是一个 label
来控制复选框,CSS 动画在选中状态下切换。
唯一的问题是它在加载时反向执行初始动画。
编辑: 我实际上通过对 CSS (:not(indeterminate)
) 的轻微调整和加载的附加 JS 片段来设置indeterminate
.
复选框
const checkbox = document.getElementById('sign-in-state');
checkbox.indeterminate = true;
@keyframes login {
0% {
left: 0;
width: 40%;
}
50% {
width: 60%;
}
100% {
left: 60%;
width: 40%;
}
}
@keyframes logout {
0% {
left: 60%;
width: 40%;
}
50% {
width: 60%;
}
100% {
left: 0%;
width: 40%;
}
}
.sign-in-checkbox:not(:indeterminate):not(:checked) + .box .square {
--animation-name: login;
}
.sign-in-checkbox:not(:indeterminate):checked + .box .square {
--animation-name: logout forwards;
}
.window {
position: absolute;
width: 100%;
height: 100%;
background: #c73030;
z-index: 9999;
}
.box {
position: absolute;
top: 50%;
left: 50%;
overflow: hidden;
transform: translate(-50%, -50%);
width: 100vw;
height: 100vh;
background-color: #f7986c;
z-index: -999;
}
.square {
animation: var(--animation-name) 600ms reverse ease-in-out;
position: absolute;
right: auto;
top: 0;
width: 40%;
height: 100%;
background-color: cornflowerblue;
}
.btn {
display: flex;
align-items: center;
justify-content: center;
color: white;
font-family: sans-serif;
position: absolute;
width: 200px;
height: 70px;
top: 80%;
left: 50%;
transform: translate(-50%, -50%);
background: #444;
}
.visually-hidden { /* https://snook.ca/archives/html_and_css/hiding-content-for-accessibility */
position: absolute !important;
height: 1px; width: 1px;
overflow: hidden;
clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
clip: rect(1px, 1px, 1px, 1px);
}
<input type="checkbox" id="sign-in-state" class="visually-hidden sign-in-checkbox">
<div class="box">
<div class="square">
<label class="btn" for="sign-in-state">
<div class="sI">Sign In</div>
</label>
</div>
</div>
我正在尝试学习如何创建类似于此动画的内容: https://dribbble.com/shots/5311359-Diprella-Login
所以目前我遇到的问题是 "Green" 或 "Blue" 在我的情况下扩展 > 移动 > 收缩我无法使用 "Width" 获得相同的效果,因为它从右侧,我希望它在移动后从左侧收缩。
附上我的 CodePen: https://codepen.io/MariusZMM/pen/jJWebK
使用的 JS:
var start = anime.timeline({
easing: 'easeInOutSine',
autoplay: false
});
start
.add({
targets: '.square',
width: 600,
duration: 500
})
.add(
{
targets: '.square',
translateX: 400,
duration: 500
},
'-=100'
)
.add({
targets: '.square',
width: 400,
duration: 500
});
document.querySelector('.btn').onclick = function() {
start.play();
if (start.began) {
start.reverse();
}
};
我也尝试过使用 Padding,但我认为 AnimeJS 不喜欢值 0 0 0 300px
看看这个:
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<style>
.window {
position: absolute;
width: 100%;
height: 100%;
background: #c73030;
z-index: 9999;
}
#box {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 1000px;
height: 500px;
background-color: #f7986c;
z-index: -999;
}
#square {
position: absolute;
top: 0;
width: 400px;
height: 100%;
background-color: cornflowerblue;
}
#btn {
position: absolute;
width: 300px;
height: 70px;
top: 80%;
left: 50%;
transform: translate(-50%, -50%);
background: #444;
}
</style>
</head>
<body>
<div id="box">
<div id="square">
<button id="btn">
<div id="sI">Sign In</div>
</button>
</div>
</div>
<script>
var animated = false;
function animate() {
$('#square').animate({
width: '600',
right: '0'
}, 300, 'swing');
$('#square').animate({
width: '400'
}, 300, 'swing');
$('#square').css("left", "");
animated = true;
}
function reverseAnimate() {
$('#square').animate({
width: '600',
left: '0'
}, 300, 'swing');
$('#square').animate({
width: '400'
}, 300, 'swing');
$('#square').css("right", "");
animated = false;
}
$('#btn').click(function() {
if (!animated) { //If it has not been animated, animate!
animate();
} else {
reverseAnimate();
}
});
</script>
</body>
</html>
我使用了 jQuery 并更改了一些内容以使其看起来更像示例。另外,我喜欢你对 .reverse() 的使用,但我没有在我的案例中使用它。
这是动画的 CSS 版本。
我正在使用一个视觉上隐藏的复选框,按钮是一个 label
来控制复选框,CSS 动画在选中状态下切换。
唯一的问题是它在加载时反向执行初始动画。
编辑: 我实际上通过对 CSS (:not(indeterminate)
) 的轻微调整和加载的附加 JS 片段来设置indeterminate
.
const checkbox = document.getElementById('sign-in-state');
checkbox.indeterminate = true;
@keyframes login {
0% {
left: 0;
width: 40%;
}
50% {
width: 60%;
}
100% {
left: 60%;
width: 40%;
}
}
@keyframes logout {
0% {
left: 60%;
width: 40%;
}
50% {
width: 60%;
}
100% {
left: 0%;
width: 40%;
}
}
.sign-in-checkbox:not(:indeterminate):not(:checked) + .box .square {
--animation-name: login;
}
.sign-in-checkbox:not(:indeterminate):checked + .box .square {
--animation-name: logout forwards;
}
.window {
position: absolute;
width: 100%;
height: 100%;
background: #c73030;
z-index: 9999;
}
.box {
position: absolute;
top: 50%;
left: 50%;
overflow: hidden;
transform: translate(-50%, -50%);
width: 100vw;
height: 100vh;
background-color: #f7986c;
z-index: -999;
}
.square {
animation: var(--animation-name) 600ms reverse ease-in-out;
position: absolute;
right: auto;
top: 0;
width: 40%;
height: 100%;
background-color: cornflowerblue;
}
.btn {
display: flex;
align-items: center;
justify-content: center;
color: white;
font-family: sans-serif;
position: absolute;
width: 200px;
height: 70px;
top: 80%;
left: 50%;
transform: translate(-50%, -50%);
background: #444;
}
.visually-hidden { /* https://snook.ca/archives/html_and_css/hiding-content-for-accessibility */
position: absolute !important;
height: 1px; width: 1px;
overflow: hidden;
clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
clip: rect(1px, 1px, 1px, 1px);
}
<input type="checkbox" id="sign-in-state" class="visually-hidden sign-in-checkbox">
<div class="box">
<div class="square">
<label class="btn" for="sign-in-state">
<div class="sI">Sign In</div>
</label>
</div>
</div>