IE8中伪元素动态作用样式不重绘bug记录
前阵子对公司框架的前端优化中,使用了字体图标(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记录的更多相关文章
- HTML和CSS设置动态导航以及CSS中伪元素的简单说明
HTML页面代码: <!DOCTYPE html> <html> <head> <title>Test</title> <meta c ...
- ::before和:after中的的双冒号和单冒号有什么区别及这两个伪元素的作用
::before和:after中的的双冒号和单冒号有什么区别及这两个伪元素的作用 单冒号(:)用于CSS3伪类,双冒号(::)用于CSS3伪元素(伪元素由双冒号和伪元素名称组成),为了兼容已有的伪元素 ...
- datatable动态列处理,重绘表格(敲黑板,划重点!!!我肝了一天半才彻底弄懂这个东西,TAT)
datatable动态列处理,重绘表格 前言:至于动态列的绘画,我前面博客已经写过了,就是动态列的配置问题,不懂的去我博客看下,今天要写的呢,就是你已经写了一个动态列在datatable,现在你想重新 ...
- css中伪元素before或after中content的特殊用法attr【转】
[原文]https://segmentfault.com/a/1190000002750033 CSS中主要的伪元素有四个:before/after/first-letter/first-line,在 ...
- css中伪元素before或after中content的特殊用法attr
html代码如下: <div class="haorooms"> <span data-haorooms="haorooms鼠标效果tips-纯css& ...
- Struts2的配置文件中, <package>的作用,<action><result>重名?
问:Struts2的配置文件中, <package>的作用是什么? 答:防止action重名啊,例如前台和后台,总会有很多地方起名重复的! 问:可是访问的时候,不也是访问action吗,能 ...
- 拿到内存中dom元素的最后样式进行修改obj下的currentStyle方法
在用dom操作在对页面中的<style></style>里的样式进行操作时,发现时无效的,我觉得是因为页面DOM解析时此标签的样式内容才会被读到内存中,因此JS操作时取不到此标 ...
- 演示-JQuery中伪元素和伪类选择器
HTML代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...
- JavaScript中让元素动态发射指定的事件
var ev = document.createEvent('HTMLEvents'); //动态创建HTML事件 ev.initEvent('abort', false, true); //HTML ...
随机推荐
- Python 面向对象编程——继承和多态
<基本定义> 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超 ...
- Tkinter制作简单的python编辑器
想要制作简单的python脚本编辑器,其中文字输入代码部分使用Tkinter中的Text控件即可实现. 但是问题是,如何实现高亮呢?参考python自带的编辑器:python27/vidle文件夹中的 ...
- 学习Git操作的好资源
网上资源很多,极大的方便了我们学习新东西. 今天找到了几个简单明了的Git教程,用以备录共享. Learn Git Branching http://pcottle.github.io/learnG ...
- 在线HTTP速度测试(响应时间测试)及浏览器兼容测试
一.前言 网站的响应时间,是判断一个网站是否是好网站的重要的因素之一.百度首页的响应时间在全国各个省份小于10ms.这个响应时间远远好于竞争对手.根据美丽说的技术负责人分析,美丽说访问速度提升10%, ...
- 【洛谷】4317:花神的数论题【数位DP】
P4317 花神的数论题 题目背景 众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦. 题目描述 话说花神这天又来讲课了.课后照例有超级难的神题啦…… 我 ...
- 2013-8-6 10:56:07 JAVA_WEB:员工号自动生成源代码
create table user_info_temp ( usId varchar2(20), usNo varchar2(20), usName varchar ...
- Spring Boot整合RabbitMQ详细教程
原文:https://blog.csdn.net/qq_38455201/article/details/80308771 1.首先我们简单了解一下消息中间件的应用场景 异步处理 场景说明:用户注册后 ...
- xcode找不到真机设备 - 转
先确认证书是否正确 再确认Bundle Indentifier 是否与证书匹配 再确认Deployment Target 为:sdk从6.0改为4.3 如果xcode还无法识别iphone, Xcod ...
- android 4.4删除短信
android 4.4之后非默认的短信应用已经没有办法删除短信了.像以前那样用如下方法是不会没法删除短信的(即使在xml中配置了短信的读写权限),同时也不会有报错或其他提示. public void ...
- .NET:CLR via C# The Interlocked Anything Pattern
Many people look at the Interlocked methods and wonder why Microsoft doesn't create a richer set of ...