我有一个CSS地图引脚,它有一些CSS3动画,这里是:'
https://jsfiddle.net/xg7xfzeq/
body {
background: #e6e6e6;
}
.pin {
width: 30px;
height: 30px;
border-radius: 50% 50% 50% 0;
background: #00cae9;
position: absolute;
transform: rotate(-45deg);
left: 50%;
top: 50%;
margin: -20px 0 0 -20px;
}
.pin:after {
content: "";
width: 14px;
height: 14px;
margin: 8px 0 0 8px;
background: #e6e6e6;
position: absolute;
border-radius: 50%;
}
.bounce {
animation-name: bounce;
animation-fill-mode: both;
animation-duration: 1s;
}
.pulse {
background: #d6d4d4;
border-radius: 50%;
height: 14px;
width: 14px;
position: absolute;
left: 50%;
top: 50%;
margin: 11px 0px 0px -12px;
transform: rotateX(55deg);
z-index: -2;
}
.pulse:after {
content: "";
border-radius: 50%;
height: 40px;
width: 40px;
position: absolute;
margin: -13px 0 0 -13px;
animation: pulsate 1s ease-out;
animation-iteration-count: infinite;
opacity: 0;
box-shadow: 0 0 1px 2px #00cae9;
animation-delay: 1.1s;
}
@keyframes pulsate {
0% {
transform: scale(0.1, 0.1);
opacity: 0;
}
50% {
opacity: 1;
}
100% {
transform: scale(1.2, 1.2);
opacity: 0;
}
}
@keyframes bounce {
0% {
opacity: 0;
transform: translateY(-2000px) rotate(-45deg);
}
60% {
opacity: 1;
transform: translateY(30px) rotate(-45deg);
}
80% {
transform: translateY(-10px) rotate(-45deg);
}
100% {
transform: translateY(0) rotate(-45deg);
}
}
.myBounceDiv {
-moz-animation:bounce .40s linear;
-webkit-animation:bounce .40s linear;
}
@-moz-keyframes bounce {
0%{ -moz-transform:scale(0); opacity:0;}
50%{ -moz-transform:scale(1.3); opacity:0.4; }
75%{ -moz-transform:scale(0.9); opacity:0.7;}
100%{ -moz-transform:scale(1); opacity:1;}
}
@-webkit-keyframes bounce {
0%{ -webkit-transform:scale(0); opacity:0;}
50%{ -webkit-transform:scale(1.3); opacity:0.4;}
75%{ -webkit-transform:scale(0.9); opacity:0.7;}
100%{ -webkit-transform:scale(1); opacity:1;}
}
及其HTML
<div class='myBounceDiv'>
<div class='pin bounce'></div>
<div class='pulse'></div>
</div>
好吧,我想在点击时添加弹跳css3动画,我找到了一些解决方案,例如当我们使用javascript点击它的div时更改CSS样式。 虽然它是可能的,但当我改变它的CSS类时,它将开始永远反弹。怎么能让它只有一次动画?一种方法可能是触发一个计时器,并在1000毫秒后将其css类更改为其第一个类,但还有另一个问题,我的div类有另一个动画(当它首次出现在页面中时,它从上到下掉落所以,如果我将其css类更改为弹跳动画并再次将其更改为原始动画,则外观动画再次变为trigers,这不是我需要的。 有没有办法用纯javascript和CSS实现我需要的东西?事实上,我需要做这样的事情 http://dynamicsjs.com/examples/pin.html 但是它的动画会在点击时出现。
答案 0 :(得分:4)
据我所知,你的意思是:
第一个版本
element = document.getElementById("marker");
element.addEventListener("click", function(e) {
e.preventDefault;
// -> removing the class
element.classList.remove("bounce");
// -> triggering reflow /* The actual magic */
// without this it wouldn't work. Try uncommenting the line and the transition won't be retriggered.
element.offsetWidth = element.offsetWidth;
// -> and re-adding the class
element.classList.add("bounce");
}, false);
body {
background: #e6e6e6;
}
.pin {
width: 30px;
height: 30px;
border-radius: 50% 50% 50% 0;
background: #00cae9;
position: absolute;
transform: rotate(-45deg);
left: 50%;
top: 50%;
margin: -20px 0 0 -20px;
}
.pin:after {
content: "";
width: 14px;
height: 14px;
margin: 8px 0 0 8px;
background: #e6e6e6;
position: absolute;
border-radius: 50%;
}
.bounce {
animation-name: bounce;
animation-fill-mode: both;
animation-duration: 0.9s;
}
.pulse {
background: #d6d4d4;
border-radius: 50%;
height: 14px;
width: 14px;
position: absolute;
left: 50%;
top: 50%;
margin: 11px 0px 0px -12px;
transform: rotateX(55deg);
z-index: -2;
}
.bounce+.pulse:after {
content: "";
border-radius: 50%;
height: 40px;
width: 40px;
position: absolute;
margin: -13px 0 0 -13px;
animation: pulsate 1s ease-out;
opacity: 0;
box-shadow: 0 0 1px 2px #00cae9;
animation-delay: 0.1s;
-webkit-animation-iteration-count: 1;
animation-iteration-count: 1;
}
@keyframes pulsate {
0%, 100% {
transform: scale(0.1, 0.1);
opacity: 0;
}
50% {
opacity: 1;
}
100% {
transform: scale(1.2, 1.2);
opacity: 0;
}
}
@keyframes bounce {
0% {
opacity: 0;
transform: translateY(-1000px) rotate(-45deg);
}
60% {
opacity: 1;
transform: translateY(30px) rotate(-45deg);
}
80% {
transform: translateY(-10px) rotate(-45deg);
}
100% {
transform: translateY(0) rotate(-45deg);
}
}
.myBounceDiv {
-moz-animation:bounce .40s linear;
-webkit-animation:bounce .40s linear;
}
@-moz-keyframes bounce {
0%{ -moz-transform:scale(0); opacity:0;}
50%{ -moz-transform:scale(1.3); opacity:0.4; }
75%{ -moz-transform:scale(0.9); opacity:0.7;}
100%{ -moz-transform:scale(1); opacity:1;}
}
@-webkit-keyframes bounce {
0%{ -webkit-transform:scale(0); opacity:0;}
50%{ -webkit-transform:scale(1.3); opacity:0.4;}
75%{ -webkit-transform:scale(0.9); opacity:0.7;}
100%{ -webkit-transform:scale(1); opacity:1;}
}
<div class='myBounceDiv'>
<div id="marker" class='pin'></div>
<div class='pulse'></div>
</div>
第二版
/*
Reference: https://css-tricks.com/restart-css-animation/
*/
element = document.getElementById("marker");
element.addEventListener("click", function(e) {
e.preventDefault;
// -> removing the class
element.classList.remove("bounce");
// -> triggering reflow /* The actual magic */
// without this it wouldn't work. Try uncommenting the line and the transition won't be retriggered.
element.offsetWidth = element.offsetWidth;
// -> and re-adding the class
element.classList.add("bounce");
}, false);
body {
background: #e6e6e6;
}
.pin {
width: 30px;
height: 30px;
border-radius: 50% 50% 50% 0;
background: #00cae9;
position: absolute;
transform: rotate(-45deg);
left: 50%;
top: 50%;
margin: -20px 0 0 -20px;
}
.pin:after {
content: "";
width: 14px;
height: 14px;
margin: 8px 0 0 8px;
background: #e6e6e6;
position: absolute;
border-radius: 50%;
}
.bounce {
animation-name: bounce;
animation-fill-mode: both;
animation-duration: 0.9s;
}
.pulse {
background: #d6d4d4;
border-radius: 50%;
height: 14px;
width: 14px;
position: absolute;
left: 50%;
top: 50%;
margin: 11px 0px 0px -12px;
transform: rotateX(55deg);
z-index: -2;
}
.pulse:after {
content: "";
border-radius: 50%;
height: 40px;
width: 40px;
position: absolute;
margin: -13px 0 0 -13px;
animation: pulsate 1s ease-out;
animation-iteration-count: infinite;
opacity: 0;
box-shadow: 0 0 1px 2px #00cae9;
animation-delay: 0.1s;
}
@keyframes pulsate {
0%, 100% {
transform: scale(0.1, 0.1);
opacity: 0;
}
50% {
opacity: 1;
}
100% {
transform: scale(1.2, 1.2);
opacity: 0;
}
}
@keyframes bounce {
0% {
opacity: 0;
transform: translateY(-1000px) rotate(-45deg);
}
60% {
opacity: 1;
transform: translateY(30px) rotate(-45deg);
}
80% {
transform: translateY(-10px) rotate(-45deg);
}
100% {
transform: translateY(0) rotate(-45deg);
}
}
.myBounceDiv {
-moz-animation:bounce .40s linear;
-webkit-animation:bounce .40s linear;
}
@-moz-keyframes bounce {
0%{ -moz-transform:scale(0); opacity:0;}
50%{ -moz-transform:scale(1.3); opacity:0.4; }
75%{ -moz-transform:scale(0.9); opacity:0.7;}
100%{ -moz-transform:scale(1); opacity:1;}
}
@-webkit-keyframes bounce {
0%{ -webkit-transform:scale(0); opacity:0;}
50%{ -webkit-transform:scale(1.3); opacity:0.4;}
75%{ -webkit-transform:scale(0.9); opacity:0.7;}
100%{ -webkit-transform:scale(1); opacity:1;}
}
<div class='myBounceDiv'>
<div id="marker" class='pin'></div>
<div class='pulse'></div>
</div>
更新
/*
Reference: https://css-tricks.com/restart-css-animation/
*/
element = document.getElementById("marker");
setTimeout(function() {
element.classList.remove("bounce");
}, 1000);
element.addEventListener("click", function(e) {
e.preventDefault;
// -> removing the class
element.classList.remove("drop");
// -> triggering reflow /* The actual magic */
// without this it wouldn't work. Try uncommenting the line and the transition won't be retriggered.
element.offsetWidth = element.offsetWidth;
// -> and re-adding the class
element.classList.add("drop");
}, false);
body {
background: #e6e6e6;
}
.pin {
width: 30px;
height: 30px;
border-radius: 50% 50% 50% 0;
background: #00cae9;
position: absolute;
transform: rotate(-45deg);
left: 50%;
top: 50%;
margin: -20px 0 0 -20px;
}
.pin:after {
content: "";
width: 14px;
height: 14px;
margin: 8px 0 0 8px;
background: #e6e6e6;
position: absolute;
border-radius: 50%;
}
.bounce {
animation-name: bounce;
animation-fill-mode: both;
animation-duration: 0.9s;
}
.pulse {
background: #d6d4d4;
border-radius: 50%;
height: 14px;
width: 14px;
position: absolute;
left: 50%;
top: 50%;
margin: 11px 0px 0px -12px;
transform: rotateX(55deg);
z-index: -2;
}
.pulse:after {
content: "";
border-radius: 50%;
height: 40px;
width: 40px;
position: absolute;
margin: -13px 0 0 -13px;
animation: pulsate 1s ease-out;
animation-iteration-count: infinite;
opacity: 0;
box-shadow: 0 0 1px 2px #00cae9;
animation-delay: 0.1s;
}
@keyframes pulsate {
0%, 100% {
transform: scale(0.1, 0.1);
opacity: 0;
}
50% {
opacity: 1;
}
100% {
transform: scale(1.2, 1.2);
opacity: 0;
}
}
@keyframes bounce {
0% {
opacity: 0;
transform: translateY(-1000px) rotate(-45deg);
}
60% {
opacity: 1;
transform: translateY(5px) rotate(-45deg);
}
80% {
transform: translateY(-10px) rotate(-45deg);
}
100% {
transform: translateY(0) rotate(-45deg);
}
}
.myBounceDiv {
-moz-animation:bounce .40s linear;
-webkit-animation:bounce .40s linear;
}
@-moz-keyframes bounce {
0%{ -moz-transform:scale(0); opacity:0;}
50%{ -moz-transform:scale(1.3); opacity:0.4; }
75%{ -moz-transform:scale(0.9); opacity:0.7;}
100%{ -moz-transform:scale(1); opacity:1;}
}
@-webkit-keyframes bounce {
0%{ -webkit-transform:scale(0); opacity:0;}
50%{ -webkit-transform:scale(1.3); opacity:0.4;}
75%{ -webkit-transform:scale(0.9); opacity:0.7;}
100%{ -webkit-transform:scale(1); opacity:1;}
}
@keyframes drop {
0% {
transform: translateY(-40px) rotate(-45deg);
}
80% {
transform: translateY(3px) rotate(-45deg);
}
100% {
transform: translateY(0) rotate(-45deg);
}
}
.drop {
animation-name: drop;
animation-fill-mode: both;
animation-duration: 0.5s;
}
<div class='myBounceDiv'>
<div id="marker" class='pin bounce'></div>
<div class='pulse'></div>
</div>
答案 1 :(得分:1)
不是将CSS类更改为弹跳动画并返回原始类,而是添加(单击时)和删除(1s后)类到pin
或myBounceDiv
。需要注意的是,一旦动画完成,您还需要删除bounce
类。
它看起来像这样:
const pinEl = document.querySelector('.pin');
setTimeout(() => pinEl.classList.remove('bounce'), 1000);
function removeMiniBounce() {
pinEl.classList.remove("miniBounce");
}
pinEl.onclick = () => {
pinEl.classList.add("miniBounce");
setTimeout(removeMiniBounce, 1000);
}
你的CSS将是:
@keyframes miniBounce {
0%{ -webkit-transform:translateY(0px) rotate(-45deg);}
30%{ -webkit-transform:translateY(-20px) rotate(-45deg);}
60%{ -webkit-transform:translateY(0px) rotate(-45deg);}
70%{ -webkit-transform:translateY(-5px) rotate(-45deg);}
100%{ -webkit-transform:translateY(0) rotate(-45deg);}
}
.miniBounce {
animation: miniBounce 0.4s ease-in-out;
}