【问题标题】:CSS transition different behavior depending on browser typeCSS根据浏览器类型转换不同的行为
【发布时间】:2018-05-26 03:56:28
【问题描述】:

在我的代码中,我根据当前鼠标 X 和 Y 位置更改了某些元素的位置。我添加了一个 css transition: all 5000ms; 以使动画更流畅。

它在 Google Chrome(版本 63)中看起来很棒并且可以正常工作,但在 Internet ExplorerFirefox 中,动画看起来很迟钝/断断续续

这是我的代码:

// $('.shape').css("transition", "all 7000ms");
$(document).mousemove(function(e){
    let mX = e.clientX;
    let mY = e.clientY;
    $('.shape-1').css("transform", "translate("+mX/10+"px, "+mY/10+"px)");
});

有谁知道为什么浏览器会以不同的方式处理 css 转换?

JSFiddle 没有 CSS 过渡https://jsfiddle.net/2rrcp27L/9/

JSFiddle 带有 CSS 过渡https://jsfiddle.net/2rrcp27L/6/

【问题讨论】:

  • 加入未来,放弃对 Internet Explorer 的支持。专注于边缘。
  • @Tschallacka 但是在Firefox中效果也很卡...
  • 为什么不使用transition: transform 500ms 而不是all
  • @kumar 我可以做到这一点,但它仍然不能修复 Firefox:jsfiddle.net/2rrcp27L/11

标签: javascript jquery css css-transitions


【解决方案1】:

你可以使用:

-webkit-transform /* android, safari, chrome */

-moz-transform /* old firefox */

-o-transform /* old opera */

-ms-transform /* old IE */

transform   /*standard */

【讨论】:

  • 嗨@Mahmoud D. Alghraibeh 感谢您的回答。但我已经尝试过了,它在 Firefox 中仍然滞后。如果我没记错的话,firefox 不需要 -moz- 转换前缀:caniuse.com/#feat=css-transitions
  • 为了验证,浏览器多年来不需要供应商前缀或版本,当然除了 IE。这不是解决办法。
  • 我建议不要手动编写这样的代码。你应该使用autoprefixer 来为你做这件事——它的维护工作要少得多,而且当这些浏览器变得太旧甚至不重要时,你不必担心删除 IE 和 opera 后备。 (例如,今天只有 0.05% 的人使用 Opera 12.1 - 你真的需要代码吗?)
  • 另外,我认为这实际上不会对提高 Firefox/IE 的性能有任何帮助。这是一个渲染问题,而不是 CSS 兼容性问题。
  • @Rob:“当然,除了 IE”,它在任何稳定版本中从不需要转换前缀,唯一需要转换前缀的版本不需要支持过渡。
【解决方案2】:

发生这种情况的主要原因是mouseMove 触发了很多次,Chrome 可以处理它,但也许 Firefox 不能,而 IE 肯定不能,已针对处理此类情况进行了优化。

你应该throttle你对处理程序的调用。

看这个小提琴: https://jsfiddle.net/s2f9d77x/

此外,建议指定transition: transform 而不是transition: all 以告诉浏览器不要担心元素的其他属性。

【讨论】:

  • 您可以使用不同的油门超时值来查看哪个最适合您的情况。 .
  • 另外,作为最佳实践,也许不要在最终网站中包含整个 lodash 包,而只包含 lodash.throttle 子包 - 如果可能的话
  • 尽管我不喜欢在如此简单的任务中包含 lodash (imo)。这似乎是最好的解决方案。谢谢@kumar
  • 如果您愿意,您可以滚动自己的油门功能。我使用 lodash 只是为了说明这一点。此外,您可以在项目中只使用 lodash/throttle - 不需要完整的东西。
  • 是的,我就是这样做的,请在下面查看我的答案。再次感谢@kumar_harsh
【解决方案3】:

问题似乎是鼠标事件的频率 - 您在过渡效果完成之前设置了新的变换。当 chrome 从当前动画状态开始时,FF/IE 似乎重置为上次完成的转换值。

解决方案可以是 left 和 translate 属性的组合设置,例如在更新的 sn-p 中,您可以通过更新的 left/top 属性“模拟”过渡的结束。这仍然有点跳跃,因为每个 mousemove 都会立即更新到之前的鼠标事件,但不再是跳跃了。如果您想对动画进行更多控制,则必须编写一个复杂得多的 javascript。

