1

我正在创建一个应该有多个主题的纯 html(无服务器端代码)网站,

其中用户可以选择/更改主题以查看网站。

您能否提出一些有关如何执行此操作的概念,或者至少为我指出一些有用的文章。

提前谢谢你的帮助。

4

5 回答 5

3

最常见的方法是使用不同的外部 CSS 样式表,这些样式表将根据所选主题进行切换。您还需要明智地构建 DOM,以允许主题提供不同的布局。

于 2012-04-19T10:48:40.660 回答
1

可能有点矫枉过正......但这是我使用 Google Font API 和我不久前编写的Document Fragment Builder脚本提出的字体选择器示例。

var FragBuilder = (function() {
    var applyStyles = function(element, style_object) {
        for (var prop in style_object) {
            element.style[prop] = style_object[prop];
        }
    };
    var generateFragmentFromJSON = function(json) {
        var tree = document.createDocumentFragment();
        json.forEach(function(obj) {
            if (!('tagName' in obj) && 'textContent' in obj) {
                tree.appendChild(document.createTextNode(obj['textContent']));
            } else if ('tagName' in obj) {
                var el = document.createElement(obj.tagName);
                delete obj.tagName;
                for (part in obj) {
                    var val = obj[part];
                    switch (part) {
                    case ('textContent'):
                        el.appendChild(document.createTextNode(val));
                        break;
                    case ('style'):
                        applyStyles(el, val);
                        break;
                    case ('childNodes'):
                        el.appendChild(generateFragmentFromJSON(val));
                        break;
                    default:
                        if (part in el) {
                            el[part] = val;
                        }
                        break;
                    }
                }
                tree.appendChild(el);
            } else {
                throw "Error: Malformed JSON Fragment";
            }
        });
        return tree;
    };
    var generateFragmentFromString = function(HTMLstring) {
        var div = document.createElement("div"),
            tree = document.createDocumentFragment();
        div.innerHTML = HTMLstring;
        while (div.hasChildNodes()) {
            tree.appendChild(div.firstChild);
        }
        return tree;
    };
    return function(fragment) {
        if (typeof fragment === 'string') {
            return generateFragmentFromString(fragment);
        } else {
            return generateFragmentFromJSON(fragment);
        }
    };
}());

function jsonp(url) {
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = url;
    document.getElementsByTagName('body')[0].appendChild(script);
}

function replacestyle(url) {
    if (!document.getElementById('style_tag')) {
        var style_tag = document.createElement('link');
        style_tag.rel = 'stylesheet';
        style_tag.id = 'style_tag';
        style_tag.type = 'text/css';
        document.getElementsByTagName('head')[0].appendChild(style_tag);
        replacestyle(url);
    }
    document.getElementById('style_tag').href = url;
}

function loadFonts(json) {
    var select_frag = [
        {
        'tagName': 'select',
        'id': 'font-selection',
        'childNodes': [
            {
            'tagName': 'option',
            'value': 'default',
            'textContent': 'Default'}
        ]}
    ];
    json['items'].forEach(function(item) {
        var family_name = item.family,
            value = family_name.replace(/ /g, '+');

        if (item.variants.length > 0) {
            item.variants.forEach(function(variant) {
                value += ':' + variant;
            });
        }

        select_frag[0].childNodes.push({
            'tagName': 'option',
            'value': value,
            'textContent': family_name
        });
    });

    document.getElementById('container').appendChild(FragBuilder(select_frag));
    document.getElementById('font-selection').onchange = function(e) {
        var font = this.options[this.selectedIndex].value,
            name = this.options[this.selectedIndex].textContent;
        if (font === 'default') {
            document.getElementById('sink').style.fontFamily = 'inherit';
        } else {
            document.getElementById('sink').style.fontFamily = name;
            replacestyle('https://fonts.googleapis.com/css?family=' + font);
        }
    };
}

jsonp("https://www.googleapis.com/webfonts/v1/webfonts?key=AIzaSyDBzzPRqWl2eU_pBMDr_8mo1TbJgDkgst4&sort=trending&callback=loadFonts");​

这是厨房水槽示例...

于 2012-04-19T13:03:59.310 回答
0

您可以使用 jQuery 样式切换器。查看下面的链接,其中还包含有关如何操作的分步教程:

http://www.net-kit.com/10-practical-jquery-style-switchers/

这里还有一篇关于如何做到这一点的文章:

http://net.tutsplus.com/tutorials/javascript-ajax/jquery-style-switcher/

于 2012-04-19T10:52:22.737 回答
0

Cudos 已经回答了这个问题,但无论如何我都会发布这个。

您可以修改 Cudos 发布的本教程 (http://net.tutsplus.com/tutorials/javascript-ajax/jquery-style-switcher/),使其仅包含对index.php文件进行这些修改的客户端代码。

删除 PHP 块并添加此功能。

<script language="javascript" type="text/javascript">
  function readCookie(name) {
  var nameEQ = name + "=";
  var ca = document.cookie.split(';');

  for(var i=0;i < ca.length;i++) {
    var c = ca[i];
    while (c.charAt(0)==' ') c = c.substring(1,c.length);
    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
  }
 return null;
}

var js_style = readCookie(style);
</script>

并用这个替换 PHP 样式切换器。

<script language="javascript" type="text/javascript">
  if (typeof js_style == 'undefined') { js_style = 'day'; }
  document.write('<link id="stylesheet" type="text/css" href="css/' + js_style + '.css" rel="stylesheet" />');
</script>

为我工作...

于 2012-04-19T11:39:17.830 回答
0

正如 Alexander Pavlov 在他的回答中所写,使用不同的外部样式表。为了使用户能够持久地选择一个主题(即,当移动到站点的另一个页面或第二天返回站点时保留该主题),请使用 HTTP cookie 或 HTML5 样式的 localStorage。它们允许您将信息本地存储在用户的计算机中,而无需任何服务器端代码。

关于 localStorage(也称为 HTML 存储或 Web 存储)的教程很多,很难找到任何特定的。它们比 cookie 更灵活,可以用来存储大量数据,甚至是用户定制的样式表。localStorage 的主要问题是缺乏对 IE 7 及更早版本的支持。您可能会认为使用它们的人不会获得可定制性。或者,您可以使用 cookier、userData (IE)、dojox.storage 或其他工具在古董浏览器上模拟 localStorage。

于 2012-04-19T12:52:04.630 回答