前阵子对公司框架的前端优化中,使用了字体图标(iconfont)来做模块的图标集,供用户进行配置选择。

字体图标的有非常好的灵活性和复用性,可以像处理文字一样通过font-size进行大小设置、通过color来直接配色,如果系统整体设计是比较扁平化的,浏览器兼容要求IE8+,并且在系统中需要一套图标集的话,选择字体图标来替代传统的png图标应该说是一个非常有性价比的方案。

具体字体图标的制作和使用,有一个非常棒的服务站点:www.iconfont.cn,在这里感谢阿里妈妈前端团队

上面大致介绍了下iconfont的优点,下面开始进入正题。

iconfont是不错,可惜实际项目中,对IE8要有较好的支持。

一般我们通过css的:before:after伪类来实现iconfont的使用,如:

还好,IE8是支持:before:after伪类的,本以为可以无忧无虑的直接使用了,结果在测试过程中发现了一个坑,拿一个具体案例来说明。

有个菜单项,用a标签来表示:

大致效果如下:

当用户点击该菜单项时,需要高亮该菜单项,在a标签上追加一个状态样式.active

通过以下css rule来达到目的:

预期的(或者正常的)效果如下:

但是在坑爹的IE8中,实际的效果是这样的:

在IE8中通过class来改变字体图标的视觉状态(这里是color)并没有起到作用,引用图标样式的元素(此例中是i.item-icon.icon-addcircle)并没有进行重绘(redraw)来更新状态。

明确问题后去Google了一下,发现IE8确实有这么一个bug。

使用:before:after伪类的元素,一般与content属性配合使用,在IE8中,通过样式来动态改变content伪元素的视觉表现,不会触发伪元素的重绘(redraw)行为,除非content属性的值(内容)发生变化,从而强制浏览器对其进行重绘。

那么解决思路就是强制元素重绘了,根据上述原理代码如下:

其中.content-empty定义如下:

然后每次在伪类元素上作用完样式后,使用Util.redrawPseudoEl(el)即可。

IE8中伪元素动态作用样式不重绘bug记录的更多相关文章

  1. HTML和CSS设置动态导航以及CSS中伪元素的简单说明

    HTML页面代码: <!DOCTYPE html> <html> <head> <title>Test</title> <meta c ...

  2. ::before和:after中的的双冒号和单冒号有什么区别及这两个伪元素的作用

    ::before和:after中的的双冒号和单冒号有什么区别及这两个伪元素的作用 单冒号(:)用于CSS3伪类,双冒号(::)用于CSS3伪元素(伪元素由双冒号和伪元素名称组成),为了兼容已有的伪元素 ...

  3. datatable动态列处理,重绘表格(敲黑板,划重点!!!我肝了一天半才彻底弄懂这个东西,TAT)

    datatable动态列处理,重绘表格 前言:至于动态列的绘画,我前面博客已经写过了,就是动态列的配置问题,不懂的去我博客看下,今天要写的呢,就是你已经写了一个动态列在datatable,现在你想重新 ...

  4. css中伪元素before或after中content的特殊用法attr【转】

    [原文]https://segmentfault.com/a/1190000002750033 CSS中主要的伪元素有四个:before/after/first-letter/first-line,在 ...

  5. css中伪元素before或after中content的特殊用法attr

    html代码如下: <div class="haorooms"> <span data-haorooms="haorooms鼠标效果tips-纯css& ...

  6. Struts2的配置文件中, <package>的作用,<action><result>重名?

    问:Struts2的配置文件中, <package>的作用是什么? 答:防止action重名啊,例如前台和后台,总会有很多地方起名重复的! 问:可是访问的时候,不也是访问action吗,能 ...

  7. 拿到内存中dom元素的最后样式进行修改obj下的currentStyle方法

    在用dom操作在对页面中的<style></style>里的样式进行操作时,发现时无效的,我觉得是因为页面DOM解析时此标签的样式内容才会被读到内存中,因此JS操作时取不到此标 ...

  8. 演示-JQuery中伪元素和伪类选择器

    HTML代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

  9. JavaScript中让元素动态发射指定的事件

    var ev = document.createEvent('HTMLEvents'); //动态创建HTML事件 ev.initEvent('abort', false, true); //HTML ...

随机推荐

  1. android 消息机制,handler机制,messageQueue,looper

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha handler  就是 处理器 .  用来处理消息, 发送消息. handler   就 ...

  2. Spring之Spring环境搭建

    Spring之Spring环境搭建 一.什么是Spring? Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spr ...

  3. bzoj 3653

    每个点维护一颗以深度为下标,size-1为值的线段树,保存整颗子树的信息,这样就可以查询了,但是如果为每个节点都建立这么一颗树,显然会MLE,所以考虑在DFS序上建立主席树,然后每个节点原来对应的线段 ...

  4. jmeter用BeanShell调用jar包对HTTP请求中的参数进行MD5加密

    前提: eclipse.JDK.Jmeter 说明: 本文分为两部分进行配置说明 第一部分:编写JavaMD5加密脚本 第二部分:使用Jmeter的BeanShell进行验证 ************ ...

  5. bootstrap字体图标不正常显示的原因

    本地引入bootstrap.css文件,使用https://v3.bootcss.com/components/站点 字体图标 时不能正常显示,换成 bootstrap 官网的 cdn 链接却能正常显 ...

  6. Android音效SoundPool问题:soundpool 1 not retry

    Android音效SoundPool问题:soundpool 1 not retry 今天开发中要用到SoundPool,遇到soundpool 1 not retry无法播放声音,MediaPlay ...

  7. Android学习网站(1)

    收集了一些比较好的Android学习网站,希望对大家有所帮助: 1.http://developer.android.com/ Android官方网站,可惜被屏蔽了,需要使用FQ软件 2.http:/ ...

  8. C#中的IDisposable模式

    当谈到垃圾回收,在C#中,托管资源的垃圾回收是通过CLR的Garbage Collection来实现的,Garbage Collection会调用堆栈上对象的析构函数完成对象的释放工作:而对于一些非托 ...

  9. 页面中checkbox返回的是一个数组,如何对数组进行操作

    1. 仅仅利用javascript进行操作: //html代码如下: <form action="#" method="POST" onsubmit=&q ...

  10. SpringMVC @RequestBody 接收Json数组对象

    @RequestMapping(value="/signIn",method=RequestMethod.POST) public int saveUser(@RequestBod ...