目录
一、微云的实现
二、我的实现
三、结束语
首页 web前端 html教程 腾讯微云黑色遮罩引导蒙版更好的CSS实现方式_html/css_WEB-ITnose

腾讯微云黑色遮罩引导蒙版更好的CSS实现方式_html/css_WEB-ITnose

Jun 21, 2016 am 08:55 AM

一、微云的实现

网站有一些改动的时候,为了让用户熟知新的操作位置,往往会增加一个引导,常见的方式就是使用一个黑色的半透明蒙版,然后需要关注的区域是镂空的。

然后上周五我去 微云 转悠的时候,也看到了引导层,于是职业病又犯了,去学习下别人是怎么实现的。下面是观测的结果:

为了实现镂空蒙层效果,作者发挥了小时候拼积木的才能,使用两层HTML结构,内层使用5块独立区域拼接形成,至于中间镂空的区域的阴影则是使用的图片实现的。

虽然最终的效果满足了产品的需求,对于用户而言,目的已经达到。但是,从代码质量层面、潜在的体验提升可能性、使用场景广度上来讲,还是弱了很多的。

举例来说,如果我们某个提示区域面积很大,那中间的那个镂空区域尺寸是不是要变,那后面的背景图片怎么办?搞新图,有人看到了使用了 background-size:cover , 那IE7,IE8怎么办?哦,可能微云不需要管IE7, IE8.

如果不需要管IE7, IE8,那这里的实现就显得更加小白了。我们实际上只需要一层标签,一层空标签就可以实现我们的效果,且不需要图片。

二、我的实现

主要在于思维方式的变化。拼积木这种想法大家都比较容易想到,符合日常认知,但是,但代码层面,我们可以进行思维转换,发散思考,偌大的半透明遮罩层,我们不要老想着背景色块背景色块,可以突破常规思维,把它认为是边框,一个很大很大的边框(我们平时使用border都是 1 像素巨多),这样,我们自然就有了镂空效果。

如下图示意:

但是,目前我们中间的镂空区域方的,有没有什么办法变成圆的呢?

自然有, 方法1 是元素设置超大圆角,但是,此时为了边框依然填满整个屏幕, border 边框尺寸要大大增大,但是,为了不影响页面的滚动条,我们必须再嵌套一层标签,就显得啰嗦了;

方法2则是方法1某些方面的逆向思维处理,就是把当前元素作为外层限制标签,里面重新生成一个大尺寸伪元素,实现自适应尺寸的圆角效果,这个好,HTML干净不啰嗦,CSS一步到位(代码如下示意);

