在 Firefox 中可怕地变换图像“振动”。为啥?

Posted

技术标签:

【中文标题】在 Firefox 中可怕地变换图像“振动”。为啥?【英文标题】:Transforming image "vibrating" horribly in Firefox. Why?在 Firefox 中可怕地变换图像“振动”。为什么? 【发布时间】:2016-04-10 00:47:05 【问题描述】:

这与我之前提出的一个问题有关,但直到现在我才真正找到问题的根源。

我想要的是一个扩展为矩形的圆。它还可以从 0.9 扩展到 1。

我拥有的是这个http://codepen.io/StuffieStephie/full/zrZwEQ/ 我已经放慢了动画的速度,所以“振动”更清晰。

    #seasonOne .test 
    padding:0;
        background-color: #fff;
    background: #fff url('http://i296.photobucket.com/albums/mm174/StuffieStephie/S1ChibiPreview2_zpsswyamase.png') 50% 50% no-repeat;
width: 200px;
height: 200px;
    border-radius: 50%;
    display: block;
        margin: 0 auto;
    -webkit-transition: 2s;
            -moz-transition: 2s;
            transition: 2s;
    -webkit-transform: scale(.9);
        -ms-transform: scale(.9);
        -moz-transform: scale(.9);
            transform: scale(.9);
    font-size: 0;
    -webkit-transform-origin: 50% 50%;
    -moz-transform-origin: 50% 50%;
        -ms-transform-origin: 50% 50%;
            transform-origin: 50% 50%;



#seasonOne:hover .test 
-webkit-transform: scale(1);
    -ms-transform: scale(1);
     -moz-transform: scale(1);
        transform: scale(1);
    width: 250px;
    height: 200px;

    border-radius: 0;

为什么它会像这样晃动并且只在 Firefox 中?添加供应商前缀没有帮助...

【问题讨论】:

好的,首先AAAAAAAAAAAAAAAAAAAAAAAAA。这样一来,它似乎与 Firefox 如何处理重新调整边距有关,因为删除图像左右边距上的自动显着降低了振动。因为你有一个固定的宽度,你可以手动更正边距,而不是需要增长的右边距(即,使图像 div position:relative 并通过left:__px 将其居中。给我一点时间.. . 哦,供应商前缀也无济于事,如果你把它们放在它们是前缀的规则之上 - 前缀版本被标准版本覆盖,无论是浏览器内部还是内部如果浏览器知道标准版本是什么,则使用 CSS。 好吧,所以我的想法没有奏效。我可以告诉你这个问题肯定与宽度缩放有关。禁用 that 并且所有的口吃都消失了。我的 Chrome 副本也会卡顿,但程度不同——这让我认为 Firefox 的问题在于它实际上是在强制每一帧,而不是允许一些跳过。我会再玩 10 到 15 分钟,如果我发现了什么,请告诉你。很好的发现。 @abluejelly Eeey,感谢您对此进行调查!很遗憾,它是宽度缩放...从圆形预览到全宽是效果的全部吸引力 D:另外,我认为删除比例也有帮助,但即使使用它,它似乎仍然有点晃动关闭。 @abluejelly 如果无法解决,我会处理它。动画通常是 0.3 秒,当它那么快时它并不那么明显。但是神圣的鳄梨酱,她像一只年长的吉娃娃一样摇摇晃晃,速度较慢 D:这让我疯了一整天!单击阅读更多内容后,我仍然必须处理所有 AJAX 内容...诅咒我的强迫症:/ 【参考方案1】:

首先,原因几乎是背景图像。所有浏览器在尝试在两个方向上同时设置大小和位置的动画时都会有点卡顿,只是 Firefox 丢帧的数量最少(射击?)。如果不知道这正是您正在制作动画的内容,就很难流畅地制作动画(因为像 GSAP 这样的 js 库和它们一样出色)。因此,您想要做的是 a) 一次只做一个或 b) 通过仅在图像本身上设置动画大小来“伪造”它,然后按下动画的其余部分放在图像周围的框架上。

因为图片居中,我们完全可以做B:

.season img 
  float: left;
  max-width: 500px;
  width: 100%;
  animation-delay:0.1s; 


.season p.oneP 
  animation-delay:0.5s; 


.season p.twoP 
  animation-delay:0.75s; 

.season p.threeP 
  animation-delay:1s; 

