我有一个带有一些 CSS3 动画的 CSS 地图图钉,它是:'
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;}
}
Run Code Online (Sandbox Code Playgroud)
和它的 HTML
<div class='myBounceDiv'>
<div class='pin bounce'></div>
<div class='pulse'></div>
</div>
Run Code Online (Sandbox Code Playgroud)
好吧,我想在单击时添加反弹 css3 动画,我找到了一些解决方案,例如当我们使用 javascript 单击其 div 时更改 CSS 样式。虽然这是可能的,但是当我更改它的 CSS 类时,它将开始永远反弹。如何让它只动画一次?一种方法可能是触发计时器,并在 1000 毫秒后将其 css 类更改为第一类,但还有另一个问题,我的 div 类有另一个动画(当它第一次出现在页面中时,它从上到下下降)所以如果我将其 css 类更改为弹跳动画并再次将其更改为原始外观动画再次触发,这不是我所需要的。有什么方法可以使用纯 javascript 和 CSS 来实现我所需要的吗?事实上,我需要做这样的事情 http://dynamicsjs.com/examples/pin.html 但它的动画出现在使用 CSS 的点击时。
据我了解,您的意思是:
第一版
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);Run Code Online (Sandbox Code Playgroud)
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;}
}Run Code Online (Sandbox Code Playgroud)
<div class='myBounceDiv'>
<div id="marker" class='pin'></div>
<div class='pulse'></div>
</div>Run Code Online (Sandbox Code Playgroud)
第二版
/*
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);Run Code Online (Sandbox Code Playgroud)
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;}
}Run Code Online (Sandbox Code Playgroud)
<div class='myBounceDiv'>
<div id="marker" class='pin'></div>
<div class='pulse'></div>
</div>Run Code Online (Sandbox Code Playgroud)
更新
/*
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);Run Code Online (Sandbox Code Playgroud)
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;
}Run Code Online (Sandbox Code Playgroud)
<div class='myBounceDiv'>
<div id="marker" class='pin bounce'></div>
<div class='pulse'></div>
</div>Run Code Online (Sandbox Code Playgroud)