$('.shape')
   .css("transition", "transform 200ms cubic-bezier(0, 1.17, 1, 1)")
   .each(function() {
     $(this).data("left", parseInt($(this).css("left")));
     $(this).data("top", parseInt($(this).css("top")));
   });
 let factors = [
   [10, 10],
   [3, 3],
   [5, 5],
   [7, 7]
 ];
 let mX, mY;
 $(window).on('mousemove', function(e) {

   if (typeof mX !== "undefined") {
     $('.shape').each(function(idx) {
       let $shape = $(this);
       $shape.css({
         "left": $shape.data("left") + mX / factors[idx][0],
         "top": $shape.data("top") + mY / factors[idx][1],
         "transform": "translate(" + (e.clientX - mX) / factors[idx][0] + "px, " + (e.clientY - mY) / factors[idx][1] + "px)"
       });
     })
   }

   mX = e.clientX;
   mY = e.clientY;


 });
body {
    background: #E1F7E7;
    background: -moz-linear-gradient(45deg, rgba(169,232,220,1) 0%, rgba(225,247,231,1) 50%, rgba(169,232,220,1) 100%); /* ff3.6+ */
    background: -webkit-gradient(linear, left bottom, right top, color-stop(0%, rgba(169,232,220,1)), color-stop(50%, rgba(225,247,231,1)), color-stop(100%, rgba(169,232,220,1))); /* safari4+,chrome */
    background: -webkit-linear-gradient(45deg, rgba(169,232,220,1) 0%, rgba(225,247,231,1) 50%, rgba(169,232,220,1) 100%); /* safari5.1+,chrome10+ */
    background: -o-linear-gradient(45deg, rgba(169,232,220,1) 0%, rgba(225,247,231,1) 50%, rgba(169,232,220,1) 100%); /* opera 11.10+ */
    background: -ms-linear-gradient(45deg, rgba(169,232,220,1) 0%, rgba(225,247,231,1) 50%, rgba(169,232,220,1) 100%); /* ie10+ */
    background: linear-gradient(45deg, rgba(169,232,220,1) 0%, rgba(225,247,231,1) 50%, rgba(169,232,220,1) 100%); /* w3c */
    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#a9e8dc', endColorstr='#a9e8dc',GradientType=1 ); /* ie6-9 */
}
.shape {
    position: fixed;
    transform-origin: center;
}
.shape:after{
    position: absolute;
    content: "";
    left: -25px;
    top: -50px;
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    border-bottom: 500px solid;
}

.shape-1 {
    top: 50px;
    left: 200px;
}
.shape.shape-1:after {
    transform: rotate(190deg);
    border-bottom-color: #A9E8DC;
}

.shape-2 {
    bottom: 300px;
    left: 250px;
}
.shape.shape-2:after {
    transform: rotate(19deg);
    border-bottom-color: #02BEC4;
}
.shape-3 {
    
    bottom: 380px;
    right: 220px;
}
.shape.shape-3:after {
    transform: rotate(-19deg);
    border-bottom-color: #0284A8;
}

.shape-4 {
    top: 200px;
    right: 180px;
}
.shape.shape-4:after {
    transform: rotate(-190deg);
    border-bottom-color: #050C42;
}