.season h2 
  border-radius: 10px 10px 0 0;
  background-color: #eee;
  padding: 3px;
  margin-top: 0;
  overflow-x: hidden;

.season .smallText 
  animation-delay:0.2s; 
  overflow: hidden;

.season h6, .season .arts, .season h3 
  text-align: center !important;
  animation-delay: 1.8s;

.next, .prev 
  float: right;
  box-sizing: border-box;
  width: 49%;
  animation-delay: 3s;
  border: 3px solid #EEE;
  border-radius: 15px;

.prev 
  float: left;

.prev img.preview, .next img.preview 
  float: left;

.previews 
  display: -webkit-flex; /* Safari */
  -webkit-justify-content: space-around; /* Safari 6.1+ */
  display: flex;
  justify-content: space-around;
  flex-wrap: wrap;

.card
  color: #ff2772;
  border-radius: 15px;
  margin: 3px 1px;
  background-color: #2d3034;
  box-sizing: border-box;
  width: 300px;
  min-height: 400px;
  display: inline-block;
  transition: .25s;
  cursor:pointer;
  border: 1px solid #ff2772;
  text-align: center;

.floatRight 
  float: right;
  margin-right: 10px;


#page-content .card h6 
  padding: 10px 2px;
  background: none;
  border-radius: 10px 10px 0 0;
  transition: .3s;

  border-bottom: 1px solid #fff;



#page-content .card .smallText 
  transition: .3s;
  background: none;
  border-bottom: 1px solid #fff;
  border-top: 1px solid #fff;


#page-content .card:hover .smallText, #page-content .card:hover h6
  background-color: #ff2772;
  color: #2d3034;

.card:hover
  background: #fff;


/*
.card img 
width: 200px;
text-align: center;
border-radius: 100%;
background: #fff;
margin: 0 auto;
display: block;
transform: scale(.9);
transition: all .2s ease-in-out;

/*.card .test 
transform: scale(.9);
width: 200px;
height: 200px;
overflow-x: hidden;
display: block;
margin: 0 auto;

*/




.imgwrapper 
  position:relative;
  width:100%;
  height:200px;
  margin:0;
  padding:0;
  overflow:hidden;

#seasonOne .test 
  padding:0;
  background-color:rgba(0,0,0,0);
  width: 200px;
  height: 200px;
  border-radius: 50%;
  border-style:solid;
  border-color: #2d3034;
  border-width:80px;
  display: block;
  transition:all 2s, border-color 0.25s;
  transform: scale(.9);
  font-size: 0;  
  position:absolute;
  z-index: 1;
  top:-80px;
  left:-30px;

#seasonOne .img
  background: #fff url('http://i296.photobucket.com/albums/mm174/StuffieStephie/S1ChibiPreview2_zpsswyamase.png') 50% 50% no-repeat;
  /*Was gonna make that a dataURI, but that's 112KB. Heh.*/
  width:250px;
  height:200px;
  transition: 2s;
  transform: scale(.9);
  position:absolute;
  left:25px;


#seasonOne:hover .test 
  width: 250px;
  height: 200px;
  transform: scale(1);
  border-radius: 0;
  border-color:#fff;
  left:-55px;

#seasonOne:hover .img
  transform: scale(1);




.card:hover img
  transform: scale(1);
  border-radius: 0;



hr 
  margin: 0;
  padding: 0;

img.preview 
  transform: scale(.9);
  width: 200px;
  display: inline;
  float: none;
  border-radius: 10px;
  transition: all .2s ease-in-out;
  box-shadow: 0 1px 1px rgba(0,0,0,0.3);
  border-radius: 10px;
  line-height: 0;
  font-size: 0;

.art img.preview:nth-child(1) 
  animation-delay: 2s;

.art img.preview:nth-child(2) 
  animation-delay: 2.25s;


.logo
  clear:left;
  padding-bottom: 10px;

img.preview:hover 
  transform: scale(1);
  box-shadow: 0 15px 15px rgba(0,0,0,0.3);
  border-radius: 0;

.season img.no-float 
  float: none;

@media screen and (max-width: 1200px) 
  .season h6 
    clear: both;
  

@media screen and (max-width: 800px) 	
  .prev img.preview, .next img.preview 
    float: left;
  

  .season p 
    clear: both;
  
  .prev p, .next p 
    clear: none;
  
  .season img
    float: none;
    margin: 0 auto;
    text-align: center;
  

