【问题标题】:Hover effect doesnot work with Transform: rotateY悬停效果不适用于 Transform: rotateY
【发布时间】:2020-03-16 10:42:01
【问题描述】:

您好,我已经从 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>

【问题讨论】:

  • 您好,您可以尝试使用Ctrl+M 将您的sn-p 插入到特殊的可运行sn-p 中吗?以这种方式运行代码更容易;-)
  • 您可以使用第二个链接 jsfiddle 轻松运行我的代码
  • 因为你正在为html设置内联样式,你可以通过添加!important.flip-card:hover .flip-card-inner { transform: rotateY(180deg) !important; }来覆盖它

标签: javascript css transform


【解决方案1】:

如果他们在视口中,他们将旋转 60px,用户可以理解卡片后面有一个文本。

不要为此使用滚动事件侦听器,请为此使用Intersection Observer (IO)

IO 专为此类问题而设计。使用 IO,您可以在 HTML 元素与另一个元素(或视口)相交时做出反应

Check this page,它向您展示了如何在元素进入视口后为其设置动画(一直向下滚动)。当然,你可以使用任何你想要的动画,然后由 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
  });
};

如果您需要支持旧版浏览器,请使用official polyfill from w3c.

如果您不想在元素再次滚动到视图中时再次触发动画,那么在动画完成后您可以can also unobserve an element

【讨论】:

    猜你喜欢
    • 2011-09-10
    • 2013-09-04
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多