关于组织自定义皮肤/主题的一点思考

写这篇随笔的动机是之前实习的时候出了自定义皮肤的需求,但是由于整个项目一开始前端基础就没打好,导致很多地方根本无法由前端程序猿控制,最后需要后端进行大量的重复劳动。在实习期间通勤的时候我一直在看Pro CSS for High Traffic Websites,结合里面的经验加上自己的思考就有了这篇随笔。



在前端开发中,标题栏、按钮、图标等元素经常需要使用图片来展现样式,并且这些东西常常会有类似自定义皮肤或者随季节性新主题更换的需求。如果使用HTML的img标签来插入它们,在遇到需要更改皮肤或主题的时候就要“伤筋动骨”,修改HTML里的大量img标签,这通常就需要后端修改相当多的代码。

实际上,这些图片应当属于“样式”,而不属于“内容”,因此不应该以img的形式出现在HTML里。这时候更好的做法是用语义化的HTML元素为它们留下空位,使用CSS的背景来添加图片。如果需求变动的时候,更换CSS,或者利用CSS的优先级覆盖掉默认样式即可。

在使用img的时候,可以用alt来保证accessibility,但是如果使用CSS添加图片,还要加上给屏幕阅读器或者爬虫留下提示性文字的话,一般的做法是在用于添加背景的HTML元素里留下文字,并且使用CSS将这些文字从页面上隐藏,如:

.hide-text {
    text-indent: -9999px;
}

这样做还有一个好处,当用户网络出现问题,无法加载CSS,但是依然想使用网站的基础功能时,这些留下的文字可以替代背景图片作为指引。

注意:如果想要通过设置 text-indent 来隐藏文字,包含文字的元素的 display 应为 inline-block 或者 block。如果是 inline 则无法生效。此外还需要用CSS预留下图片的宽和高,因为 text-indent 之后,这个元素就几乎没有大小了。

一种简洁有效的做法是在需要使用新主题时,为<body>加上新的类名,然后在默认CSS代码中涉及更改的部分的基础上,创建新的覆盖样式。举例来说,假如需要创建圣诞主题,先为body加上类名(如果后端使用了可嵌套的HTML模版,通常来说这里只要修改一处):

<body class="xmas"></body>

如果为一个模块的小标题使用了img标签显示,那么原来可能是这样的

<div class="popular-title">
    <img alt="Popular" src="/some/path/popular.png">
</div>

重新组织一下,应该是

<h3 class="popular-title hide-text">Popular</h3>

然后利用CSS加上背景并隐藏文字

.popular-title {
    background: url(/some/path/popular.png) no-repeat left top;
    height: 100px;
    width: 330px;
}

.hide-text {
    text-indent: -9999px;
}

那么,到了圣诞节的时候,需要更换主题,只需要在主题用的CSS里加上:

.xmas .popular-title {
    background: url(/some/path/popular-xmas.png) no-repeat left top;
}

用原来的选择器加上之前为新主题添加的body的类名,就可以获得更高的优先级,覆盖默认的样式。

后端在修改的时候,也只需要加入一个新的link。原来可能在head里引入的CSS是

<link rel="stylesheet" type="text/css" href="/some/path/index.css">

那么只需要加多一句,变成

<link rel="stylesheet" type="text/css" href="/some/path/index.css">
<link rel="stylesheet" type="text/css" href="/some/path/index-xmas.css">

即可。同样地,如果后端使用了可嵌套的HTML模版,通常也只需要修改一处。这样一来,就能减少不少重复劳动和重复代码。

时间: 2024-11-10 00:11:31

关于组织自定义皮肤/主题的一点思考的相关文章

关于Emit中动态类型TypeBuilder创建类标记的一点思考

  利用TypeBuilder是可以动态创建一个类型,现在有个需求,动态生成一个dll,创建类型EmployeeEx,需要继承原dll里面的Employee类,并包含Employee类上的所有类标记.   网上有很多例子, //创建TypeBuilder. TypeBuilder myTypeBuilder = myModBuilder.DefineType(typeName, TypeAttributes.Public); myTypeBuilder.SetParent(type);   大概

关于模板方法和策略模式的一点思考

