薄荷新首页上周五内测,花哥反馈在 MacBook Safari 浏览器下 鼠标移动到第一个商品的时候后面几个商品的文字会加粗。这是什么鬼???

待我回到家打开笔记本,鼠标蹭蹭蹭的发现问题远不止如此:

  1. Banner 以下的文字都会间歇性闪(chou)烁(feng)。
  2. 鼠标移动到某个产品图上,在该元素以后区域的文字也会闪烁,而之前的元素都没问题。

通过现象可以观察到文字闪烁基本和动画有关,Banner 轮播图用到了 transform: translate3d,产品展示图缩放效果用到了transform: scale

那么除了动画以外影响字体渲染的CSS属性还有这些:

  1. font-style //字体样式
  2. font-variant //字体大小写
  3. font-weight //字体重量值
  4. font-size //字体大小
  5. font-family //字体型号
  6. font-smoothing //字体平滑属性

因为目前新版用到 BootStrap3,先确认下是自己的代码引发的问题还是 BootStrap3,带着疑问去了躺 BootStrap3 官网,找到轮播图的例子:

http://v3.bootcss.com/examples/carousel/

如果你在Mac Safari 打开上面链接会发现轮播图下方的文字都会随着动画而闪烁。

接下来分析是什么原因导致了这个bug的出现,通过对比分析发现在 BootStrap3 中 container 和 row 元素都用到了 position:relative 属性,而这两个元素都是嵌套使用,那么通过最简代码来复现该问题:

html

  1. <div class="box">
  2. <p>CSS Animation triggers text rendering change in Safari</p>
  3. </div>
  4. <div class="animation"></div>
  5. <div class="box">
  6. <p>CSS Animation triggers text rendering change in Safari</p>
  7. </div>

css

  1. <style scoped="scoped">
  2. .animation {
  3. width: 100px;
  4. height: 100px;
  5. background-color: gray;
  6. -webkit-transition:all 0.35s ease-in-out;
  7. }
  8. .animation:hover {
  9. -webkit-transform: rotate(360deg);
  10. }
  11. .box, .box > p {
  12. font-size: 20px;
  13. position: relative;
  14. }
  15. </style>

上面的例子中,当鼠标滑动到 animation 元素上,后面的 box 就会出现文字闪烁,而之前的元素没有问题。

触发 transform +transition 属性的元素原本只会影响自身的字体渲染,从动画开始到结束,分别经历 Subpixel rendering -> Grayscale rendering -> Subpixel rendering,所以会出现闪烁现象,我们一般通过对自身设置 -webkit-backface-visibility: hidden 来解决。但是在Mac Safari 下还会影响其后面嵌套两层以上CSS position取值为 relative、absolute 元素字体的渲染。

解决方案

  1. // W3C官方已经废弃该属性
  2. -webkit-font-smoothing: subpixel-antialiased

相关问题的回答

相关问题的延伸阅读

CSS Animation triggers text rendering change in Safari的更多相关文章

  1. 利用 CSS animation 和 CSS sprite 制作动画

    CSS3 大大强化了制作动画的能力,但是如果要做出图案比较复杂的动画,选择 GIF 依然是一个不错的选择.今天给大家介绍一个使用 CSS animation 配合雪碧图(CSS sprite)来制作动 ...

  2. CSS animation & CSS animation 101

    CSS animation 101 如何为 Web 添加动画效果. https://github.com/cssanimation/css-animation-101 https://github.c ...

  3. OpenCascade Chinese Text Rendering

    OpenCascade Chinese Text Rendering eryar@163.com Abstract. OpenCascade uses advanced text rendering ...

  4. Using native GDI for text rendering in C#

    Using native GDI for text rendering in C# Aug12by Arthur To complete my previous post on text render ...

  5. CSS魔法堂:更丰富的前端动效by CSS Animation

    前言  在<CSS魔法堂:Transition就这么好玩>中我们了解到对于简单的补间动画,我们可以通过transition实现.那到底多简单的动画适合用transtion来实现呢?答案就是 ...

  6. No.6 - 利用 CSS animation 制作一个炫酷的 Slider

    *{ margin:; padding:; } div{ margin: auto; width: 800px; height: 681px; position: relative; overflow ...

  7. [CSS3] Make a One-time CSS Animation that Does Not Revert to its Original Style

    We'll add animation to patio11bot using CSS keyframes. When defining a CSS animation, you can add it ...

  8. 百度前端技术学院2018笔记 之 利用 CSS animation 制作一个炫酷的 Slider

    前言 题目地址 利用 CSS animation 制作一个炫酷的 Slider 思路整理 首先页面包含三种东西 一个是type为radio的input其实就是单选框 二是每个单选框对应的label 三 ...

  9. css animation @keyframes 动画

    需求:语音播放动态效果 方案:使用如下图片,利用 css animation @keyframes  做动画 html <span class="horn" :class=& ...

随机推荐

  1. mac上 自己安装的python 和 自带python 的可执行文件位置

  2. [html]CSS 小贴士

    CSS 中用四个伪类来定义链接的样式,分别是:a:link.a:visited.a:hover 和 a : active,例如: a:link{font-weight : bold ;text-dec ...

  3. 五.jQuery源码解析之jQuery.extend(),jQuery.fn.extend()

    给jQuery做过扩展或者制作过jQuery插件的人这两个方法东西可能不陌生. jQuery.extend([deep],target,object1,,object2...[objectN]) jQ ...

  4. python3.6 实现AES加密的示例(pyCryptodome)

    当然我也是通过官方推荐,使用下面命令去下载安装的,pip就是好用...    pip install pycryptodome 撸码开始 废话不多说,直接上demo # from Crypto.Has ...

  5. 新手之:SpringBoot ——Reids主从哨兵整合(CentOS7)

    一.Redis主从搭建(一台服务器模拟多个端口) 结构图:) 1.确保安装了Redis,我装在了/opt/redis目录下.可通过"whereis redis-cli"命令查看是否 ...

  6. CB XE7 C11 64位编译器 成员变量初始化

    看到了C++11,看到了XE7的64位,想实现下面方便的类成员初始化,失望. 一.64位用法 clang3,64位编译器,不支持中文变量名,编写代码提示没有32位快,风格简单不用写单独的赋值语句函数, ...

  7. maven常用命令集合

    作者:ydlmlh 原文:http://ydlmlh.iteye.com/blog/2158973 抽了点时间,整理了一些maven常用命令参数,以便参考:参考了maven官网和网上其他一些maven ...

  8. $(window).scrollTop() 获取当前的鼠标位置 offset.left()指定标签在html中的坐标 offset.top() 指定标签在html中的坐标position() 指定标签相对父(relative)标签的坐标

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. UGUI 锚点设置为四方扩充模式然后设置局部坐标为0将出现什么问题

    UGUI 锚点设置为四方扩充模式然后设置局部坐标为0将出现什么问题? 情形:按钮A挂在主画布上.四方扩充模式.A的中心和画面中心不重合. 这时候用代码设置A.localPosition = new V ...

  10. centos禁止 You have new mail in /var/spool/mail/root提示

    在/etc/profile 增加unset MAILCHECK