如何动态更改网页所选菜单项的颜色?

Posted

技术标签:

【中文标题】如何动态更改网页所选菜单项的颜色?【英文标题】:How to dynamically change the color of the selected menu item of a web page? 【发布时间】:2011-06-04 21:48:56 【问题描述】:

我是开发网页的新手。我希望创建类似于 ***.com 中的菜单(如上面显示的问题、标签、用户)。如何更改所选菜单的颜色(例如,“单击”时,问题的背景颜色变为橙色)?

我已经设法在悬停时更改颜色(使用 CSS),因为这很简单,但我遇到了麻烦。

我可以实现只使用 CSS 改变点击项颜色的效果吗?

【问题讨论】:

我认为人们有 %20 的机会会回答。 (尝试批准您的其他问题的答案,以提高您将来回答问题的机会。) 好吧,我不知道这个事实。我总是为我的答案投票。谢谢你告诉我。 【参考方案1】:

设置类活动和悬停的样式:


你需要在服务器端激活 li。 所以在绘制菜单的时候,应该知道加载了哪个页面,并设置为:

 <li class="active">Question</li>
 <li>Tags</li>
 <li>Users</li>

但是如果你在不重新加载的情况下改变内容,你不能改变设置服务器上的活动li元素,你需要使用javascript

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
<style>
  .menuwidth: 300px; height: 25; font-size: 18px;
  .menu lilist-style: none; float: left; margin-right: 4px; padding: 5px;
  .menu li:hover, .menu li.active 
        background-color: #f90;
    
</style>
</head>
<body>

<ul class="menu">
<li>Item 1</li>
<li class="active">Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
<li>Item 6</li>
</ul>

<script type="text/javascript">

var make_button_active = function()

  //Get item siblings
  var siblings =($(this).siblings());

  //Remove active class on all buttons
  siblings.each(function (index)
    
      $(this).removeClass('active');
    
  )


  //Add the clicked button class
  $(this).addClass('active');


//Attach events to menu
$(document).ready(
  function()
  
    $(".menu li").click(make_button_active);
    
)

</script>
</body>

</html>

【讨论】:

感谢安泽的建议。我正在为静态页面做这件事。你能建议我如何使用 javascript 来做吗? 你在使用任何 javascript 框架吗?喜欢 jQuery 或 MooTools? 不。你建议我使用它们吗?如果是这样,哪个更容易学习?哪个更好? 好吧,我们可以为此开战。大多数人使用 jQuery,很快就知道有一个巨大的已编写插件存储库。另一方面,我更喜欢 MooTools,我已经为 MooTools 编写了很多更大的插件,所以这就是我喜欢它的原因。如果您是新手,您可能应该使用 jQuery,因为社区更大。 是的,如果你想快速而敏捷地完成工作,你应该使用 js 框架。如果你想学习 js 的基础知识,有时会被它伤害(例如尝试拖放),那么你应该学习如何在没有任何框架的情况下编写 js,而不是开始使用框架。【参考方案2】:

使用 JavaScript 实现这一点可能是最简单的......这是一个演示的 JQuery 脚本......正如其他人提到的......我们有一个名为“活动”的类来指示活动选项卡 - 而不是伪类“:活动。”我们可以很容易地将它命名为……选定的、当前的等等。

/* CSS */

#nav  width:480px;margin:1em auto;

#nav ul margin:1em auto; padding:0; font:1em "Arial Black",sans-serif; 

#nav ul lidisplay:inline; 

#nav ul li atext-decoration:none; margin:0; padding:.25em 25px; background:#666; color:#ffffff; 

#nav ul li a:hoverbackground:#ff9900; color:#ffffff; 

#nav ul li a.active background:#ff9900; color:#ffffff; 

/* JQuery Example */

<script type="text/javascript">
$(function ()

    $('#nav ul li a').each(function()
        var path = window.location.href;
        var current = path.substring(path.lastIndexOf('/')+1);
        var url = $(this).attr('href');

        if(url == current)
            $(this).addClass('active');
        ;
    );         
);

</script>

 /* HTML */

<div id="nav" >
    <ul>
        <li><a href='index.php?1'>One</a></li>
        <li><a href='index.php?2'>Two</a></li>
        <li><a href='index.php?3'>Three</a></li>
        <li><a href='index.php?4'>Four</a></li>
    </ul>
</div>

【讨论】:

我想我必须在我想要菜单的每个页面中复制您的代码。我的页面有点不同。换句话说,这是我的问题。如果我不清楚,请告诉我。基本上我有一个 3 帧的 html 页面。第 1 帧有菜单项,第 2 帧是标题,第 3 帧是第 1 帧中所选链接的内容加载位置。这是我的问题,我只需要更改第 1 帧中所选项目的颜色。 请不要介意我之前的评论。这是我在执行上面的代码后的推断。我观察到所选菜单项的颜色在单击时会发生变化(并且链接会在新窗口中打开),但是当我返回包含菜单的页面时,所选菜单项会立即失去其更改的颜色。我希望当前菜单项仅在单击另一个菜单项时返回其原始颜色。你能为这个效果推荐一些东西吗? 我在这里使用的代码实际上是将活动类添加到当前 url,如果它是在链接的 href 属性中定义的......而不是在点击事件上......基本上它是什么说是......“如果网址与链接匹配,则将活动类添加到锚元素”至于在新窗口中打开......我不确定你在那里发生了什么...... 对不起,gravedig(?),但我想指出,如果您在索引中(并且未显示基本名称),则此代码将不起作用。我通过从服务器获取当前 URL 并将其告知客户端来解决此问题。【参考方案3】:

这个问题我迟到了,但这真的超级简单。您只需在 css 文件中定义多个选项卡类,然后在创建 LI 标记时将所需选项卡作为类加载到 php 文件中。

这是一个完全在服务器上执行的示例:

CSS

html ul.tabs li.activeTab1, html ul.tabs li.activeTab1 a:hover, html ul.tabs li.activeTab1 a   
    background: #0076B5;
    color: white;
    border-bottom: 1px solid #0076B5;


html ul.tabs li.activeTab2, html ul.tabs li.activeTab2 a:hover, html ul.tabs li.activeTab2 a 
    background: #008C5D;
    color: white;
    border-bottom: 1px solid #008C5D;

PHP

<ul class="tabs">
    <li <?php print 'class="activeTab1"' ?>>
        <a href="<?php print 'Tab1.php';?>">Tab 1</a>
    </li>

    <li <?php print 'class="activeTab2"' ?>>
        <a href="<?php print 'Tab2.php';?>">Tab 2</a>
    </li>
</ul>

【讨论】:

【参考方案4】:

假设你想改变当前选择的链接/标签的颜色...你最好的办法是应用一个类(比如active)到当前选择的链接/标签然后设置不同的样式。

示例样式可以是:

li.active, a.active 
  background-color: #f90;

【讨论】:

使用 active 仅有助于在单击并按住链接时在几分之一秒内改变颜色。我正在寻找一些技巧来使菜单项保持其更改的颜色,直到单击另一个菜单项。 @Jeeka 不是 :active 伪类。只是一个值为active 的普通类。 @melhoseiny:你是否建议在我的 CSS li.active, a.active background-color: #f90; 中有这样的类,我将类分配给菜单的类我的html文件中有这样的项目吗? 问题 但这不会动态改变背景颜色。所以,当我点击一个菜单项时,它会改变背景颜色,并且该颜色将永远保持,对吧?【参考方案5】:

我使用 PHP 查找 URL 并匹配页面名称(没有 .php 的扩展名,我也可以添加多个具有相同单词的页面,例如联系人、联系人表单等。所有页面都会添加该类) 并使用 PHP 添加一个类来更改颜色等。 为此,您必须使用文件扩展名 .php 保存您的页面。

这是一个演示。根据需要更改您的链接和页面。所有链接的 CSS 类是 .tab,对于活动链接,还有另一个类 .currentpage(与 PHP 函数一样),因此您将在其中覆盖您的 CSS 规则。 你可以随意命名它们。

<?php # Using REQUEST_URI
    $currentpage = $_SERVER['REQUEST_URI'];?>
    <div class="nav">
        <div class="tab
             <?php
                 if(preg_match("/index/i", $currentpage)||($currentpage=="/"))
                     echo " currentpage";
             ?>"><a href="index.php">Home</a>
         </div>
         <div class="tab
             <?php
                 if(preg_match("/services/i", $currentpage))
                     echo " currentpage";
             ?>"><a href="services.php">Services</a>
         </div>
         <div class="tab
             <?php
                 if(preg_match("/about/i", $currentpage))
                     echo " currentpage";
             ?>"><a href="about.php">About</a>
         </div>
         <div class="tab
             <?php
                 if(preg_match("/contact/i", $currentpage))
                     echo " currentpage";
             ?>"><a href="contact.php">Contact</a>
         </div>
     </div> <!--nav-->