@media (max-width: 1450px) {
    .shape.shape-4:after {
        transform: rotate(-190deg);
        border-bottom-color: #02BEC4;
    }
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.slim.min.js"></script>
<div class="shape shape-1"></div>
<div class="shape shape-2"></div>
<div class="shape shape-3"></div>
<div class="shape shape-4"></div>
<div class="container">
  <h1>Hello World</h1>
  <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Ipsum magnam unde earum voluptas quae? Molestiae cum suscipit, esse placeat eligendi rerum nam minus inventore. Voluptatum impedit sunt quisquam officiis eius obcaecati totam aliquid incidunt
    vel aliquam. Nemo quae iusto perferendis corrupti provident sint quisquam, impedit nesciunt architecto a, ea necessitatibus!</p>
  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ratione, eveniet! Harum saepe quia inventore, atque dolorem culpa debitis. Blanditiis ad ab delectus, magnam assumenda sequi corrupti dolorum incidunt eligendi obcaecati magni! Veniam maxime
    ratione placeat veritatis excepturi. Nisi sed, dolorum, maxime laboriosam magnam vel aperiam beatae autem dicta, totam commodi? Modi, ratione tempore recusandae nulla suscipit quaerat earum repudiandae vero sit ad dolorem quasi, laboriosam culpa.
    Sequi, laboriosam assumenda? Aliquid esse impedit cum reprehenderit ex ipsa deleniti nam pariatur alias iusto sit tempore tempora eius optio voluptates veniam, laboriosam aliquam, odio corporis possimus nihil fugiat. Consectetur repellendus fugit
    dolorum ipsa ullam optio tempora maxime possimus, atque aut doloribus, iusto quam? Repellendus ipsa, praesentium tempore incidunt quasi cumque quidem nostrum harum non facilis doloremque voluptates quis architecto consequuntur consequatur. Illo, eius?
    Dolorem deserunt ipsam error voluptates necessitatibus iste dolor? Quo adipisci corporis incidunt fuga sapiente recusandae qui quod, impedit maiores! Eum blanditiis natus officiis inventore architecto! Aliquid quis praesentium doloremque laboriosam
    consectetur veniam excepturi inventore, exercitationem iusto sed, maxime sunt laudantium porro possimus esse? Dolor eveniet laborum aut tempore blanditiis voluptatem asperiores dolore incidunt, ipsa ea ut consequatur, itaque sint reprehenderit aliquam
    nesciunt debitis ex quia. Cupiditate beatae sapiente minima, fuga architecto, ad, aliquam provident et corporis tempore nostrum natus labore hic in eaque dolor perspiciatis nesciunt deleniti error unde. Sapiente nemo deleniti omnis quod odit accusamus
    obcaecati ea culpa ut fugiat, cumque vitae? Iste corporis quo illum nesciunt fugit quis officia consequuntur sit eum dignissimos. Necessitatibus autem eligendi quod quis tenetur, quos excepturi rerum repudiandae ullam magnam sequi consequuntur voluptate
    sint nemo ea, at tempora. Dolore consequuntur excepturi perferendis cumque tempore nam consequatur sit tempora cupiditate nisi magnam quos nulla nobis iste optio voluptas temporibus mollitia quibusdam hic, eaque vitae culpa dolorum error? Beatae numquam
    animi distinctio doloribus unde velit quasi quisquam necessitatibus reprehenderit vitae, obcaecati minus, tempora illo impedit ullam blanditiis vero excepturi ratione fugiat nemo? Quidem dicta perspiciatis iste cum, quisquam vel minima consequuntur
    blanditiis aperiam, sequi eligendi exercitationem inventore, eos facilis laborum beatae excepturi praesentium dolore quaerat assumenda quo obcaecati? Dolores, pariatur suscipit! Voluptate inventore assumenda delectus optio totam adipisci amet distinctio
    exercitationem sint debitis ea, vel deleniti odio odit. Illo adipisci, id, dolores culpa voluptatum eligendi fugit numquam quis accusamus possimus, ea odit laborum ullam non quasi! Dicta est aliquid saepe! In officia, dolor quo architecto illum repudiandae.
    Suscipit, pariatur sed commodi quod dolorem beatae quae!</p>
  <h2>What up?</h2>
  <p>Lorem ipsum dolor sit amet consectetur, adipisicing elit. Itaque, dolor quam. Fugiat numquam eius animi omnis explicabo atque. Expedita velit unde iure earum, sit id esse provident odit illum recusandae deserunt laborum quis molestiae omnis! Laborum
    ea officiis exercitationem perferendis magnam temporibus eligendi porro earum nobis nesciunt. Ducimus quisquam commodi eum, pariatur, illo sint doloribus similique ea fuga porro sapiente, quam blanditiis. Veritatis quasi officia soluta explicabo nobis!
    Explicabo id voluptate quasi tenetur iste eum dolor illo, architecto, harum ad cum provident vero, saepe unde sed? Doloribus eaque pariatur sequi officia. Sit ipsam doloribus molestias ipsum adipisci recusandae explicabo sint ad rem magni, ducimus
    eligendi! Velit, dolore illo laboriosam ipsa, a sunt eum soluta nesciunt expedita porro atque maiores dolores amet temporibus nemo, cum hic libero autem ad? Nobis molestiae accusantium dolor aspernatur dolorem exercitationem reprehenderit quisquam
    est, fuga distinctio neque, iste, libero necessitatibus. Voluptatum aut ducimus autem magnam, quaerat iusto rem libero iste magni odio voluptatibus excepturi voluptates ab dolor laudantium nesciunt, ea, enim totam? Nostrum unde enim accusamus aliquid
    debitis sint amet commodi, iusto maxime distinctio. Nobis aut quae molestiae et architecto quo animi aliquam, vel iste, expedita, nihil praesentium voluptates soluta sed? Illum natus, aspernatur iure expedita beatae maxime eveniet perferendis laborum
    recusandae quo temporibus voluptate dolores fugiat at. Sit aperiam minus et nemo doloremque nihil, alias libero dolor dolorum commodi pariatur in atque deleniti distinctio recusandae molestias consequuntur consectetur sapiente ut cupiditate fugiat
    eveniet. Ad quo quaerat consequuntur recusandae excepturi debitis tempora temporibus atque amet iure.</p>
  <br>
  <h2>and Good Bye...</h2>
  <p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Cum unde, necessitatibus laboriosam obcaecati cumque eum iure blanditiis voluptate temporibus possimus quam suscipit dolore dicta reprehenderit repellendus? Minima, voluptate voluptatum! Nostrum
    modi minus dignissimos, minima omnis eligendi adipisci eaque consectetur totam incidunt vitae reprehenderit, corrupti qui dicta soluta nihil! In quasi porro temporibus ipsum similique, aspernatur velit ullam laudantium id molestiae ut esse provident
    natus, eius iste earum ab corrupti, officiis distinctio eos repellat tenetur odio. Temporibus, eum! Aliquid libero doloribus necessitatibus consequuntur adipisci dicta ducimus quam qui odit atque eius voluptates repellendus illo non perferendis eum
    reiciendis dolor aliquam, excepturi voluptatum. Temporibus veritatis autem, numquam ab maiores cumque exercitationem. Porro minima quod magni blanditiis cupiditate dolorum dolores qui, ipsum voluptas nostrum, soluta modi nam harum atque aliquid ea
    totam accusantium consectetur quae? Libero ad at atque quisquam enim accusamus, perferendis provident sequi, blanditiis velit recusandae odio tenetur deserunt quo incidunt quam eaque perspiciatis fugit in unde non quidem, natus labore? Eveniet ducimus
    eius ullam! Aut aperiam enim, voluptatibus, harum cumque voluptas debitis voluptatem ullam placeat omnis et magni dolorem asperiores obcaecati quo deleniti delectus error incidunt possimus expedita maiores quisquam reiciendis? Unde, reprehenderit.
    Et natus ullam asperiores sapiente veniam sint.</p>
</div>

【讨论】:

  • 感谢您的回答,但来自@kumar 的版本最适合我
【解决方案4】:

一段时间后,我找到了一个最适合我的解决方案,它不需要任何额外的库(jQuery 除外)

我基本上创建了自己的“油门”功能,它只更新鼠标的当前 x 和 y 位置。

这里我将鼠标位置附加到窗口对象上,每次鼠标在浏览器窗口中移动:

$(document).mousemove(function(e){
    var event = e || window.event;
    window.mouseX = event.clientX;
    window.mouseY = event.clientY;
});

然后我有另一个函数,它设置我的元素的位置:

function moveElements() {
   $('.shape-1').css("transform", "translate("+ window.mouseX/10 +"px, "+ window.mouseY/10 +"px)");
}

最后,moveElements() 函数每 100 毫秒被调用一次,使用 setInterval() 函数:

setInterval(moveElements, 100);

感谢@kumar_harsh 为我提供了解决问题的思路。

我在以下浏览器中测试了这段代码,它运行时没有延迟/抖动:

  • 铬 63
  • 火狐57
  • Internet Explorer 11
  • Microsoft Edge 16
  • Safari 11

这是我最后的JSFiddlehttps://jsfiddle.net/2rrcp27L/27/

【讨论】:

  • 您是否在任何地方取消 setInterval?如果没有,那么即使用户没有与页面交互,它也会继续调用自己 - 消耗电池和资源。
  • 我想向您推荐这篇文章,以便更好地了解限制,以及为什么使用它比仅仅使用 setInterval 更好:medium.com/@_jh3y/…
猜你喜欢
  • 2011-10-06
  • 2020-08-02
  • 1970-01-01
  • 2012-05-05
  • 2011-04-20
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多