• 伪元素与伪类元素


    伪元素与伪类元素的不同:

    伪元素其实相当于伪造了一个元素,例如before,first-letter达到的效果就是伪造了一个元素,然后添加了其相应的效果而已;而伪类没有伪造元素,例如first-child只是给子元素添加样式而已。

    伪元素和伪类之所以这么容易混淆,是因为他们的效果类似而且写法相仿,但实际上 css3 为了区分两者,已经明确规定了伪类用一个冒号来表示,而伪元素则用两个冒号来表示。

    但因为兼容性的问题,所以现在大部分还是统一的单冒号,但是抛开兼容性的问题,我们在书写时应该尽可能养成好习惯,区分两者。

    css选择器的汇总表:

    选择器示例示例说明CSS
    .class .intro 选择所有class="intro"的元素 1
    #id #firstname 选择所有id="firstname"的元素 1
    * * 选择所有元素 2
    element p 选择所有<p>元素 1
    element,element div,p 选择所有<div>元素和<p>元素 1
    element element div p 选择<div>元素内的所有<p>元素 1
    element>element div>p 选择所有父级是 <div> 元素的 <p> 元素 2
    element+element div+p 选择所有紧接着<div>元素之后的<p>元素 2
    [attribute] [target] 选择所有带有target属性元素 2
    [attribute=value] [target=-blank] 选择所有使用target="-blank"的元素 2
    [attribute~=value] [title~=flower] 选择标题属性包含单词"flower"的所有元素 2
    [attribute l=language] [lang l=en] 选择一个lang属性的起始值="EN"的所有元素 2
    :link a:link 选择所有未访问链接 1
    :visited a:visited 选择所有访问过的链接 1
    :active a:active 选择活动链接 1
    :hover a:hover 选择鼠标在链接上面时 1
    :focus input:focus 选择具有焦点的输入元素 2
    :first-letter p:first-letter 选择每一个<P>元素的第一个字母 1
    :first-line p:first-line 选择每一个<P>元素的第一行 1
    :first-child p:first-child 指定只有当<p>元素是其父级的第一个子级的样式。 2
    :before p:before 在每个<p>元素之前插入内容 2
    :after p:after 在每个<p>元素之后插入内容 2
    :lang(language) p:lang(it) 选择一个lang属性的起始值="it"的所有<p>元素 2
    element1~element2 p~ul 选择p元素之后的每一个ul元素 3
    [attribute^=value] a[src^="https"] 选择每一个src属性的值以"https"开头的元素 3
    [attribute$=value] a[src$=".pdf"] 选择每一个src属性的值以".pdf"结尾的元素 3
    [attribute*=value] a[src*="runoob"] 选择每一个src属性的值包含子字符串"runoob"的元素 3
    :first-of-type p:first-of-type 选择每个p元素是其父级的第一个p元素 3
    :last-of-type p:last-of-type 选择每个p元素是其父级的最后一个p元素 3
    :only-of-type p:only-of-type 选择每个p元素是其父级的唯一p元素 3
    :only-child p:only-child 选择每个p元素是其父级的唯一子元素 3
    :nth-child(n) p:nth-child(2) 选择每个p元素是其父级的第二个子元素 3
    :nth-last-child(n) p:nth-last-child(2) 选择每个p元素的是其父级的第二个子元素,从最后一个子项计数 3
    :nth-of-type(n) p:nth-of-type(2) 选择每个p元素是其父级的第二个p元素 3
    :nth-last-of-type(n) p:nth-last-of-type(2) 选择每个p元素的是其父级的第二个p元素,从最后一个子项计数 3
    :last-child p:last-child 选择每个p元素是其父级的最后一个子级。 3
    :root :root 选择文档的根元素 3
    :empty p:empty 选择每个没有任何子级的p元素(包括文本节点) 3
    :target #news:target 选择当前活动的#news元素(包含该锚名称的点击的URL) 3
    :enabled input:enabled 选择每一个已启用的输入元素 3
    :disabled input:disabled 选择每一个禁用的输入元素 3
    :checked input:checked 选择每个选中的输入元素 3
    :not(selector) :not(p) 选择每个并非p元素的元素 3
    ::selection ::selection 匹配元素中被用户选中或处于高亮状态的部分 3
    :out-of-range :out-of-range 匹配值在指定区间之外的input元素 3
    :in-range :in-range 匹配值在指定区间之内的input元素 3
    :read-write :read-write 用于匹配可读及可写的元素 3
    :read-only :read-only 用于匹配设置 "readonly"(只读)属性的元素 3
    :optional :optional 用于匹配可选的输入元素 3
    :required :required 用于匹配设置了 "required" 属性的元素 3
    :valid :valid 用于匹配输入值为合法的元素 3
    :invalid :invalid 用于匹配输入值为非法的元素 3


    获取伪元素的属性值可以使用window.getComputedStyle()方法,获取伪元素的CSS样式声明对象。然后利用getPropertyValue方法或直接使用键值访问都可以获取对应的属性值。

    语法:window.getComputedStyle(element[, pseudoElement])

    • 参数如下:
    • element(Object):伪元素的所在的DOM元素;
    • pseudoElement(String):伪元素类型。可选值有:”:after”、”:before”、”:first-line”、”:first-letter”、”:selection”、”:backdrop”;

    举个栗子: 

    // CSS代码 
    
    #myId:before {
    
    
    content: "hello world!";
    
    
    display: block;
    
    
     100px;
    
    
    height: 100px;
    
    
    background: red;
    
    
    }
    
    
    // HTML代码
    
    <div id="myId"></div>
    
    
    // JS代码
    
    
    var myIdElement = document.getElementById("myId");
    
    
    var beforeStyle = window.getComputedStyle(myIdElement, ":before");
    
    
    console.log(beforeStyle); // [CSSStyleDeclaration Object]
    
    
    console.log(beforeStyle.width); // 100px
    
    
    console.log(beforeStyle.getPropertyValue("width")); // 100px
    
    
    console.log(beforeStyle.content); // "hello world!"

     

    备注:

    1. getPropertyValue()和直接使用键值访问,都可以访问CSSStyleDeclaration Object。它们两者的区别有:

    • 对于float属性,如果使用键值访问,则不能直接使用getComputedStyle(element, null).float,而应该是cssFloat与styleFloat;
    • 直接使用键值访问,则属性的键需要使用驼峰写法,如:style.backgroundColor;
    • 使用getPropertyValue()方法不必可以驼峰书写形式(不支持驼峰写法),例如:style.getPropertyValue(“border-top-color”);
    • getPropertyValue()方法在IE9+和其他现代浏览器中都支持;在IE6~8中,可以使用getAttribute()方法来代替;

    2. 伪元素默认是”display: inline”。如果没有定义display属性,即使在CSS中显式设置了width的属性值为固定的大小如”100px”,但是最后获取的width值仍是”auto”。这是因为行内元素不能自定义设置宽高。解决办法是给伪元素修改display属性为”block”、”inline-block”或其他。

    四. 更改伪元素的样式:

    方法1. 更换class来实现伪元素属性值的更改:

    举个栗子: 

    // CSS代码 
    .red::before { 
    
    content: "red";
    
    color: red; 
    
    } 
    
    .green::before { 
    
    content: "green";
    
    color: green; 
    
    } 
    
    // HTML代码
    
    <div class="red">内容内容内容内容</div>
    
    // jQuery代码
    $(".red").removeClass('red').addClass('green');

    方法2. 使用CSSStyleSheet的insertRule来为伪元素修改样式:

    举个栗子:

    document.styleSheets[0].addRule('.red::before','color: green'); // 支持IE document.styleSheets[0].insertRule('.red::before { color: green }', 0); // 支持非IE的现代浏览器
    

    方法3. 在<head>标签中插入<style>的内部样式: 

    var style = document.createElement("style"); 
    
    document.head.appendChild(style);
    
    sheet = style.sheet; 
    
    sheet.addRule('.red::before','color: green'); // 兼容IE浏览器
    
    sheet.insertRule('.red::before { color: green }', 0); // 支持非IE的现代浏览器

    或者用jQuery:

    $('<style>.red::before{color:green}</style>').appendTo('head');

    五. 修改伪元素的content的属性值:

    方法1. 使用CSSStyleSheet的insertRule来为伪元素修改样式: 

    var latestContent = "修改过的内容"; 
    
    var formerContent = window.getComputedStyle($('.red'), '::before').getPropertyValue('content'); document.styleSheets[0].addRule('.red::before','content: "' + latestContent + '"'); document.styleSheets[0].insertRule('.red::before { content: "' + latestContent + '" }', 0);

    方法2. 使用DOM元素的data-*属性来更改content的值: 

    // CSS代码 
    
    .red::before { 
    
    content: attr(data-attr);
    
    color: red; 
    
    } 
    
    // HTML代码
    
    <div class="red" data-attr="red">内容内容内容内容</div>
    
    // JacaScript代码
    
    $('.red').attr('data-attr', 'green');

     

    六. 一点小小建议:

    1. 伪元素的content属性很强大,可以写入各种字符串和部分多媒体文件。但是伪元素的内容只存在于CSS渲染树中,并不存在于真实的DOM中。所以为了SEO优化,最好不要在伪元素中包含与文档相关的内容。

    2. 修改伪元素的样式,建议使用通过更换class来修改样式的方法。因为其他两种通过插入行内CSSStyleSheet的方式是在JavaScript中插入字符代码,不利于样式与控制分离;而且字符串拼接易出错。

    3. 修改伪元素的content属性的值,建议使用利用DOM的data-*属性来更改。

  • 相关阅读:
    Mysql 查看 数据库/表 磁盘占用
    COLA 4.0 整洁面向对象分层架构
    《语言选择与就业方向》(2010/06/09)
    《为什么程序员不愿写文档》(2010/06/22)
    《我?还是我们?》(2010/06/30)
    《选择大公司还是小公司》(2010/06/11)
    《加班,加班,加班》(2010/06/17)
    《薪水的苦恼》(2010/06/15)
    《新手面试时的常见问题和对策》(2010/06/15)
    《大量编程带来的快乐和烦恼》(2010/06/20)
  • 原文地址:https://www.cnblogs.com/niuyaomin/p/11657154.html
Copyright © 2020-2023  润新知