马黑黑 发表于 2024-8-6 20:30

朵拉 发表于 2024-8-6 20:21
老师都更新十六讲了,
学生慢慢学习哈~~

进度不强求,这是夜大一样的,不是全日制

马黑黑 发表于 2024-8-6 20:31

<style>
.artbox { position: relative; }
.artbox > p { position: relative; margin: 10px 0; font: normal 18px / 26px sans-serif; }
.artbox mark { color: black; background: lightblue; padding: 2px 4px; }
.textRed { color: red; }
.showDiv { position: relative; }
</style>

<div class="artbox">
        <h2 class="textMid">第十七讲:CSS伪元素 ::before 和 ::after</h2>
        <p><span class="textRed">伪元素</span>是CSS层面的概念,作为主选择器的附加选择器作用于HTML可视元素,是对HTML元素的补充或修饰。伪元素现已有十来多种,预计将来还会增加。本讲,我们仅学习两种做音画帖常用到的伪元素,<span class="textRed">::before</span> 和 <span class="textRed">::after</span>。伪元素作为附加给主元素CSS选择器的特殊选择器,其语句表达结构离不开主元素CSS选择器,例如,假设我们有一个class选择器 <mark>.pbox1 { ... }</mark>,则 ::before 和 ::after 伪元素选择器分别写成 <mark>.pbox1::before { ... }</mark> 和 <mark>.pbox1::after { ... }</mark>。试看代码和效果:</p>

<div class="hE"><pre id="pre1">
&lt;style&gt;
.pbox1 {
        width: 400px;
        height: 100px;
        border: 1px solid gray;
        background: white;
}
.pbox1::before {
        content: '我是 ::before';
        background: tan;
}
.pbox1::after {
        content: '我是 ::after';
        background: teal;
}
&lt;/style&gt;

&lt;div class="pbox1"&gt;&lt;/div&gt;
</pre></div>

        <p><button id="btn1" type="button" value="1">点击查看效果</button></p>
        <div id="sbox1" class="showDiv"></div>

        <p>::before 和 ::after 伪元素的一个重要属性是 <span class="textRed">content</span>,内容之意,可以给它赋文本值,用小角引号包裹起来。content属性不能缺失,它是两个伪元素是否生效的依托,因此,即便不想让伪元素显示任何内容,也需要它出现并给它赋空值。除了文本值,还可以使用 url() 函数给它一个图片地址,伪元素则将显示该图片的原始尺寸,此时,伪元素不能更改大小。::before 和 ::after伪元素其实本身就像是 <mark>class=".pbox1"</mark> HTML元素的子元素,除了特殊的content属性,还可以有用其他相应元素应有的属性,比如上面示例的 background 背景属性。</p>
        <p>通常,拥有子元素的父元素,为了能约束子元素的布局,自身需要设置 position 属性,子元素则根据需要是否设置position属性。之前的讲义提到过,相对定位的父元素+绝对定位的子元素是我们做音画帖的配套设置,下面的示例所演示的是设置两个伪元素的位置和尺寸、形状等:</p>

<div class="hE"><pre id="pre2">
&lt;style&gt;
.pbox2 {
        width: 400px;
        height: 100px;
        border: 1px solid gray;
        background: white;
        position: relative; /* 父元素相对定位 */
}
.pbox2::before {
        content: '::before 伪元素';
        position: absolute; /* 伪元素(子元素)绝对定位 */
        background: tan;
        width: 40%;
        height: 80%;
}
.pbox2::after {
        content: '::after伪元素';
        position: absolute; /* 伪元素(子元素)绝对定位 */
        background: teal;
        width: 40%;
        height: 100%;
        right: 0;
}
&lt;/style&gt;

&lt;div class="pbox2"&gt;&lt;/div&gt;
</pre></div>

        <p><button id="btn2" type="button" value="2">点击查看效果</button></p>
        <div id="sbox2" class="showDiv"></div>

        <p>两个伪元素的代码有很多属性是一样的,我们可以把它们整合在一起,并依据CSS后面的设置覆盖前面的设置原理,不尽相同的也可以先整合在一块,然后在相应选择器再设置一次。上面示例的代码可以这样改写:</p>

<div class="hE"><pre>
&lt;style&gt;
.pbox2 {
        width: 400px;
        height: 100px;
        border: 1px solid gray;
        background: white;
        position: relative; /* 父元素相对定位 */
}
.pbox2::before, .pbox2::after {
        content: '::before伪元素';
        position: absolute; /* 伪元素(子元素)绝对定位 */
        background: tan;
        width: 40%;
        height: 80%;
}
.pbox2::after {
        content: '::after伪元素';
        background: teal;
        right: 0;
        height: 100%;
}
&lt;/style&gt;

