【问题标题】:How to dynamically change themes after clicking a drop down menu of themes单击主题下拉菜单后如何动态更改主题
【发布时间】:2013-10-05 00:37:25
【问题描述】:

我正在使用引导程序作为我正在开发的网站的界面。我还计划将 bootswatch 主题集成到我的网站。我创建了一个下拉菜单,其中包含不同主题的 bootswatch。我的问题是当我点击下拉菜单中的主题之一时如何切换主题?

【问题讨论】:

    标签: twitter-bootstrap bootswatch


    【解决方案1】:

    你可以试试这样的

    html:

    <link href="/Themes/DefaultClean/Content/css/styles.css" id="theme-sheet" rel="stylesheet" type="text/css" />
    

    javascript:

    function setTheme(themeName) {
        $('#theme-sheet').attr({ href: "https://bootswatch.com/slate/bootstrap.min.css" });;
    }
    

    setTheme 函数的哪个位置将从您想要的来源(例如下拉菜单或按钮)调用。

    【讨论】:

      【解决方案2】:

      Fiddle:http://jsfiddle.net/82AsF/(单击导航栏中的主题下拉菜单)
      为您的链接提供 theme-link 类和主题名称的 data-theme 值,如下所示:

      <a href="#" data-theme="amelia" class="theme-link">Amelia</a>
      

      然后,像这样在全局变量中定义您的主题:

      var themes = {
          "default": "//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css",
          "amelia" : "//bootswatch.com/amelia/bootstrap.min.css",
          "cerulean" : "//bootswatch.com/cerulean/bootstrap.min.css",
          "cosmo" : "//bootswatch.com/cosmo/bootstrap.min.css",
          "cyborg" : "//bootswatch.com/cyborg/bootstrap.min.css",
          "flatly" : "//bootswatch.com/flatly/bootstrap.min.css",
          "journal" : "//bootswatch.com/journal/bootstrap.min.css",
          "readable" : "//bootswatch.com/readable/bootstrap.min.css",
          "simplex" : "//bootswatch.com/simplex/bootstrap.min.css",
          "slate" : "//bootswatch.com/slate/bootstrap.min.css",
          "spacelab" : "//bootswatch.com/spacelab/bootstrap.min.css",
          "united" : "//bootswatch.com/united/bootstrap.min.css"
      }
      

      (请在执行此操作时将这些 bootswatch css 文件托管在您自己的服务器上 - 我只是热链接,因为我手头没有服务器)
      然后,使用以下 jQuery 代码:

      $(function(){
         var themesheet = $('<link href="'+themes['default']+'" rel="stylesheet" />');
          themesheet.appendTo('head');
          $('.theme-link').click(function(){
             var themeurl = themes[$(this).attr('data-theme')]; 
              themesheet.attr('href',themeurl);
          });
      });
      

      【讨论】:

      • 您好,谢谢。我的问题是,即使用户尝试刷新页面,应用的主题是否仍然存在?似乎发生的事情是,当我刷新时,它会转到我设置的默认主题。?
      • @JoeneFloresca 您可以通过多种方式存储偏好数据,其中最简单的方式是使用cookie。如果您的用户有帐户,您还可以将他们的偏好存储在数据库中。
      【解决方案3】:

      我根据@KevinPei 的回答使用 jQuery、Bootstrap 和 Bootswatch 制作自动下拉菜单,向导航栏添加下拉菜单,自动将主题更新为所选值。

      小提琴: https://jsfiddle.net/davfive/uwseLLzf/show

      代码在实践中运行良好。但是,在 jsfiddle 中,有两个奇怪的行为:

      1. 有时下拉菜单会扩展到整个屏幕
      2. 下拉菜单的鼠标悬停/悬停颜色未在 jsfiddle 中显示。

      <html lang="en">
      <head>
          <!-- To switch themes, go to https://www.bootstrapcdn.com/bootswatch/?theme=0 -->
          <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.3.7/cerulean/bootstrap.min.css" rel="stylesheet">
          <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
          <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
      </head>
      <body>
      <div class="navbar navbar-default navbar-static-top">
        <div class="container-fluid">
          <a class="navbar-brand">Bootswatch Theme Changer</a>
          <div class="nav navbar-nav pull-right">
              <li id="theme-button" class="dropdown">
                <a href="#"  class="dropdown-toggle" data-toggle="dropdown">Change Theme <b class="caret"></b></a>
                <ul class="dropdown-menu ">
                  <li><a href="#" name="current">Cerulean</a></li>
                  <li class="divider"></li>
                  <li><a href="#" name="cerulean">Cerulean</a></li>
                  <li><a href="#" name="cosmo">Cosmo</a></li>
                  <li><a href="#" name="cyborg">Cyborg</a></li>
                  <li><a href="#" name="darkly">Darkly</a></li>
                  <li><a href="#" name="flatly">Flatly</a></li>
                  <li><a href="#" name="journal">Journal</a></li>
                  <li><a href="#" name="lumen">Lumen</a></li>
                  <li><a href="#" name="paper">Paper</a></li>
                  <li><a href="#" name="readable">Readable</a></li>
                  <li><a href="#" name="sandstone">Sandstone</a></li>
                  <li><a href="#" name="simplex">Simplex</a></li>
                  <li><a href="#" name="slate">Slate</a></li>
                  <li><a href="#" name="solar">Solar</a></li>
                  <li><a href="#" name="spacelab">Spacelab</a></li>
                  <li><a href="#" name="superhero">Superhero</a></li>
                  <li><a href="#" name="united">United</a></li>
                  <li><a href="#" name="yeti">Yeti</a></li>
                </ul>
              </li>
          </div>
        </div>
      </div>
      <script>
      jQuery(function($) {
        $('#theme-button ul a').click(function() {
          if ($(this).attr('name') != 'current') {
            var urlbeg = 'https://maxcdn.bootstrapcdn.com/bootswatch/3.3.7/'
            var urlend = '/bootstrap.min.css'
            var themeurl = urlbeg + $(this).text().toLowerCase() + urlend;
            var link = $('link[rel="stylesheet"][href$="/bootstrap.min.css"]').attr('href', themeurl);
      
            $('#theme-button ul a[name="current"]').text($(this).text());
          }
        });
      });
      </script>
      </body>
      </html>
      

      【讨论】:

      • 感谢您了解这一点,很抱歉您不得不这样做。我忘记在 中包含 bootstrap 和 jquery 的脚本链接。我已经对其进行了更新并测试了它是否可以在 jsfiddle 之外运行。
      【解决方案4】:

      如果刷新页面,上述解决方案的主要问题是主题消失了。 我发现这篇文章对浏览器中的持久主题很有帮助,因为它将设置保存在浏览器的存储中。

      希望对你有帮助

      http://wdtz.org/bootswatch-theme-selector.html

      【讨论】:

        【解决方案5】:

        Kevin 提供的解决方案很棒。我刚刚花了一些时间试图弄清楚如何使它与本地 bootswatch 库一起工作。

        典型的href属性值:

        "~/lib/bootstrap/dist/css/bootstrap.min.css"
        

        但在这种情况下:

                var themes = {
        
                "default": "lib/bootstrap/dist/css/bootstrap.min.css",
                "amelia": "lib/bootswatch/amelia/bootstrap.min.css",
                "cerulean": "lib/bootswatch/cerulean/bootstrap.min.css",
                "cosmo": "lib/bootswatch/cosmo/bootstrap.min.css",
                "cyborg": "lib/bootswatch/cyborg/bootstrap.min.css",
                "flatly": "lib/bootswatch/flatly/bootstrap.min.css",
                "journal": "lib/bootswatch/journal/bootstrap.min.css",
                "readable": "lib/bootswatch/readable/bootstrap.min.css",
                "simplex": "lib/bootswatch/simplex/bootstrap.min.css",
                "slate": "lib/bootswatch/slate/bootstrap.min.css",
                "spacelab": "lib/bootswatch/spacelab/bootstrap.min.css",
                "united": "lib/bootswatch/united/bootstrap.min.css"
            }
        

        【讨论】:

          【解决方案6】:

          感谢@davfive 和他的复制/粘贴一个文件示例。
          这是他升级到 bootswatch 4.5 和 jQuery 3.5 的示例:

          <html lang="en">
          <head>
              <meta charset="utf-8" />
              <!-- To switch themes, go to https://www.bootstrapcdn.com/bootswatch/?theme=0 -->
              <link href="https://maxcdn.bootstrapcdn.com/bootswatch/4.5.0/flatly/bootstrap.min.css" rel="stylesheet">
              <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
              <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script>
          </head>
          <body>
              <nav class="navbar navbar-expand-lg navbar-dark bg-primary">
                  <a class="navbar-brand" href="index.html"><img src="images/logos/Logo.png" alt="logo">MyWebSite Name </a>
                  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarColor01" aria-controls="navbarColor01" aria-expanded="false" aria-label="Toggle navigation">
                      <span class="navbar-toggler-icon"></span>
                  </button>
          
                  <div class="collapse navbar-collapse" id="navbarColor01">
                      <ul class="navbar-nav mr-auto">
                          <li class="nav-item active">
                              <a class="nav-link" href="index.html">home<span class="sr-only">(current)</span></a>
                          </li>
                          <li id="theme-button" class="dropdown">
                              <a href="#"  class="dropdown-toggle nav-link" data-toggle="dropdown">Change Theme <b class="caret"></b></a>
                              <ul class="dropdown-menu ">
                                  <li><a href="#" name="current">Flatly</a></li>
                                  <li class="divider"></li>
                                  <li><a href="#" name="flatly">Flatly</a></li>
                                  <li><a href="#" name="superhero">Superhero</a></li>
                                  <li><a href="#" name="united">United</a></li>
                              </ul>
                          </li>
                      </ul>
                  </div>
              </nav>
          <script>
          jQuery(function($) {
            $('#theme-button ul a').click(function() {
              if ($(this).attr('name') != 'current') {
                var urlbeg = 'https://maxcdn.bootstrapcdn.com/bootswatch/4.5.0/'
                var urlend = '/bootstrap.min.css'
                var themeurl = urlbeg + $(this).text().toLowerCase() + urlend;
                var link = $('link[rel="stylesheet"][href$="/bootstrap.min.css"]').attr('href', themeurl);
          
                $('#theme-button ul a[name="current"]').text($(this).text());
              }
            });
          });
          </script>
          </body>
          </html>
          

          我还添加了 home 菜单链接并删除了很多主题。当然,您可以添加/更改一些。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-05-12
            • 2014-07-05
            • 2017-07-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-12-18
            相关资源
            最近更新 更多