@media screen and (max-width: 750px) 	
  .card 
    /*width: 49%;/*For this part to work, you'll have to do up more rules
     *, otherwise you'll get an off-center image.*/
    box-sizing: border-box;
  

@media screen and (max-width: 600px) 

  .prev, .next
    width: 100%;
    float: none;
    margin: 5px auto;
  
  .prev img.preview, .next img.preview 
  

@media screen and (max-width: 399px) 
  .card
    width: 100%;
  
<!doctype html>
<html>
    <head>
        <!-- Meta -->
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <meta name="viewport" content="initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,width=device-width,user-scalable=no" />
        <!-- Styles -->
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.4.0/css/font-awesome.css">
        <link rel="stylesheet" href="http://cdn.jsdelivr.net/animatecss/2.1.0/animate.min.css">
        <!-- Magnific Popup core CSS file -->
        <link href='http://fonts.googleapis.com/css?family=Quicksand:700|Montserrat:700|Open+Sans|Sniglet:400,800' rel='stylesheet' type='text/css'>
        <link rel="stylesheet" href="http://kamicon.net/assets/styles/mainStyles.css">
        <link rel="stylesheet" 
        <!--[if lt IE 9]><script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
    </head>
    <body>
        <div id="site-canvas">
            <div id="page-content">
                <section>
                    <h1>Help Me!</h1>
                    <p>The art shakes horribly when you hover over it in Firefox Why!?</p>
                    <div id="area" class="holder"></div>
                    <div class="previews">
                        <div id="seasonOne" class="card seasonOne">
                            <h6 class="center">Season 1 (2009) - The Pilot</h6>
                            <div class="imgwrapper">
                                <div class="img"></div>
                                <div class="test"></div>
                                <div class="wrapper2"></div>
                            </div>
                            <p class="animated smallText fadeInRight oneP">Ut cursus purus in lacinia tincidunt. Quisque lorem odio, posuere ut aliquam vel, fringilla at enim. Duis ligula lacus, viverra et sapien rhoncus, commodo euismod ipsum.</p>
                            <a href="#area" class="button">Read More</a>
                        </div>
                    </div>
                    <hr/>
                </section>
            </div>
            <!-- #page-content -->
        </div>
        <!-- #site-canvas -->
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
    </body>
</html>

或者codepen。

我将框架(.test Still)和图像(.img)分开,它们都包含在一个包装器(.imgwrapper)中。

包装器处理页面布局中的足迹。

框架的边框颜色现在特别地与卡片的背景一起动画,并且定位(和border-width'd)相当hackish....看看我是怎么做到的,你'会明白我的意思。呵呵。

图片现在有固定的宽度和位置,只有动画比例(因此,不再卡顿)。

我 90% 确定有更好的方法来做到这一点,但因为我必须对图像进行绝对定位(所以它的位置不会在框架发生时抽搐)我无法保留 image-div作为 frame-div 的子级。

另外,我很惊讶生成一个内角为圆角的正方形会很尴尬。我基本上只是做了一个很粗的圆圈,然后说“只显示它的这个正方形”。

编辑注意:@media 宽度低于750px 的调整大小导致偏离中心。禁用它“修复”它。把固定代码移到这里才注意到,呵呵。

【讨论】:

你是冠军!我真的很感谢你坚持下去。而且我承认我不是空 div 的粉丝(理想情况下,我会在其中有一个 img 标签,而不是通过 css 设置源,但是嗯)。这很hackish,但结果很好,而且看起来很可爱,这就是我想要的。非常感谢! @StephanieQ 没有问题。我的自尊心受到打击,无法放下,直到我胜利出现哈哈。你会惊讶于这让我经常遇到奇怪的错误>.>

以上是关于在 Firefox 中可怕地变换图像“振动”。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

Firefox 变换比例图像错误。使用悬停变换过渡时,图像会闪烁自身的一个小版本

Firefox中带有缩放变换的CSS过渡效果后的图像移动/跳跃

为啥 DCT 变换在视频/图像压缩中优于其他变换

CSS 动画比例变换在 Firefox 中开始模糊

为啥原图像减去拉普拉斯变换的图像是锐化

为啥 event.clientX 在 firefox 中为 dragend 事件错误地显示为 0?