:after和:before是css3中的伪类元素。用法是像元素的前或者后插入元素。以after为例:

li:after{
content: '';
color: #ff0000;
}

意思是向li元素后插入一个元素,content里面是内容,下面接属性,和css写法一样。但是在实际当中我们肯定会说,直接在HTML中添加一个标签不就好了吗?

是的,这是最简单的方法。但是如果我们要添加的东西只是为了页面的优化的,而不存在实际的作用。还在里面加吗?比如我们常常接触到的清除浮动的作用,举个栗子:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin:0;
padding:0;
}
ul{
background-color: aquamarine;
}
li{
list-style: none;
width: 100px;
height:20px;
border:1px solid #ff0000;
float: left;
}
</style>
</head>
<body> <ul id="ul">
<li>1</li>
<li>2</li>
<li>3</li>
<li class="li">4</li>
</ul>
<div>下面的内容</div>
<script>
</script>
</body>
</html>

效果如下:

我们的实际需求是
下面的DIV在另一行显示。这该怎么办呢。别急,有办法:overflow:hidden;

ul{
background-color: aquamarine;
overflow: hidden;
}

显示如下:

但是如果我们的li标签有下拉菜单呢。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin:0;
padding:0;
}
ul{
background-color: aquamarine;
overflow: hidden;
}
li{
list-style: none;
width: 100px;
height:20px;
border:1px solid #ff0000;
float: left;
position: relative;
}
dl{
position: absolute;
top:0;
left:0;
width: 100px;
}
dd,dt{
width: 100px;
}
</style>
</head>
<body> <ul id="ul">
<li>1
<dl>
<dd>我是下拉</dd>
<dt>2</dt>
<dt>2</dt>
<dt>2</dt>
</dl>
</li>
<li>2</li>
<li>3</li>
<li class="li">4</li>
</ul>
<div>下面的内容</div>
<script>
</script>
</body>
</html>

完全被遮住了,有没有?那这个overflow:hidden;的方法肯定不可取

那么怎么办呢。清除浮动。对!

clear:both;清除浮动对下面元素的影响。这里可以用到:after了。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin:0;
padding:0;
}
ul{
background-color: aquamarine;
/*overflow: hidden;*/
}
li{
list-style: none;
width: 100px;
height:20px;
border:1px solid #ff0000;
float: left;
position: relative;
}
ul:after{
content: '';
height:0;
display: block;
clear: both;
}
dl{
position: absolute;
top:0;
left:0;
width: 100px;
}
dd,dt{
width: 100px;
}
</style>
</head>
<body> <ul id="ul">
<li>1
<dl>
<dd>我是下拉</dd>
<dt>2</dt>
<dt>2</dt>
<dt>2</dt>
</dl>
</li>
<li>2</li>
<li>3</li>
<li class="li">4</li>
</ul>
<div>下面的内容</div>
<script>
</script>
</body>
</html>

如图:

OK了吗?还没呢!经测试在ie6/7完全无效。。。万恶之源。。。。。ie6/7不支持:after等伪类元素。

但是世上无难事我们可以用js来解决。(搜索到的。。)

动态的插入dom就可以了。

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);
};
$beforeAfter(document.getElementById("ul"));

具体代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin:0;
padding:0;
}
ul{
background-color: aquamarine;
}
li{
list-style: none;
width: 100px;
height:20px;
border:1px solid #ff0000;
float: left;
}
ul:after,ul after{ /*注意看这里*/
content: attr(data-content);
clear: both;
height:0;
display: block;
}
</style>
</head>
<body> <ul id="ul">
<li>1</li>
<li>2</li>
<li>3</li>
<li class="li">4</li>
</ul>
<div>下面的内容</div>
<script>
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);
};
$beforeAfter(document.getElementById("ul"));
</script>
</body>
</html>

测试完毕,完全有效。。