.cover::before {    content: '';    width: 100%; height:100%;    border-radius: 50%;    border: 400px solid #000;    position: absolute;    left: -400px; top: -400px;    /* 自己瞎填的参数,示意 */    box-shadow: inset 0 0 5px 2px rgba(0,0,0,.75);}
登录后复制

大家可以看到,上面的伪元素的各个参数都是固定参数值,与外部元素的尺寸什么的没有任何关系,只要外部元素尺寸不超过400,里面永远会有一个正椭圆的内阴影的镂空图形(因为超出部分会被 .cover 隐藏),要理解圆角和正椭圆的关系,可以参考我之前的文章:“ 秋月何时了,CSS3 border-radius知多少? ”。

眼见为实,耳听为虚,您可以狠狠地点击这里: 一层标签实现网站引导镂空蒙版功能demo (点击黑色蒙层会有引导切换效果)

demo这个镂空蒙层所使用的HTML代码如下:

<div class="cover"></div>
登录后复制

没错,就这么简单,没什么嵌套,没有什么五个元素变形金刚合体,没有使用图片。

微云这张图片3K多,以微云的用户访问量,估计流量费要不少钱的。

而且,大家如果点击蒙版,会发现,镂空的区域大小每次都是不一样的,有大有小,有高有瘦,而微云的那个实现方法要满足此需求就棘手;而且,大家发现没,这些尺寸位置的变化都是动画来动画去的,不是嗙嗙嗙这种生硬的效果,更soft, 对用户视觉引导效果更好,你看,我从这里到这里了,为什么可以实现动画效果呢,因为我们的镂空和内阴影都是CSS实现的,而微云的图片方法,显然是无法有动画的。

JS代码辅助

当然,我的实现也离不开JS的辅助,JS的工作很简单,让蒙层的 width / height 以及 border 大小和需要引导的元素相关联。

我特意整了个可以公用的方法 coverGuide (命名不喜欢自己随便改):

var coverGuide = function(cover, target) {    var body = document.body, doc = document.documentElement;    if (cover && target) {        // target size(width/height)        var targetWidth = target.clientWidth,            targetHeight = target.clientHeight;        // page size        var pageHeight = doc.scrollHeight,            pageWidth = doc.scrollWidth;                // offset of target            var offsetTop = target.getBoundingClientRect().top + (body.scrollTop || doc.scrollTop),            offsetLeft = target.getBoundingClientRect().left + (body.scrollLeft || doc.scrollLeft);                // set size and border-width        cover.style.width = targetWidth + 'px';        cover.style.height = targetHeight + 'px';            cover.style.borderWidth =             offsetTop + 'px ' +             (pageWidth - targetWidth - offsetLeft) + 'px ' +            (pageHeight - targetHeight - offsetTop) + 'px ' +             offsetLeft + 'px';                cover.style.display = 'block';                    // resize        if (!cover.isResizeBind) {            if (window.addEventListener) {                window.addEventListener('resize', function() {                    coverGuide(cover, target);                });                    cover.isResizeBind = true;            } else if (window.attachEvent) {                window.attachEvent('onresize', function() {                    coverGuide(cover, target);                });                cover.isResizeBind = true;                                // IE7, IE8 box-shadow hack                cover.innerHTML = '<img  src="/static/imghw/default1.png"  data-src="guide-shadow.png"  class="lazy" alt="腾讯微云黑色遮罩引导蒙版更好的CSS实现方式_html/css_WEB-ITnose" >';            }        }    }};
登录后复制

这里的 coverGuide 方法使用原生JS实现,IE6+浏览器都是兼容的,不依赖JS库,大家可以随意使用。当然,写得匆忙,没有严格验证,可能有bug,大家可以稍微留点心。

使用非常简单,语法如下:

coverGuide(cover, target);
登录后复制

其中 cover 就是 .cover 这个单独的蒙版元素, target 则是我们需要指引的元素,按钮啊,导航什么的。然后,我们的镂空区域自动定位到 target 的位置,大小也是 target 元素的大小。超省心。

具体使用,可参考上面的demo,源代码就在页面上。

IE7,IE8怎么办

如果你需要兼容IE7,IE8,我们不妨就方框效果;如果设计和产品接受不了,则可以使用图片打个补丁,例如上面JS代码部分的:

cover.innerHTML = '<img  src="/static/imghw/default1.png"  data-src="guide-shadow.png"  class="lazy" alt="腾讯微云黑色遮罩引导蒙版更好的CSS实现方式_html/css_WEB-ITnose" >';
登录后复制

我demo使用的这个图片长下面这样:

大小还有阴影都是我自己随手一搞的,旨在示意,真实项目大家可以向设计师索要图片。

然后,CSS超easy, 图片撑满我们的 cover 就可以。

/* IE7, IE8 img */.cover > img {    width: 100%; height: 100%;    }
登录后复制

三、结束语

这种蒙版覆盖思想呢,不仅仅适用于这种大面积的引导。我们上传图片,尤其上传头像之后,要对头像进行剪裁,常见的交互之一就是四周黑色,中间镂空,也可以使用巨大 border 来实现我们的效果,一层标签足矣,根本不需要上下左右额外4层标签拼接合体实现。

内部自适应的圆角效果单看文字,很多小伙伴估计不知道我在说些什么,建议去demo页面看下伪元素的代码,真实区域大小和最终效果,估计就会明白了。

感谢阅读,欢迎交流,欢迎提供更好的实现方法,一定有的,只是我功力不够。

以上~

本文为原创文章,会经常更新知识点以及修正一些错误,因此转载(图片请勿直接外链)请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。

本文地址: http://www.zhangxinxu.com/wordpress/?p=5290

(本篇完)

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

公众号网页更新缓存难题:如何避免版本更新后旧缓存影响用户体验? 公众号网页更新缓存难题:如何避免版本更新后旧缓存影响用户体验? Mar 04, 2025 pm 12:32 PM

公众号网页更新缓存难题:如何避免版本更新后旧缓存影响用户体验?

如何使用HTML5表单验证属性来验证用户输入? 如何使用HTML5表单验证属性来验证用户输入? Mar 17, 2025 pm 12:27 PM

如何使用HTML5表单验证属性来验证用户输入?

如何高效地在网页中为PNG图片添加描边效果? 如何高效地在网页中为PNG图片添加描边效果? Mar 04, 2025 pm 02:39 PM

如何高效地在网页中为PNG图片添加描边效果?

HTML5中跨浏览器兼容性的最佳实践是什么? HTML5中跨浏览器兼容性的最佳实践是什么? Mar 17, 2025 pm 12:20 PM

HTML5中跨浏览器兼容性的最佳实践是什么?

&lt; datalist&gt;的目的是什么。 元素? &lt; datalist&gt;的目的是什么。 元素? Mar 21, 2025 pm 12:33 PM

&lt; datalist&gt;的目的是什么。 元素?

&gt; gt;的目的是什么 元素? &gt; gt;的目的是什么 元素? Mar 21, 2025 pm 12:34 PM

&gt; gt;的目的是什么 元素?

&lt; meter&gt;的目的是什么。 元素? &lt; meter&gt;的目的是什么。 元素? Mar 21, 2025 pm 12:35 PM

&lt; meter&gt;的目的是什么。 元素?

我如何使用html5&lt; time&gt; 元素以语义表示日期和时间? 我如何使用html5&lt; time&gt; 元素以语义表示日期和时间? Mar 12, 2025 pm 04:05 PM

我如何使用html5&lt; time&gt; 元素以语义表示日期和时间?

See all articles