闲扯
我之前开发过一些 Discuz 插件。那时的我颇为理想化,一心想打造原创插件,可现实很快给了我沉重一击。我开发的原创插件常常迅速遭到抄袭。由于我涉足插件开发领域的时间较短,积累的老客户数量有限,所以插件完成后下载量寥寥无几。然而,通常在一个星期到一个月的时间内,就会有一两个 Discuz 插件开发的老手将我的插件抄袭过去。他们拥有众多客户资源,平台自然也不会因为我这个新开发者而对他们进行处罚。抄袭之后,他们凭借大量老客户,总会有一些人购买抄袭后的插件,销量自然就高了。而其他用户在选择插件时,往往会优先购买销量高的产品。
就拿之前的一款插件来说,被抄袭后我向平台反馈,得到的回复仅仅是 “知道了”,敷衍了事。那个抄袭者更是过分,我将插件定价为 50 元,他就故意定为 49 元,明显是在故意恶心我。前些日子,我发现年前开发的两款插件也都被抄袭了,甚至有的还被多个人抄袭。实在忍无可忍之下,我再次向平台抱怨投诉,结果平台却不予回复。
仔细想想,平台主要依靠这些开发者提供抽成来盈利,而且平台上部分插件本身就存在抄袭其他开发者的情况。所以,指望平台对抄袭行为进行处罚,几乎是不可能的事情。当前 Discuz 插件市场规模有限,新人想要立足极为困难,尤其是还面临着被一些老开发者抄袭的风险。PHP 代码基本属于开源性质,即便添加混淆代码,对防止抄袭起到的作用也微乎其微。况且插件的功能点较为固定,抄袭者只要看看功能介绍说明,就能仿制出类似的插件。
不可否认,Discuz 具有自身的优势。尽管许多人反映其代码可读性差,二次开发和维护难度较大,但在市场上却没有与之相抗衡的竞品。曾经发展势头良好的修罗 BBS,因某些原因赌气停止维护了;相较于 WordPress,Discuz 的资源占用明显更少。而国外类似的产品,在设计时往往不太注重性能问题 。
罢了罢了,如今我基本上不再大规模开发新插件了,只是偶尔为一些客户定制特定功能。最近,我就在帮一位客户开发一款能够自动切换夜间模式的插件。有人听闻后表示疑惑:“这不是有现成的免费插件吗?稍微改改不就可以交差了?” 实不相瞒,我最开始也是这么考虑的。
夜间模式自动切换之“难”
打个比方,网页如同是一栋高楼,其中存在着诸多层级。这里所提及的层级并非网页的 DOM 树结构,而是指 DOM 元素的 z-index 属性。就拿 Discuz 的菜单举例,要让它在所有网页元素之上显示,实际上只需将其 z-index 值调高即可。因为在显示过程中,较高 z-index 值的元素会被最后绘制,进而呈现在最顶端 。
那么,该如何实现夜间模式呢?通常的做法是添加滤镜。比如说,倘若在一楼(可以理解为较低层级)添加一个滤镜,那么一楼以下的元素都会呈现暗色显示,然而一楼以上的元素却无法被暗色处理。前面提到,Discuz 运用层级来管理和展示各个界面元素,所以,要想让整个页面都呈现暗色,滤镜自然需要添加到所有网页元素的最上方。这样一来,第一个问题便随之出现了:图片和视频该如何处理呢?
假设不存在层级概念,所有元素处于同一级别,那么只要不处理图片和视频元素,就能达成目的。但现在存在层级概念,滤镜必须放置在 “高楼的楼顶”,如此一来,图片和视频元素便难以被排除在外。这是因为想要排除图片和视频元素,只能针对同一 z-index 值的图片和视频进行操作 。
为解决这个问题,我想到了一个办法。当高 z-index 的元素显示时,自动提升滤镜所在的 “楼层”,也就是提高滤镜的 z-index 值,确保滤镜始终处于所有网页元素的最上方,这样就能让所有元素都呈现暗色调了。当然,这样做可能会导致图片和视频也被暗色处理,不过考虑到一些弹出的网页元素显示时间不会太长,例如弹出菜单往往很快就会关闭,所以这在一定程度上是可以接受的 。
然而,很快又出现了新问题。由于 discuz 的网页并非只有单一的 z-index 值,以列表页为例,其中就存在高 z-index 值的元素,并且这些元素并非以弹窗形式显示,而是与其他元素一直并存。所以,在正常情况下,滤镜必须放置在 “一楼”,正如前面所说,如果不这样做,图片和视频就会被暗色处理。但同时又存在一些处于高楼层(高 z-index 值)的元素,所以,只能针对这些正常情况下处于高楼层的元素,通过 css 样式表动态地将它们改为暗色 。
看似问题得到了完美解决,但新问题又接踵而至。因为之前在有弹窗出现时,会抬高滤镜的楼层 z-index 值,而后续又通过 css 将高楼层元素改为暗色。此时,当再有弹窗出现并抬高滤镜楼层时,那些已经通过 css 修改样式的元素在滤镜作用下反而会变成亮色!!结果就是,每当弹窗显示和关闭时,整个页面就会出现剧烈闪烁,场面颇为 “壮观” 。
到最后,我几乎都快崩溃了。原本以为只是简单修改一下配色就能完成的任务,没想到竟演变成了一个棘手的大问题。这个功能最终还是采用了复杂的处理方式。毕竟之前那些看似可行的办法,都在实际操作过程中暴露出了各种各样的问题,为了保证夜间模式功能的正常使用和页面显示效果的稳定,只能选择更为复杂但相对可靠的处理方法。
结束语
很多时候,越是看似简单的任务,往往需要投入更多的时间和精力。现在,我特别害怕遇到那种一来就声称任务很简单的客户。我始终奉行这样一个原则:无论事情难易程度如何,都必须全力以赴去应对,因为意外情况总是会不期而至。
附上截图
评论0
暂时没有评论