hybird之web动态换肤实现

前言

最近在重构个hybird(原生的壳包着Web页面)的UI框架,进行到了做换肤功能的阶段,所以这里是我思考的解决的方法。

预想

目前实现换肤的功能无非就两种做法。

1.写几个皮肤文件,然后切换使用这几个文件达到换肤的目的。

不得不说这是最常见的方式,效果也比较明显,但是它有几个缺点。

缺点:

1.如果更改一个皮肤的内容,那其他的皮肤文件也要做相应修改(这挺麻烦,不过可以用less管理css解决,所以也不是什么大问题)。

2.它是固定的,在使用的时候皮肤文件已经是写好的了,而当我需要动态设置一些属性的时候就无可奈何了。

2.使用less这种工具,在页面加载时才动态生成皮肤样式。

但这种方式的缺点却很明显。

缺点:

1.效率低,为了一个换肤的功能,却要引一个less工具(压缩后大概126KB),在终端Web是无法忍受的。

2.速度慢,因为有一个皮肤文件编译(姑且把它叫做编译)生成的过程,在终端也难以接受(有可能还出现页面皮肤闪),如果更换皮肤又要重新编译。

考虑

鉴于上面两种方法的缺点,一种无法动态,另一种效率低。

所以上面两种方法没办法使用,只能思考另外的方法了,于是就分析哪些是hybird 页面需要换肤的元素

有几个需要换肤的元素:

1.导航栏

2.底部栏

3.默认图标

而又寻找需要设置的属性:

1.背景色

2.字体颜色

3....(主要是这两个)

根据上面的两个东西,我发现没必要把页面换肤想成那么复杂一件事,不是需要用什么工具或切换css文件。是不是可以获取需要动态设置的属性,然后然后设置到需要换肤的元素就可以了(就是这个简单想法)。

PS:有人会说皮肤怎么会需要动态生成。我只能说有可能某些皮肤属性是页面启动时才知道,又或者支持自定义皮肤的。

实现

说干就干,实现起来代码很少,就直接贴出来给大家看看。

ui.Skin = (function(){

     var skinTagId = "BINGOTOUCH-SKIN", TEMPLATE = {
          BGCOLOR : "@selector { background-color : @BGCOLOR !important; }",
          COLOR : "@selector { color : @COLOR !important; }"
     }    

     var init = function (options){
         var settings = {
              changeColorSelector : [ ".header", ".footer"],
              color : "#FFFFFF",
              changeBgColorSelector : [ ".header", ".footer"],
              bgColor : "#278cca",
              appendElement : "head"
          }

          $.extend(settings,options);
          $("#" + skinTagId).remove();

          var html = "<style id='" + skinTagId + "'>";
              html += _createCss(settings.changeColorSelector, "COLOR", settings.color);
              html += _createCss(settings.changeBgColorSelector, "BGCOLOR", settings.bgColor);
              html += "<style>";
          $(settings.appendElement).append(html);
     }

     var _createCss = function(changeSelectors, colorType, color){
         var html = "";
           $.each(changeSelectors ,function(i, selector) {
             html += TEMPLATE[colorType].replace("@selector", selector).replace("@" + colorType, color);
        });
           return html;
     }

     return {
         init : init
     }

})();

代码很简单,看看就明白

总结

我的实现方法很简单,当然所能更换的内容也较少且固定,但这对hybird应用的换肤已经是够的了。既能动态换肤,而且效率是不错的。

——技术只是技术,工具只是工具,不能为用而用。

(本篇完)

转载:http://www.cnblogs.com/lovesong/p/4122262.html

时间: 2024-12-22 15:32:49

hybird之web动态换肤实现的相关文章

duilib入门之贴图描述、类html文本描述、动态换肤、Dll插件、资源打包

转载自duilib入门文档 贴图描述:          Duilib的表现力丰富很大程度上得益于贴图描述的简单强大.Duilib的贴图描述分为简单模式和复杂模式两种.          简单模式使用文件名做为贴图描述内容,在这种方式下,此图片将会以拉伸方式铺满控件.          复杂模式使用带属性的字符串表示贴图方式,既支持从文件中加载图片,也可以从资源中加载,具体如下:          如果是从文件加载,设置file属性,如file='XXX.png',不要写res和restype属

使用jQuery实现Web页面换肤功能的要点解析_jquery