该随笔的思想原点,应该算是在两三年前了.当时和一前同事聊天.不知怎得就聊到了Http访问. 一.我记得他和我说过的第一句话,大概是:有没有已经封装好的.比较强大的HttpUtil.也可能是受业务的影响(接口对内).我当时接触到的Http访问,大多比较“规范”,至少有一个接口约束在约定着某些东西,不至于一会传递json,返回json, 一会又要传递xml,返回xml,甚至更奇葩的是,上传个文件.返回0或者1.如果真出现这样的状态,HttpUtil依然能够方便.灵活的适应着各种情况.我想这个Util

周志华:关于机器学习的一点思考

https://mp.weixin.qq.com/s/sEZM_o5D6AhyMgvocbsFhw 演讲:周志华 整理:肖琴.闻菲 [新智元导读]机器学习如今大获成功的原因有哪些?如何才能取得进一步的突破?南京大学周志华教授在AI WORLD 2018大会上分享他关于机器学习的一点思考:我们需要设计新的.神经网络以外的深度模型:让智能体在弱监督条件下也能够学习,以及考虑开放动态任务环境下的学习. 播放 震撼!AI WORLD 2018世界人工智能峰会开场视频 南京大学计算机系主任.人工智能学院院

关于后台系统自动生成的一点思考

大量实践发现后台管理程序,其实90%的代码都是相同的,当然是在抛弃复杂逻辑业务的情况下,那么如何能高效的节约这些时间呢,那就是接下来我要说的,对于后台系统自动生成的一些思考. 适用情景: 1.表编号id为自增(基于现在大部分表编号都是自增的情况): 2.没有太复杂业务关联关系,比如表的某一个字段,存储了一个json对象,为了平衡后台用户使用,需要友好的分段展示给用户的定制ui界面:还比如表中存储了外键的多个id,但为了方便用户使用,只能已标签name的方式,给用户展示,等等这些超强业务黏合逻辑的

关于前端的一点思考

关于前端的一点思考 Author:tkorays 最近写前端代码,写着写着就突然开始惆怅.忧伤.愤怒.发狂,我TMD到底在干什么啊! 很多东西写了n遍了,但是还是在不停地写着.自己写过的代码也不想再修改完善.重新利用,只是觉得,可能重新写一遍可能要好点.面对这很多库以及框架,虽然喜爱,但是也是有所顾忌,我只要使用其中的一个功能,根本不需要引入这么大的整个库. 事实上,我们可能在动手写任何代码之前,先要思考下,我们到底要的是什么! 0x00 界面真的需要这么炫酷么 在使用某个界面库之前,我们可能先

自定义ExtJS主题

ExtJS提供的可以使用的主题包对于创建一个干净专业的程序来说已经很有创意了,然而,你可能还是会希望提供自己的一种设计方式或现在存在的企业设计方式. 从历史上来说,给程序美化就是指的给html标签提供渲染组件的规则,但是这样做也会有一些弊端出现.首先,你需要负担的是各种支持的浏览器.其次,随着框架的成熟,很多不愉快就会产生,比如你的规则风格的变化需要追逐潜在元素的改变.通过ExtJS提供的API就可以很好的解决这些问题. 通过theming API创建的主题可以在任何ExtJS程序中共享.这就运

WPF九宫格图片自定义皮肤(新博速读2.0)

一直想要做成有搜狗输入法.QQ输入法那样的可以自定义皮肤的软件.找了很久终于找到了,不过找到的解决方案有些问题,经过修改之后就可以按照图片原本的大小显示啦~ 在我两个晚上的研究下,研究好几种方法,最后在网上找到了一个好方法,但是有些问题,我修改了下,终于实现新版新博速读的皮肤功能啦. 软件官网:http://leaful.com/weibopopup public class NineGridsBorder : Border // 九宫格Border { public BitmapImage B

关于失败的一点思考

睡觉之前突然想到马云说过的一句话:我们要习惯于拒绝,习惯失败,如果我们还没成功,那是因为我们的失败还不够 --------2016.4,11  以此自勉 关于失败的一点思考

有关盒模型的一点思考

有关盒模型的一点思考 盒子模型是css中一个重要的概念,理解了盒子模型才能更好的排版. 其实盒子模型有两种,分别是标准 w3c 盒子模型和 IE 盒子模型. 他们对盒子模型的解释各不相同,先来看看我们熟知的标准盒子模型: 一.w3c盒子模型 看下面的图,根据色块,右外倒内,分别代表margin.border.padding.content(即网页内容部分) 二.IE盒子模型 与w3c盒子模型的组成部分类似,IE盒子模型也包括上图几个部分 但是不同的是,IE盒子模型把border和padding归