这篇文章发布于 2012年11月16日,星期五,12:02,归类于 Web综合。 阅读 98469 次, 今日 2 次 34 条评论
by zhangxinxu from http://www.zhangxinxu.com
本文地址:http://www.zhangxinxu.com/wordpress/?p=2781
一、诉说前言
before
/after
伪元素相当于在元素内部插入两个额外的标签,其最适合也是最推荐的应用就是图形生成
。在一些精致的UI实现上,可以简化HTML代码,提高可读性和可维护性。国外这两个伪元素应用相当的普及以及兴盛,不过貌似我们这边前端er们普遍缺乏使用这两个伪元素的意识,要使用顶多也就是跟风的“清除浮动”应用。
我想,这可能受兼容性思维影响——IE6/7浏览器并不支持,还是等什么时候IE6/IE7换届下台的时候再说吧~~
虽然八尾九尾都是残体,并不影响十尾的成型。一粒老鼠屎掉进锅里,你就真让这一锅红烧肉毁了——把有翔的这部分给阿黄(中华田园犬)吃就可以了。
本文简单展示我在实际项目中,应用before
/after
伪元素时候,如何CSS命名的,HTML有哪些处理,如何对付IE6, IE7浏览器的。
二、大致处理流程
- CSS部分
类似这样子的命名:.example:before, .example before {} .example:after, .example after {}
一个有冒号,一个是空格分隔。前者IE8+及其他现代浏览器;后者为IE6-7准备的。
- HTML部分
如果before
/after
伪元素含有content
内容(不是空字符),则content内容在HTML标签上呈现(方便IE6/7下获取),例如:<div class="example" data-content="◀"></div>
CSS部分的
content
属性值应该如下:.example:before, .example before { content: attr(data-content); ... } .example:after, .example after { content: attr(data-content); ... }
- JS部分
JS是为IE6/7准备的,所做的事情很简单,网元素内部插入两个元素,标签名为”before
“或”after
“或同时。方法代码如下:var $beforeAfter = function(dom) { if (document.querySelector || !dom && dom.nodeType !== 1) return; var content = dom.getAttribute("data-content") || ''; var before = document.createElement("before") , after = document.createElement("after"); // 内部content before.innerHTML = content; after.innerHTML = content; // 前后分别插入节点 dom.insertBefore(before, dom.firstChild); dom.appendChild(after); };
于是,您想要的效果就可以实现了,例如下面的例子。
三、实际应用之含尖角的tip类提示效果
下面是效果图,IE6下以及FireFox16下的效果截图:
您可以狠狠地点击这里:before/after生成的tip类提示效果demo
IE6/7的CSS与IE8+基本上都是公用的,唯一不同就是选择器一个空格间开,一个冒号伪类,如下:
.tip:before, .tip before, .tip:after, .tip after{...}
然后,JS如下一调用即可:
$beforeAfter(document.getElementById("tip"));
OK,全部兼容,完事OK。
一般而言,after
以及before
生成的元素只能是一些不影响功能或是重要视觉的效果。因此,IE6/7下JS驱动不关紧要效果的生成是相当OK的。
赶着帮老婆带饭,抛砖引玉,就这些!
本文为原创文章,转载请注明来自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com]
本文地址:http://www.zhangxinxu.com/wordpress/?p=2781
(本篇完)
- :after伪类+content内容生成经典应用举例 (0.745)
- 伪类+js实现CSS3 media queries跨界准确判断 (0.745)
- CSS3 box-shadow兼容loading效果兼IE10+ CSS Hack介绍 (0.690)
- CSS content内容生成技术以及应用 (0.566)
- CSS3 box-shadow实现纸张的曲线投影效果 (0.566)
- 几种纯CSS(CSS3)下的纸张效果实现展示 (0.566)
- 小tip: 使用CSS(Unicode字符)让inline水平元素换行 (0.566)
- CSS counter计数器(content目录序号自动递增)详解 (0.566)
- CSS之before, after伪元素特性表现两则 (0.566)
- CSS content换行实现字符点点点loading效果 (0.566)
- 深入CSS ::first-letter伪元素及其实例等 (RANDOM - 0.255)
谢谢你,张含韵
不错,在下受教了,经常看你的博客,学到不少东西啊,太赞了.
实际用了博主的解决方案 非常感谢 顺便说一下 ie8下 如果是用的两个分号(伪元素)的写法 a::before这样是不会起作用的 而ie8又不会被document.querySelector这个检测筛选出来 所以我在用的时候就用ua单独处理了一下ie8 当然 把css里面的写法改一下也会好 这个就全看个人喜好了
before,after都得写吗。我只用了after,但是在IE6下,before也被调用了,出现元素前后都插入了同样的内容。请您回复一下,谢谢,我是小白一枚
把跟before相关的代码注释掉就行了
楼主,我想在一个页面上重复用这个效果为什么不行?
改成:$beforeAfter(document.getElementByTagName(“span”));
或者:$beforeAfter(document.getElementByClassName(“tip”));
都不行(指在IE6/7下)
上下的结构的呢,怎么处理好
这个是不是需要引入什么jQuery文件啊?我的在IE7中测试没有尖角的出现哦~
if (document.querySelector || !dom && dom.nodeType !== 1) return;
这段代码是起到什么作用呢, 能否指点一二?
@路人甲 如果是IE8+浏览器或者dom不存在或DOM非元素节点,返回。这么一看,这里的书写可能有错误。
这里的return应该是对于ie8+已经支持before和after伪类的都忽略调用吧。
我再问下下,这个querySelector函数网上说的IE8开始支持这个规范,但是我本地测试了,好像还是undefined,IE8+,应该是不包括IE8的吧,附上版本号8.0.6001
@路人甲 支持的。可参见:http://caniuse.com/#search=querySelector
对象不支持“appendChild”属性或方法
对象不支持“getAttribute”属性或方法
ie7下测试
font-family: xms;中的xms是字体?不明白为什么这样写?
@Gil 自定义字体,参考CSS3 font-face.
还是图片好点
我按照此方法设置了,肿么没见效
很有感觉的博客,有学到,以后常关注。。。
你好,在chrome和firefox中展现的◀的font-face字体效果都是良好的,但在ie8中未体现效果,仍是默认的字体哦。
@nick 你好,我在IE8下查看下了我的demo,貌似显示效果挺正常的~~
这个符号在IE和chrome中确实显示有些差别,同样的字体和字号(我测的宋体和微软雅黑)chrome要略大一些。
如果操作系统是英文,data-content=”◀” 这种会出现乱码吗?
@lynzz 使用的是@font-face自定义字体,不识别字符也没关系的,即不会乱码,除非浏览器不支持@font-face,同时字符不认识。◀字符的支持性算是不错的,因此,乱码出现几乎是很小概率事件。
谢谢楼主的文章,学习了
报个bug:demo 地址打开404,盼修复
@lovefishs 感谢提醒。起了个怪了,之前还好好的,还有图片怎么也不见了??
Hi,我向你公开的zhangxinxu@zhangxinxu.com这个邮箱发了封邮件,不知是否收到,盼复。
楼主,图片跟效果地址失效了。
before 和 after 其实是伪元素,不是伪类,高手真多啊
请问select垂直居中的文章是哪一篇
思路很nice,觉得如果是静态效果的话,还是html中加个span标签简单。
before 和 after 其实是伪元素,不是伪类
这两个概念好容易搞混。。于是最新的规范里也对伪元素用了两个冒号做区分
http://www.w3.org/TR/css3-selectors/#gen-content
@mescoda 学习了!
博主好喜欢张含韵- –
思路有意思啊,xx 一直在思路上有突破 赞!