&lt;div class="pbox2"&gt;&lt;/div&gt;
</pre></div>

        <p>注意第9行代码的写法,两个伪元素合在一起写时用小角逗号隔开。改进的代码,9~15行其实是 ::before 的属性,::after 共用其中的一部分属性,然后再另开一个 ::after 选择器,将不同于 ::before 的属性另写一遍。是否需要如此改写代码并没有严格要求,完全根据各人喜好决定。</p>
        <p>作为宿主元素的子元素,伪元素有自己默认的层级关系:::before 在最底层,::after 再最高层。如果宿主元素还有其他的子元素,我们来看看伪元素和其他的子元素各自的层级关系:</p>

<div class="hE"><pre id="pre3">
&lt;style&gt;
.pbox3 {
        width: 400px;
        height: 200px;
        border: 1px solid gray;
        background: white;
        position: relative;
}
.pbox3::before {
        content: '::before伪元素';
        position: absolute;
        background: tan;
        width: 40%;
        height: 80%;
}
.pbox3::after {
        content: '::after伪元素';
        position: absolute;
        background: teal;
        width: 40%;
        height: 100%;
        left: 120px;
}
.mpic {
        position: absolute;
        left: 50px;
        width: 100px;
        height: 100px;
}
&lt;/style&gt;

&lt;div class="pbox3"&gt;
        &lt;img class="mpic" src="https://638183.freep.cn/638183/web/svg/4yecc.svg" alt="" /&gt;
&lt;/div&gt;
</pre></div>

        <p><button id="btn3" type="button" value="3">点击查看效果</button></p>
        <div id="sbox3" class="showDiv"></div>

        <p>可以看到,::after伪元素处在最顶层。要改变层级关系,可以给需要提升层级的子元素如上例的图片class选择器(也可以是其他选择器,如id选择器)加上 z-index 属性,例如,<mark>z-index: 10;</mark> 即可确保图片不会被 ::after 遮挡。</p>

        <p>::before 和 ::after 伪元素用途广泛,充分利用好它们可以有大作为。花潮格式的lrc歌词同步机制用到它们,本讲义的代码行号用到它们,一系列的音画帖也用到它们……,总之,这两个伪元素自身就是宿主元素的子元素,完全可以当做可视的元素看待和应用。以下例子,::before 充当播放器, ::after 用来加载一张图片:</p>

<div class="hE"><pre id="pre4">
&lt;style&gt;
/* 宿主元素类选择器 */
.pbox4 {
        width: 800px;
        height: 460px;
        background: url('https://638183.freep.cn/638183/t22/hl/bjehp.webp') center/cover;
        position: relative;
}
/* 伪元素公共属性 */
.pbox4::before, .pbox4::after {
        content: '';
        position: absolute;
}
/* 播放器按钮 :使用::bofore伪元素背景图片 */
.pbox4::before {
        right: 60px;
        top: 160px;
        width: 80px;
        height: 80px;
        background: url('https://638183.freep.cn/638183/web/svg/4yecc.svg') no-repeat center/cover;
}
/* 图片 :使用::after content属性加载 */
.pbox4::after {
        content: url('https://638183.freep.cn/638183/t22/hl/kite1.gif');
        left: 20%;
        mix-blend-mode: hue; /* 融合滤镜 :修饰图片 */
}
&lt;/style&gt;

&lt;div class="pbox4"&gt;&lt;/div&gt;
</pre></div>

        <p><button id="btn4" type="button" value="4">点击查看效果</button></p>
        <div id="sbox4" class="showDiv"></div>

        <p>前面提到过,content属性如果使用 url() 函数加载图片,伪元素的宽高不能人为设置,一切依据图片的尺寸,但可以使用 transform: scale() 方法对之缩放,缩放后图片的元素位置以缩放前的大小为依据。</p>
        <p>最后,需要注意的是,不是所有的HTML元素都支持伪元素。一般来说,自闭合标签如 img、input 等是不支持伪元素的,设置了伪元素也将无效。不能带子元素的HTML标签如audio、video等也不支持伪元素。伪元素一般用于 div、h*、p、span或以支持伪元素标签为蓝本的自定义标签等较为合适。此外,伪元素不会获得焦点,这意味着其上的文本、图片将不可能被选中,例如讲义代码的行号,你无法选择它们。</p>

        <p>作业:模仿本讲最后一个示例做一个帖子布局,其中,① 伪元素 ::before 用来做帖子标题,字号 20px 或更大,有文本阴影;② ::after 伪元素使用 url() 函数加载一个合适尺寸的静态小图片模拟播放器并设计一个 @keyframes 关键帧动画去驱动播放器的旋转。</p>
        <p><a href="https://www.huachaowang.com/forum.php?mod=viewthread&tid=77307&extra=page%3D1">返回目录</a></p>

</div>

<script>
var sc = document.createElement('script');
sc.chartset = 'utf-8';
sc.src = 'https://638183.freep.cn/638183/web/js2024/helight.js';
document.body.appendChild(sc);
var runCodes = (str,ele) => {
        let reg = /(<script(.*?)>)(.|\n)*?(<\/script>)/g;
        let js_str, html_str;
        if(str.match(reg) !== null) {
                js_str = str.match(reg);
                html_str = str.replace(js_str, '').trim();
                js_str = js_str.replace(/<[\/]{0,1}script[^>]*>/g,'').trim();
        } else {
                js_str = '';
                html_str = str.trim();
        }
        ele.innerHTML = html_str;
        let myfunc = new Function(js_str);
        myfunc();
};

