红影 发表于 2024-8-4 12:01

马黑黑 发表于 2024-8-4 10:59
这叫添色

那个文字阴影也很漂亮{:4_187:}

红影 发表于 2024-8-4 12:07

马黑黑 发表于 2024-8-4 10:59
你确定没有误人子弟?

误人子弟怕啥,反正是人家的子弟,我们没误啊,不但没误而且有悟{:4_173:}

红影 发表于 2024-8-4 12:08

马黑黑 发表于 2024-8-4 11:00
有明确参照

是的,有参照的更容易理解{:4_187:}

南无月 发表于 2024-8-4 18:55

马黑黑 发表于 2024-8-3 22:41
谢谢

想说一声老师辛苦啦,喝杯咖啡{:4_190:}
小白感觉写教程感觉超级费神,
要组织,还要示范给小白看,
不过看老师信手掂来也轻轻松松{:4_170:}

南无月 发表于 2024-8-4 18:56

红影 发表于 2024-8-4 11:58
.hyhy {
        padding: 6px;
        font: bold 3em sans-serif;


影子这个作业非常漂亮{:4_199:}{:4_187:}

红影 发表于 2024-8-4 22:17

南无月 发表于 2024-8-4 18:56
影子这个作业非常漂亮

找了个艳丽的小动图,就衬在下面了{:4_173:}

马黑黑 发表于 2024-8-5 07:54

<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遮罩</h2>
        <p>CSS的遮罩技术使用 <mark>mask</mark> 属性实现对可视元素的裁切,具体实现方式是在元素的mask属性中使用一个图像做遮罩体,该图像透明的部分将遮挡元素对应区域、不透明的部分将呈现元素对应的区域。</p>
        <p>这里有两张图片,左边的图片将是 img 标签的 src,右边的图片用做 img 的遮罩体。意思就是,图片实体img元素所呈现的图片将不是原始的,它将被第二张图片以 mask 属性的方式对之进行裁切。</p>
        <p><img src="https://638183.freep.cn/638183/t24/4/lake.jpg" alt="" /><img src="https://638183.freep.cn/638183/small/ying.png" alt="" /></p>
        <p>我们先来看默认的遮罩代码和效果:</p>

<div class="hE"><pre id="pre1">
&lt;style&gt;
.pic1 {
        mask: url('https://638183.freep.cn/638183/small/ying.png');
        -webkit-mask: url('https://638183.freep.cn/638183/small/ying.png'); /* 兼容Chromium内核 < 120 */
}
&lt;/style&gt;

&lt;img class="pic1" src="https://638183.freep.cn/638183/t24/4/lake.jpg" alt="" /&gt;
</pre></div>

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

        <p>当代浏览器已经完美支持mask属性,如果考虑兼容性问题可多加一个带 -webkit- 前缀的mask属性,-webkit-mask。上例,mask属性的赋值和background属性的赋值完全一样,我们也完全可以按照背景图像的赋值规范做必要的设置:</p>

<div class="hE"><pre id="pre2">
&lt;style&gt;
.pic2 {
        mask: url('https://638183.freep.cn/638183/small/ying.png') no-repeat center/80% 100%;
        -webkit-mask: url('https://638183.freep.cn/638183/small/ying.png') no-repeat center/80% 100%;
}
&lt;/style&gt;

&lt;img class="pic2" src="https://638183.freep.cn/638183/t24/4/lake.jpg" alt="" /&gt;
</pre></div>

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

        <p><mark>no-repeat</mark>禁止了裁切的重复;<mark>center</mark> 表示裁切中心在元素的中心,等价于 <mark>50% 50%</mark>;<mark>80% 100%</mark> 是mask的裁切尺寸,注意,使用百分比表达裁切尺寸时该尺寸基于主元素,是主元素宽高的百分之几。</p>
        <p>以上我们用的是mask属性的简写形式,repeat对应的是 <span class="textRed">mask-repeat</span>、<span class="textRed">mask-position</span> 和 <span class="textRed">mask-size</span>,这与背景相关的 background-* 是一一对应的,稍加思考就可以理解和掌握。mask 属性自身也是简写属性,mask 属性使用图像的对应属性应该是 <span class="textRed">mask-image</span>,这与 background 和 background-image 的关系一个道理。mask-* 属性还有很多,有兴趣有余力的童鞋可以去学习研究,我们稍后可能会讲到少数用得上的属性。</p>
        <p>以上我们使用带有透明的图片做遮罩体去遮罩另一个画面——我们可以称之为源,可以是图片或其他可视界面。下面我们使用CSS渐变来充当遮罩体(记住,渐变本身就是图像),创建一个径向渐变做遮罩mask的属性值,可视区域设计为70%,为消除椭圆边缘的锯齿,透明色与红色之间有一个小过渡:</p>

<div class="hE"><pre id="pre3">
&lt;style&gt;
.pic3 {
        mask: radial-gradient(red 70%, transparent 70.5%, transparent 0);
        -webkit-mask: radial-gradient(red 70%, transparent 70.5%, transparent 0);
}
&lt;/style&gt;

&lt;img class="pic3" src="https://638183.freep.cn/638183/t24/4/lake.jpg" alt="" /&gt;
</pre></div>

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

        <p>上面的示例是把图像(源)的周边30%裁切掉,我们也可以反过来设计,裁切源图片的中心部分。这次我们下手轻一点,在源图片的中央用mask属性割走一个半径50px的圆,该圆下的源图区域不会显示,源图底下是什么就是什么:</p>

<div class="hE"><pre id="pre4">
&lt;style&gt;
.pic4 {
        mask: radial-gradient(circle, transparent 50px, red 51px, red 0);
        -webkit-mask: radial-gradient(circle, transparent 50px, red 51px, red 0);
}
&lt;/style&gt;

&lt;img class="pic4" src="https://638183.freep.cn/638183/t24/4/lake.jpg" alt="" /&gt;
</pre></div>

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

        <p>我们继续对我们的湖泊这个源图像做其他的遮罩操作。我曾见过一位大佬用十分复杂的方式做一个两边有半圆凹槽的奖券,我们现在也实现湖泊变奖券形状的功能,但代码相当简洁:</p>

<div class="hE"><pre id="pre5">
&lt;style&gt;
.pic5 {
        mask: radial-gradient(circle, transparent 40px, red 42px, red 0) -237px 0 / 100% 100%;
        -webkit-mask: radial-gradient(circle, transparent 40px, red 42px, red 0) -237px 0 / 100% 100%;
}
&lt;/style&gt;

&lt;img class="pic5" src="https://638183.freep.cn/638183/t24/4/lake.jpg" alt="" /&gt;
</pre></div>

        <p><button id="btn5" type="button" value="5">点击查看效果</button></p>
        <div id="sbox5" class="showDiv"></div>

        <p>设计要点:① 渐变是圆形;② 遮罩渐变背景的 mask-position X轴位置是图像源宽度的一半,使用实体单位长度而非百分比;③ 遮罩渐变尺寸 mask-size XY轴均为100%;④ 允许渐变重复(repeat,默认)。第 ② 个要点基于被遮罩对象即源的宽度,通用性较差,我们可以用如下一了百了的方法加以实现上个示例的功能:</p>

<div class="hE"><pre id="pre6">
&lt;style&gt;
.pic6 {
        mask:
                radial-gradient(circle at 0 50%, transparent 40px, red 42px, red 0),
                radial-gradient(circle at 100% 50%, transparent 40px, red 42px, red 0);
        -webkit-mask:
                radial-gradient(circle at 0 50%, transparent 40px, red 42px, red 0),
                radial-gradient(circle at 100% 50%, transparent 40px, red 42px, red 0);
        -webkit-mask-composite: source-in;
}
&lt;/style&gt;

&lt;img class="pic6" src="https://638183.freep.cn/638183/t24/4/lake.jpg" alt="" /&gt;
</pre></div>

        <p><button id="btn6" type="button" value="6">点击查看效果</button></p>
        <div id="sbox6" class="showDiv"></div>

        <p>此法不再关心被遮罩对象的任何尺寸,我们要做的是设计两组径向渐变,令它们所开的凹槽朝向互反,然后用 maks-composite 属性将两个遮罩体组合起来,属性值是 source-in,表示遮罩重叠的位置显示、不重叠的位置不显示。maks-composite属性的资料目前较少,官网也只有英文版且仅介绍少量几个合成值,但合成属性值理论上来源于blend-mode融合技术,新版的chromium内核的浏览器已经完好支持,<a href="http://mhh.52qingyin.cn/art/show.php?st=1&sd=1&art=mahei_1711670988" target="_blank">CANVAS画布图形合成模式演示</a> 一文所提供的资料可做原理性参考。</p>

        <p>本讲全部的五个演示例子,都是基于对源进行遮罩裁切的,这也是mask属性的主要功能,但其用途不仅仅局限于此。例如,我们可以用它来做图片融合使两张或更多的图片成为一体,我们甚至可以将视频融入背景图片中。用mask属性将多个单元的内容融合在一起,我此前的一些音画帖做过这方面的尝试,比如<a href="http://mhh.52qingyin.cn/art/bshow.php?st=3&sd=3&art=mahei_1721712629" target="_blank">《出埃及记》</a>是图片与视频的融合、<a href="http://mhh.52qingyin.cn/art/bshow.php?st=3&sd=3&art=mahei_1722486281" target="_blank">《另一个自己》</a>是图片和图片的融合,使用的技巧都是基于mask属性,感兴趣的童鞋可以去做一下代码层面的研究。</p>
        <p>作业:给任意视频做 mask 剪裁,要求在视频的右上角剪去一个小三角形,剪裁边缘不能有锯齿。视频代码和相应的CSS样式如下:</p>

<div class="hE"><pre>
&lt;style&gt;
.vid {
        width: 600px;
        height: 360px;
        object-fit: cover; /* 视频内容适应元素尺寸 */
        /* -webkit-mask: ... 这里设计mask属性值 */
}
&lt;/style&gt;

&lt;video class="vid" src="视频地址" autoplay loop&gt;&lt;/video&gt;
</pre></div>

        <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-5 13:01

<style>
.qsfg16 {
        mask: repeat-radial-gradient(circle, transparent 3px, red 4px, red 0) -237px0/ 100% 3%;
        -webkit-mask: radial-gradient(circle, transparent 3px, red 4px, red 0) -237px0/ 100% 3%;
}
</style>
<img class="qsfg16" src="https://638183.freep.cn/638183/t24/4/lake.jpg" alt="" />

南无月 发表于 2024-8-5 13:01


<style>
.qsfg160 {
    mask: radial-gradient(circle, transparent 3px, red 4px, red 0) 0-147px/ 3% 100%;
    -webkit-mask: radial-gradient(circle, transparent 3px, red 4px, red 0) 0-147px/ 3% 100%;
}
</style>
<img class="qsfg160" src="https://638183.freep.cn/638183/t24/4/lake.jpg" alt="" />

南无月 发表于 2024-8-5 13:02

对老师贴子里的两个半圆感兴趣,整了两个小锯齿{:4_173:}

马黑黑 发表于 2024-8-5 17:11

南无月 发表于 2024-8-5 13:02
对老师贴子里的两个半圆感兴趣,整了两个小锯齿

弄成周边都是锯齿更厉害了

马黑黑 发表于 2024-8-6 08:09

红影 发表于 2024-8-4 12:07
误人子弟怕啥,反正是人家的子弟,我们没误啊,不但没误而且有悟

听起来就是误了{:4_170:}

马黑黑 发表于 2024-8-6 08:10

{:4_203:}

马黑黑 发表于 2024-8-6 08:12

红影 发表于 2024-8-4 22:17
找了个艳丽的小动图,就衬在下面了

效果很欢快的样纸

马黑黑 发表于 2024-8-6 08:12

红影 发表于 2024-8-4 12:08
是的,有参照的更容易理解

这是人的局限:喜欢对比

马黑黑 发表于 2024-8-6 08:13

红影 发表于 2024-8-4 12:00
选的动图貌似有些太快了

可以用作图软件调整一下

马黑黑 发表于 2024-8-6 08:13

红影 发表于 2024-8-4 11:58
.hyhy {
        padding: 6px;
        font: bold 3em sans-serif;


100√

马黑黑 发表于 2024-8-6 08:14

红影 发表于 2024-8-3 19:55
我就是单独测试的啊。
刚才又去试了一下,把那50%分别取10 20 之类的,好像有点感受了。然后左和下的取 ...

实践出真知

马黑黑 发表于 2024-8-6 19:50

下一讲等翻页

朵拉 发表于 2024-8-6 20:21

马黑黑 发表于 2024-8-6 19:50
下一讲等翻页

老师都更新十六讲了,
学生慢慢学习哈~~{:4_190:}
页: 2 3 4 5 6 7 8 9 10 11 [12] 13 14 15 16 17 18 19 20 21
查看完整版本: 小白音画帖教程(完结)