伪类:after,:before的用法的更多相关文章

  1. CSS3 伪类选择器 nth-child() 的用法

    伪类选择器 nth-child() 在IE6-8和FF3.0-浏览器不支持,CSS3中nth-of-type(n)(比如nth-of-type(1))这个特殊的类选择符可以样式更加个性的标题和段落等, ...

  2. CSS :hover伪类选择定义和用法

    伪类选择符E:hover的定义和用法: 设置元素在其鼠标悬停时的样式.E元素可以通过其他选择器进行选择,比如使用类选择符.id选择符.类型选择符等等.特别说明:IE6并非不支持此选择符,但能够支持a元 ...

  3. CSS中伪类及伪元素用法详解

    CSS中伪类及伪元素用法详解   伪类的分类及作用: 注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的 ...

  4. CSS 属性 :before && :after的用法,伪类和伪元素的区别

    一::before && :after的用法 :before 如同对伪元素的名称一样,:before 是用来给指定的元素的内容前面插入新的内容.举例说明: .before:before ...

  5. CSS伪类对象before和after的用法

    一直感觉这两个伪类对象不是很重要,并且IE对它两兄弟并不支持,所以也没有怎么静下心来研究,只有在清楚浮动clearfix的时候会用到哈,其他都很 少用!不过最近在研究css3的时候觉得它两个的搭配不仅 ...

  6. 关于css伪类:hover的用法

    关于伪类:hover大家都用过,也比较熟悉.今天介绍一种新的用法(不是我发现的,但是以前一直没这么用过).在Chrome浏览器下,当a标签使用display:black;时a:hover的属性浏览器就 ...

  7. css伪类及伪元素用法

    注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的读者可以自己尝试: :active  大致效果为用鼠标 ...

  8. CSS之 :before && :after的用法,伪类和伪元素的区别

    一::before && :after的用法 :before 如同对伪元素的名称一样,:before 是用来给指定的元素的内容前面插入新的内容.举例说明: .before:before ...

  9. css伪类元素:after 的多功能用法——任意大小的底边框

    需求用法出现的背景: 由于项目UI的优化,项目中所有tab导航选中的状态都是统一样式书写的,之前都是用的border-bottom,新的需求如果用以前的本办法就是定位一个选中边框在底部,但是涉及的模板 ...

随机推荐

  1. xshell 快捷键总结

    ##快捷键 linux tab == 命令补全,路径补全.如果tab不到,就代表对于当前用户环境系统找不到这个目录或者路径,有可能有,但是没有放在PATH中 ctrl + a == a:26个字母的第 ...

  2. sklearn笔记:决策树

    概述 sklearn中决策树的类都在 tree 这个模块下.这个模块总共包含五个类: tree.DecisionTreeClassifier:分类树 tree.DecisionTreeRegresso ...

  3. 【知识学习】PHP实现批量替换字典后缀

    <?php //要打开字典的物理路径 $filename = 'E:\Local Test\WWW\password.txt'; $handle = fopen($filename,'r') o ...

  4. ubuntu 允许root用户登录到ssh

    ubuntu的系统太太太麻烦了,我喜欢centos,但是还是要用ubuntu做东西,讨厌,装完系统以后,因为他不让你用root,我新建了一个wqz的用户名. 1.首先更新root的密码 sudo pa ...

  5. hadoop集群启动报错: java.io.IOException: Incompatible clusterIDs

    java.io.IOException: Incompatible clusterIDs in /export/hadoop-2.7.5/hadoopDatas/datanodeDatas2: nam ...

  6. 转发-[原创]ASR1K 在Rommon导入IOS-XE启动

    在相对较老的设备平台可以通过在rommon下使用以下命令导入IOS. rommon 1 > IP_ADDRESS=192.168.1.2rommon 2 > IP_SUBNET_MASK= ...

  7. 【原】简单shell练习(五)

    1.查询一个文件中某个单词出现的次数 # grep -o 'ts' ./test/txt |wc -l 2.统计当前文件夹下文件的个数 ls -l |grep "^-"|wc -l ...

  8. #P4770 [NOI2018]你的名字 的题解

    题目背景 实力强大的小A 被选为了ION2018 的出题人,现在他需要解决题目的命名问题. 题目描述 小A 被选为了ION2018 的出题人,他精心准备了一道质量十分高的题目,且已经把除了题目命名以外 ...

  9. Mybatis遇到的报错

    MyBatis遇到的报错: 1.Caused by: org.xml.sax.SAXParseException; lineNumber: 35; columnNumber: 17; 元素类型为 &q ...

  10. 02使用GitHub远程仓库

    一.远程库配置 由于本地的GIT仓库和GitHub仓库之间的传输是通过SSH加密的,所以需要以下配置: 1.创建SSH key 为什么GitHub需要SSHKey:根据key来授权,有哪些key可以往 ...