网页换肤是一门老技术了,老的现在都不怎么流行了.但是,有时候有些客户就是想要这个换肤功能.于是就实践做了一下网页换肤,结果遇到了很多问题. 网页换肤的基本原理 基本原理很简单,就是使用 JS 切换对应的 CSS 样式表.例如导航网站 Hao123 的右上方就有网页换肤功能.除了切换 CSS 样式表文件之外,通常的网页换肤还需要通过 Cookie 来记录用户之前更换过的皮肤,这样下次用户访问的时候,就可以自动使用上次用户配置的选项. 那么基本工作流程就出来了:访问网页--JS 读取 Cookie

android换肤功能 如何动态获取控件中背景图片的资源id?_Android

这个是在在做一个换肤功能时遇到的问题.   对于换肤,网上都有示例,可以从别的皮肤安装包中读取所要的资源,前提是你必须先持有这个资源的引用名称,像R.drawable.background(喂,这不是废话嘛).这个换肤的方案原理就是,自身应用的资源名称是R.drawable.background,那皮肤包中应该也是这个名称,然后通过这个名称获取该资源在皮肤包中的具体id,代码: //先获取本地资源引用名称,type name是R.drawable.background中的"drawable&qu

如何对BCGControlBarPro进行换肤

效果图 图一 我们知道使用VC开发大型的应用系统时,都会碰到一个界面设计和风格布局的问题.如果一切都重头开始设计和编写的话,将会是巨大的工作量.在短时间内很难写出一个比较健壮功能强大的界面系统出来.对软件项目进度也带来了不可预测的风险.在这种形势下BCG库就应运而生了.目前BCG可以做出诸如Visual Studio .Net 2003 ,Outlook等大型界面系统.几乎可以满足目前市场上绝大多数管理信息系统的界面要求.在我所看到的很多ERP,GSP等的MIS软件公司,都在采用BCG系统.该库

vs2008-VS2008MFC建立对话框,利用Skin++换肤不同步

问题描述 VS2008MFC建立对话框,利用Skin++换肤不同步 利用Skin++对对话框进行动态换肤,界面大部分都改变,但是按钮等其他控件没有改变,只有当鼠标光标移动到按钮控件上面时,按钮控件才能发生对应皮肤的改变 解决方案 重画窗口中所有控件,首先获取所有按钮句柄,然后调用: InvalidateRgn(hwnd,NULL,TRUE);//按钮窗口DC立即失效 UpdateWindow(hwnd);//立即响应WM_PAINT重画窗口 解决方案二: Skin++,没有用过 是不是对应按键没

WPF换肤设计原理浅析_C#教程

WPF换肤的设计原理,利用资源字典为每种皮肤资源添加不同的样式,在后台切换皮肤资源文件. 截图 上图中,第一张图采用规则样式,第二张图采用不规则样式,截图的时候略有瑕疵. 资源字典 规则样式资源Skin.RegularStyle.xaml <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microso

采用XHTML和CSS设计可重用可换肤的WEB站点

css|web|xhtml|设计|站点 随着XHTML的逐渐推广流行,HTML 在许多场合已经显得过时.World Wide Web Consortium (W3C) 于 2000 年 6 月 26 日发布了 XHTML 的第一个版本作为推荐标准.XHTML 标准的目标是取代 html.按照 W3C 的说法,"XHTML 是 html 的继承者"(http://www.w3.org/MarkUp/).   XHTML具有两大目标:  在文档结构和表示形式之间创建更明显的分离. 将 ht

动态CSS,换肤技术

css|动态 常见的例子就是:一个站点上有多个页面样式提供浏览者选择. 同时,在选择了某样式后,再次打开该页面时,将仍然保持该样式. 自然会想到了Cookie技术 下面是HTML代码部分(另外再加需要的CSS文件就可以使用了): <HTML> <HEAD> <link ID="skin" rel="stylesheet" type="text/css"> <TITLE>换肤技术</TITLE&

采用XHTML和CSS设计可重用可换肤的WEB站点的方法第1/4页_经验交流

XHTML 标准的目标是取代 html.按照 W3C 的说法,"XHTML 是 html 的继承者"(http://www.w3.org/MarkUp/). XHTML具有两大目标: 在文档结构和表示形式之间创建更明显的分离. 将 html 重新表示为 XML 的应用程序. 使用XHTML标准的好处是:只需设计页面一次,即可让该页以完全相同的方式在任何现代的浏览器中显示和工作.例如,在按照标准生成以后,页面在Internet Explorer.Mozilla Firefox.Netsc