Lottie 在 iOS 上调换位置。在 Windows 和 Android 上运行良好

Posted

技术标签:

【中文标题】Lottie 在 iOS 上调换位置。在 Windows 和 Android 上运行良好【英文标题】:Lottie shifts position on iOS. Works fine on Windows & Android 【发布时间】:2021-09-07 11:32:22 【问题描述】:

所以我有我正在研究的这个 Lottie/iframe 组合。 由于我只是学习javascript,请原谅我乱七八糟的代码。

为了启动 lottie 动画并启动 youtube iframe(自动播放和取消静音),我使用了一个堆叠在 Lottie 顶部的按钮以适应动画的空白区域。

这在 Windows 和 android 浏览器上运行良好。 如果在 Safari(MacOS 和 ios)中加载,lottie 动画会改变位置并且不再与按钮对齐。当动画开始时,lottie 突然移动位置并再次对齐。如果我锁定设备(iPhone X)并再次解锁,彩票会返回错误的位置。

此错误仅存在于 iOS Safari/Chrome 上。可悲的是,我没有 Mac 可以直接在 Safari 中进行调试。也许有人有想法?

代码可能还有更多问题,但除了所描述的问题之外,它似乎工作正常。 youtube iframe 在 codepen 上不可见,因为它们会阻止一些必要的内容。 iframe 的显示在我的网站上按预期工作。

https://codepen.io/peplebe/pen/dyvJQMo

<head>
<script src="https://unpkg.com/@lottiefiles/lottie-player@latest/dist/lottie-player.js"></script>  
  
<script>
  window.onload = function() 
    var player = document.querySelector("lottie-player");
var play = document.querySelector(".start");
var stop = document.querySelector("#stop");
let ytiframe = document.getElementById('ytiframe');
play.onclick = function () 
    player.play(); 
  ytiframe.classList.toggle('fade');
;

    
;

   


</script>
<script src="https://www.youtube.com/iframe_api"></script>
</head>
<style>

  
@-webkit-keyframes glowings 
  0%  background-color: #B20000; -webkit-box-shadow: 0 0 3px #B20000; 
  50%  background-color: #FF0000; -webkit-box-shadow: 0 0 40px #FF0000; 
  100%  background-color: #B20000; -webkit-box-shadow: 0 0 3px #B20000; 


@-moz-keyframes glowings 
  0%  background-color: #B20000; -moz-box-shadow: 0 0 3px #B20000; 
  50%  background-color: #FF0000; -moz-box-shadow: 0 0 40px #FF0000; 
  100%  background-color: #B20000; -moz-box-shadow: 0 0 3px #B20000; 


@-o-keyframes glowings 
  0%  background-color: #B20000; box-shadow: 0 0 3px #B20000; 
  50%  background-color: #FF0000; box-shadow: 0 0 40px #FF0000; 
  100%  background-color: #B20000; box-shadow: 0 0 3px #B20000; 


@keyframes glowings 
  0%  background-color: #ffd300; box-shadow: 0 0 3px #ffde00; 
  50%  background-color: #ffd300; box-shadow: 0 0 40px #ffde00; 
  100%  background-color: #ffd300; box-shadow: 0 0 3px #ffde00; 


.btn-glow 
  -webkit-animation: glowings 1500ms infinite;
  -moz-animation: glowings 1500ms infinite;
  -o-animation: glowings 1500ms infinite;
  animation: glowings 1500ms infinite;
  color: rgb(163,5,0);
  position: absolute;
  bottom: 233px;
  left: 157px;
  width: 130px;
  height: 60px;
  transform: rotate(-0.5deg);
  background-color: rgba(208,207,207,0.72);
  border: 0px;
  font-weight: bold;
  z-index: 199!important;

.btn-glow:hover 
  -webkit-animation: glowings 0ms infinite;
  -moz-animation: glowings 0ms infinite;
  -o-animation: glowings 0ms infinite;
  animation: glowings 0ms infinite;
  
#ytiframe 
    -webkit-transition: opacity 3s ease-in-out;
    -moz-transition: opacity 3s ease-in-out;
    -ms-transition: opacity 3s ease-in-out;
    -o-transition: opacity 3s ease-in-out;
  opacity: 0;  
  width: 250px;
  float: none;
  margin: 0 auto;
#ytiframe.fade 
  opacity:.5;

  .jukeboxcode
    position: relative;
    bottom: -10px;
  
</style>



<body data-rsssl=1>

<div class="jukeboxcode" style="height: 800px; width: 400px; background-color: rgba(25,254,1,0.14); ">

  <button id="fadebutton" class="start play btn-glow">INSERT COIN</button>



<div id="ytiframe" class="video" >
    <iframe   src="https://www.youtube.com/embed/MV_3Dpw-BRY?enablejsapi=1&playsinline=1"  frameborder="0" playsinline="1" allow="autoplay" ></iframe>
</div>
  

<script>
(function() 
    var player;
    window.onYouTubeIframeAPIReady = function() 
        new YT.Player(document.querySelector('.video iframe'), 
            events: 
                onReady: function(e) 
                    player = e.target
                
            
        )
    

    document.querySelector('.jukeboxcode .play').addEventListener('click', function(e) 
        e.preventDefault()
        player.playVideo()
    )
)()
</script>


<lottie-player src="https://assets7.lottiefiles.com/packages/lf20_yc3xb5l6.json"  background="transparent"  speed="1"  style="z-index: 188; width: 400px; height: 550px;" ></lottie-player>



</div>
</body>

最好的问候。

PS:我还希望让 youtube 播放器停止播放,以及在按钮单击时重置抽奖动画。如果有人对此有任何想法,我们将不胜感激。

【问题讨论】:

【参考方案1】:

最终的解决方案是将 lottie 渲染为画布而不是 svg。这修复了错误。 仍然不确定是什么原因造成的。

<lottie-player src="..."  background="transparent"  speed="1" renderer: 'canvas', style="width: 300px; height: 300px;"  loop controls autoplay></lottie-player>    

【讨论】:

以上是关于Lottie 在 iOS 上调换位置。在 Windows 和 Android 上运行良好的主要内容,如果未能解决你的问题,请参考以下文章

Lottie 动画没有出现 iOS

如何在 Lottie iOS 中使用 png 图像?

Lottie AnimationView 在 iOS 中不工作,但在 Android c# 实现中工作

iOS接入 Lottie

使用 lottie-react-native (2.6.1) 时,React native expo 应用程序在 android 上崩溃,但适用于 ios

Lottie 动画越过标题