javascript - 悬停效果不适用于变换:rotateY
问题描述
您好,我已经从 w3schools 更改了翻转卡片元素,并添加了 javascript,如果它们在视口中,它们将旋转 60 像素,用户可以理解卡片后面有一个文本。它在滚动上运行良好,但现在我释放悬停效果不起作用。你能帮帮我吗?
https://www.w3schools.com/howto/howto_css_flip_card.asp
https://jsfiddle.net/mqbkzLy2/
var x = 0;
$.fn.isInViewport = function() {
var elementTop = $(this).offset().top;
var elementBottom = elementTop + $(this).outerHeight();
var viewportTop = $(window).scrollTop();
var viewportBottom = viewportTop + $(window).height();
return elementBottom > viewportTop && elementTop < viewportBottom;
};
$(window).scroll(function() {
if ($(".flip-card-inner").isInViewport() && x == 0) {
setTimeout(function() {
$(".flip-card-inner").css('transform', 'rotateY(80deg)');
}, 400);
setTimeout(function() {
$(".flip-card-inner").css('transform', 'rotateY(0)');
}, 800);
x++;
console.log(x);
console.log("in");
}
if (!$(".flip-card-inner").isInViewport() && x != 0) {
x = 0;
console.log('No success.');
console.log(x);
console.log("out");
}
});
body {
font-family: Arial, Helvetica, sans-serif;
}
.flip-card {
background-color: transparent;
width: 300px;
height: 300px;
perspective: 1000px;
}
.flip-card-inner {
position: relative;
width: 100%;
height: 100%;
text-align: center;
transition: transform 0.6s;
transform-style: preserve-3d;
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
}
.flip-card:hover .flip-card-inner {
transform: rotateY(180deg);
}
.flip-card-front,
.flip-card-back {
position: absolute;
width: 100%;
height: 100%;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
}
.flip-card-front {
background-color: #bbb;
color: black;
}
.flip-card-back {
background-color: #2980b9;
color: white;
transform: rotateY(180deg);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div style="height:120vh;background-color:yellow;"></div>
<h1>Card Flip with Text</h1>
<h3>Hover over the image below:</h3>
<div class="flip-card">
<div class="flip-card-inner">
<div class="flip-card-front">
<img src="https://upload.wikimedia.org/wikipedia/commons/d/de/Windows_live_square.JPG" alt="Avatar" style="width:300px;height:300px;">
</div>
<div class="flip-card-back">
<h1>John Doe</h1>
<p>Architect & Engineer</p>
<p>We love that guy</p>
</div>
</div>
</div>
解决方案
如果他们在视口中,他们将旋转 60px,用户可以理解卡片后面有一个文本。
不要为此使用滚动事件侦听器,请为此使用Intersection Observer (IO)。
IO 就是为此类问题而设计的。使用 IO,您可以在 HTML 元素与另一个元素(或视口)相交时做出反应
检查此页面,它向您展示了如何在元素进入视口后为其设置动画(一直向下滚动)。当然,您可以使用任何您想要的动画,然后由 CSS 处理。这只是一个非常明显的例子。
简要回顾一下要让 IO 正常工作必须做的事情:
首先你必须创建一个新的观察者:
var options = {
rootMargin: '0px',
threshold: 1.0
}
var observer = new IntersectionObserver(callback, options);
在这里,我们定义一旦您的目标元素在视口中 100% 可见(阈值为 1),您的回调函数就会被执行。在这里你可以定义另一个百分比,0.5 意味着一旦你的元素有 50% 可见,函数就会被执行。
然后您必须定义要观看的元素
var target = document.querySelector('.flip-card');
observer.observe(target);
最后,您需要通过定义回调函数来指定元素在视口中可见后应该发生的情况:
var callback = function(entries, observer) {
entries.forEach(entry => {
// Each entry describes an intersection change for one observed
// here you animate another element and do whatever you like
});
};
如果您需要支持旧版浏览器,请使用w3c 的官方 polyfill。
如果您不想在元素再次滚动到视图中时再次触发动画,那么您也可以在动画后不观察元素。
推荐阅读
- antlr - 如何定义不匹配的 ANTLR4 词法分析器规则?
- cookies - cookie httponly 未发送
- sql-server - SQL Server Management Studio 中的数据库排序规则错误
- node.js - 如何在 ReactJS 中制作 Material-UI GridListTitleBar 和 Image 链接
- python - 如何在AWS lambda python中循环get_item
- ios - 如果某些变量在 swift 中为零,如何在 JSONSerialization 参数中发布空值?
- react-native - 如何传递特定于索引的道具?
- apache-spark - PySpark - 获取具有相同值的数组元素的数量
- ios - 从相机拍摄的 UIImage 裁剪 CGRect
- html - 如何在 C++ 的 WebBrowser 中显示 HTML 文件