.forEach((btn,key) => {
        var pres = ,
                outs = ;
        btn.onclick = () => {
                runCodes(pres.innerText, outs);
                btn.disabled = true;
        }       
});
</script>

红影 发表于 2024-8-6 20:39

马黑黑 发表于 2024-8-6 08:09
听起来就是误了

不不,你是悟人子弟,音同字不同{:4_173:}

马黑黑 发表于 2024-8-6 20:40

红影 发表于 2024-8-6 20:39
不不,你是悟人子弟,音同字不同

听起来想到的是误

红影 发表于 2024-8-6 20:41

马黑黑 发表于 2024-8-6 08:12
效果很欢快的样纸

是的,炎热的夏天,效果也必须热烈{:4_173:}

红影 发表于 2024-8-6 20:42

马黑黑 发表于 2024-8-6 08:12
这是人的局限:喜欢对比

对比中感受更真切啊。

红影 发表于 2024-8-6 20:42

马黑黑 发表于 2024-8-6 08:13
可以用作图软件调整一下

做到贴子里是需要调的,这里是试验啊{:4_173:}

马黑黑 发表于 2024-8-6 20:44

红影 发表于 2024-8-6 20:42
做到贴子里是需要调的,这里是试验啊

也行

马黑黑 发表于 2024-8-6 20:44

红影 发表于 2024-8-6 20:42
对比中感受更真切啊。

但有时候会害死人哒{:4_170:}

马黑黑 发表于 2024-8-6 20:44

红影 发表于 2024-8-6 20:41
是的,炎热的夏天,效果也必须热烈

出出汗也挺好

红影 发表于 2024-8-6 20:45

马黑黑 发表于 2024-8-5 07:54
.artbox { position: relative; }
.artbox > p { position: relative; margin: 10px 0; font: normal 18 ...
这个pic5很奇特,变成单位长度就跑两边去了,若用百分比,即使是50% 0,也在中间。
但是用长度,把后面的也取一半长度,就跑四角去了。而且237无论取正负貌似都一样。

红影 发表于 2024-8-6 20:47


<style>
.hy5 {
        mask: radial-gradient(circle, transparent 40px, red 42px, red 0) 237px 148px / 100% 100%;
        -webkit-mask: radial-gradient(circle, transparent 40px, red 42px, red 0) 237px 148px / 100% 100%;
}
</style>

<img class="hy5" src="https://638183.freep.cn/638183/t24/4/lake.jpg" alt="" />

马黑黑 发表于 2024-8-6 20:49

红影 发表于 2024-8-6 20:45
这个pic5很奇特,变成单位长度就跑两边去了,若用百分比,即使是50% 0,也在中间。
但是用长度,把后面 ...

我哪里有提示,那种做法就是得用实体像素单位并根据源计算好尺寸。如果你需要做其他的位置设计,大概道理与此同时。

马黑黑 发表于 2024-8-6 20:49

红影 发表于 2024-8-6 20:47
.hy5 {
        mask: radial-gradient(circle, transparent 40px, red 42px, red 0) 237px 148px / 100% 100 ...

切四个角很简单的,有多重实现方法

红影 发表于 2024-8-6 20:56


<style>
.vidyz {
        width: 600px;
        height: 360px;
        object-fit: cover;
        -webkit-mask: linear-gradient(to top right, red 90%, transparent 91%, transparent 0);
}
</style>

<video class="vidyz" src="https://img.tukuppt.com/video_show/2418175/00/01/57/5b463b779e454_10s_big.mp4" autoplay loop></video>

红影 发表于 2024-8-6 20:57

红影 发表于 2024-8-6 20:56
.vidyz {
        width: 600px;
        height: 360px;


十六讲作业,十七讲还没来得及看{:4_173:}

红影 发表于 2024-8-6 20:57

马黑黑 发表于 2024-8-6 20:49
切四个角很简单的,有多重实现方法

嗯嗯,我只是做个试验,这也可以简单切出来了。

红影 发表于 2024-8-6 20:58

马黑黑 发表于 2024-8-6 20:49
我哪里有提示,那种做法就是得用实体像素单位并根据源计算好尺寸。如果你需要做其他的位置设计,大概道理 ...

这个挺难想明白,为什么长度和百分比得到的结果不一样。

红影 发表于 2024-8-6 20:59

马黑黑 发表于 2024-8-6 20:44
也行

主要看实现效果的,不需要考虑和其他元素的相配。

红影 发表于 2024-8-6 21:00

马黑黑 发表于 2024-8-6 20:44
但有时候会害死人哒

不会害死人,最多悟得太透了遁入空门{:4_173:}
页: 3 4 5 6 7 8 9 10 11 12 [13] 14 15 16 17 18 19 20 21 22
查看完整版本: 小白音画帖教程(完结)