【讨论】:

【参考方案6】:

试试这个。它保持颜色,直到单击另一个项目。

<style type="text/css">

.activeElem
 background-color:lightblue
       
.desactiveElem
 background-color:none
       



</style>

<script type="text/javascript">
var activeElemId;
function activateItem(elemId) 
 document.getElementById(elemId).className="activeElem";
 if(null!=activeElemId) 
   document.getElementById(activeElemId).className="desactiveElem";
 
 activeElemId=elemId;


</script>

<li id="aaa"><a href="#" onclick="javascript:activateItem('aaa');">AAA</a>
<li id="bbb"><a href="#" onClick="javascript:activateItem('bbb');">BBB</a>
<li id="ccc"><a href="#" onClick="javascript:activateItem('ccc');">CCC</a>

【讨论】:

【参考方案7】:

我目前正在使用一个纯 CSS 解决方案。

添加标识您的页面和菜单项的正文 ID(或类),然后使用以下内容:

HTML:

<html>
    <body id="body_questions">
        <ul class="menu">
            <li id="questions">Question</li>
            <li id="tags">Tags</li>
            <li id="users">Users</li>
        </ul>
        ...
    </body>
</html>

CSS:

.menu li:hover,
#body_questions #questions,
#body_tags      #tags,
#body_users     #users 
    background-color: #f90;

【讨论】:

感谢您的帮助。我对这个实现有疑问。我是否必须在每个页面中都有我的菜单(问题、标签、用户)。在这种情况下,有 3 个 html 文件,即 questions.html、tags.html 和 users.html ?所有这些 html 文件都应该有上面的代码(具有不同的 body id/class)吗? 如果你可以使用像php这样的页面处理器,你可以将你的菜单代码发布在一个单独的文件中,并包含在每个页面中。如果没有,您将需要在任何地方重复它。但是在这两种情况下,是的,您必须只更改每个页面的正文 ID/类,所有页面的菜单片段都是相同的。 (对不起我的英语)【参考方案8】:

在您的所有帮助和帖子Change a link style onclick 下,我终于实现了我的目标。这是代码。我使用 JavaScript 来做这件事。

<html>
    <head>
        <style type="text/css">
            .item 
                width:900px;
                padding:0;
                margin:0;
                list-style-type:none;
            

            a 
                display:block;
                width:60;
                line-height:25px; /*24px*/
                border-bottom:1px  none #808080;
                font-family:'arial narrow',sans-serif;
                color:#00F;
                text-align:center;
                text-decoration:none;
                background:#CCC;
                border-radius: 5px;
                -webkit-border-radius: 5px;
                -moz-border-radius: 5px;
                margin-bottom:0em;
                padding: 0px;
            

            a.item 
                float:left;        /* For horizontal left to right display. */
                width:145px;       /* For maintaining equal  */
                margin-right: 5px; /* space between two boxes. */
            

            a.selected
                background:orange;
                color:white;
            
        </style>
    </head>
    <body>
        <a class="item" href="#" >item 1</a>
        <a class="item" href="#" >item 2</a>
        <a class="item" href="#" >item 3</a>
        <a class="item" href="#" >item 4</a>
        <a class="item" href="#" >item 5</a>
        <a class="item" href="#" >item 6</a>

        <script>
            var anchorArr=document.getElementsByTagName("a");
            var prevA="";
            for(var i=0;i<anchorArr.length;i++)
            
                anchorArr[i].onclick = function()
                    if(prevA!="" && prevA!=this)
                    
                        prevA.className="item";
                    
                    this.className="item selected";
                    prevA=this;
                
            
        </script>
    </body>
</html>

【讨论】:

以上是关于如何动态更改网页所选菜单项的颜色?的主要内容,如果未能解决你的问题,请参考以下文章

更改 navigationView 的单个特定菜单项的背景颜色

如何设置菜单按钮和菜单项的样式

更改导航抽屉中菜单项的文本颜色

css 另一个更改菜单项的背景颜色,填充和悬停颜色的示例。

动态更改弹出菜单项的字体大小 Android

如何在 Android 中动态更改菜单项文本