【问题标题】:How can I give the current page's link a disabled look?我怎样才能给当前页面的链接一个禁用的外观?
【发布时间】:2013-04-29 04:46:30
【问题描述】:

在我的网站中,我有三个页面:主页、关于和联系。我希望当前页面的链接能够提供一些视觉指示,表明单击相应链接将毫无意义,因为用户已经在该页面上。这个任务是由 CSS 还是 jQuery 更好地处理,在这两种情况下,最优雅的解决方案是什么,它将自动应用于将来可能添加的任何页面?

这是我的 HTML diesbezueglich:

<nav>
    <ul id="menu">
        <li><a href="~/">Home</a></li>
        <li><a href="~/About">About</a></li>
        <li><a href="~/Contact">Contact</a></li>
    </ul>
</nav>

更新

我想知道为什么这不起作用;我在 Site.css 中添加了这个:

nav ul li a.current {
    color: blue;
}

而相关的HTML是:

<nav>
    <ul id="menu">
        <li><a href="~/">Home</a></li>
        <li><a href="~/About">About</a></li>
        <li><a href="~/Contact">Contact</a></li>
    </ul>
</nav>

但链接保持不变(正如 Led Zeppelin 预测的那样)。

更新 2

我尝试了这个来测试这里提出的各种想法的混合体:

在 Site.css 中:

.current {
    color: blue;
}

在_SiteLayout.cshtml:

<ul id="menu">
    <li id="home" name="home"><a href="~/">Home</a></li>
    <li><a href="~/About">About</a></li>
    <li><a href="~/Contact">Contact</a></li>
</ul>

在 Default.cshtml 中:

<script type="text/javascript">
    $(document).ready(function () {
        $("#tabs").tabs();
        $(".fancybox").fancybox();
        $("home").addClass('current');
    });
</script>

...但是不行; “主页”链接一如既往地亲切(没有双关语)。

我还尝试为所有链接提供“位置”的 id,并将其添加到 Default.cshtml 的“就绪”函数中:

if ($(#location).attr('href').indexOf('home') != -1) $('home').addClass('currentPage');
else if ($(#location).attr('href').indexOf('about') != -1) $('about').addClass('currentPage');
else if ($(#location).attr('href').indexOf('contact') != -1) $('contact').addClass('currentPage');

(其中“currentPage”是将颜色设置为蓝色的css类,每个导航链接都有一个id为“location”);我认为我还必须在每个 if/else 块中为两个索引为 -1 的链接添加一个“removeClass”。

我的啤酒越来越咸了。

更新 3

我试过这个:

为 _SiteLayout.cshtml 中的元素添加了 ID:

<nav>
    <ul id="menu">
        <li id="home"><a href="~/">Home</a></li>
        <li id="about"><a href="~/About">About</a></li>
        <li id="contact"><a href="~/Contact">Contact</a></li>
    </ul>
</nav>

并将其添加到 Site.css:

#home {color: orange;}
#home.current {color: blue;}
#about {color: orange;}
#about.current {color: blue;}
#contact {color: orange;}
#contact.current {color: blue;}

...但它什么也没做 - 无论我在哪里导航,所有链接仍然是灰色的。

更新 4

也试过这个没用:

if ($('#home').attr('href').indexOf('Home') != -1) $('#home').addClass('currentPage');

更新 5

我想知道是否有办法使用 _PageStart.cshtml 来处理这个问题? IOW,我可以这样做:

@{
    Layout = "~/_Layout.cshtml";
    //pseudocode follows
    var currentPage = CurrentPage.Id;
}

//然后是一些jQuery(也是伪代码):

if @currentPage == Default {
    #home.display = none;
else if @currentPage == About {
    #about.display = none;
else if @currentPage == Contact {
    #contact.display = none;
} // perhaps set them all visible from the git-go

更新 6

“用于 ASP.NET 开发人员的 jQuery”启发的另一种可能性是“就绪”函数中的以下内容(伪代码;如果这可行,我欢迎我需要充实它的特定 jQuery):

// first set all of the nav ul li to their default color, right? (not shown)
// now, color the current one chartreuse:
$("nav ul li").each(function() {
    switch ($(this.name)) {
        case 'home':
            $(#home).css("color", "chartreuse");
            break;
        case 'about':
            $(#about).css("color", "chartreuse");
            break;
        case 'contact':
            $(#contact).css("color", "chartreuse");
            break;
    }
});

更新 7

好吧,我敢肯定这不是优雅的想法,但我确实找到了一种方法来通过为每个 li 使用单击事件来完成它。欢迎在这里使用 jsfiddle 进行优雅化:http://jsfiddle.net/vV4h5/1/

至于上面 jsfiddle 的优雅化,肯定有办法代替:

jQuery(function () {
    $("nav ul li").css("color", "black");
    var currentLI = theOneClicked; //??? how to get this???
    $(currentLI).css("color", "blue");
});

更新 8

它适用于 jsfiddle,但不适用于我的项目;在 _SiteLayout.cshtml 中有这个:

<nav>
    <ul id="menu">
        <li id="home"><a href="~/">Home</a></li>
        <li id="about"><a href="~/About">About</a></li>
        <li id="contact"><a href="~/Contact">Contact</a></li>
    </ul>
</nav>

。 . .

jQuery(function () {
    $("#home").click(function (event) {
        $("#home").css("color", "blue");
        $("#about").css("color", "black");
        $("#contact").css("color", "black");
    });
});

jQuery(function () {
    $("#about").click(function (event) {
        $("#home").css("color", "black");
        $("#about").css("color", "blue");
        $("#contact").css("color", "black");
    });
});

jQuery(function () {
    $("#contact").click(function (event) {
        $("#home").css("color", "black");
        $("#about").css("color", "black");
        $("#contact").css("color", "blue");
    });
});

...不起作用。也不会只将第一个函数移动到 Default.cshtml,因此它看起来像这样:

$(document).ready(function () {
    $("#tabs").tabs();
    $(".fancybox").fancybox();
    $("#home").click(function (event) {
        $("#home").css("color", "blue");
        $("#about").css("color", "black");
        $("#contact").css("color", "black");
    });
});

【问题讨论】:

  • 您可能需要将current 之类的类添加到链接中,然后使用该类设置链接的样式
  • 可以分享导航html吗
  • 我相信您正在尝试做的事情称为“您在这里导航。”如果你用谷歌搜索这个词,你会得到很多结果。
  • 如果您不使用服务器语言,最好使用 jQuery,创建一个 css 类 currentPage 左右。将 id 添加到所有链接并在 jQuery 就绪函数中使用它 if($(location).attr('href').indexOf('home')!=-1) $('home').addClass('currentPage' );您可以在 if else 条件中添加所有 id
  • 您的更新 3 非常好,除了您需要使用 # 作为 ID 选择器而不是 . 您调用的是类,而不是 id。

标签: javascript jquery css html nav


【解决方案1】:

我认为这与您在这里寻找的非常接近:

http://jsfiddle.net/qmHeF/1/

JS:

 $("#menu a").each(
    function(index)
        {
            if(window.location.href==this.href)
            {
                $(this).parent().remove();
            }
        }
    );

我在这里从 DOM 中删除它(我的个人喜好),但如果你愿意,你可以添加一个类或自定义 CSS。

http://jsfiddle.net/qmHeF/2/

更新:将其更改为添加一个类而不是删除它。

    $("#menu a").each(
function(index)
    {
        if(window.location.href==this.href)
        {
            $(this).addClass("current");
        }
    }
);

使用 window.location.href 而不是 jquery href 将为您提供完整的 URL 而不是相对 url。这样你就不需要解析任何一个 url,你可以比较两者。

【讨论】:

    【解决方案2】:

    你必须为这个活动状态创建一个 CSS 类,就像评论中建议的那样,我在这个例子中使用 current。

    .current {
    text-decoration: none;
    /* here you style the seemingly disabled link as you please */
    }
    

    对于 HTML,活动菜单页面如下所示:

    如果您在“关于”页面中

       <nav>
            <ul id="menu">
                <li><a href="~/">Home</a></li>
                <li><a class="current" href="~/About">About</a></li>
                <li><a href="~/Contact">Contact</a></li>
            </ul>
        </nav>
    

    如果你想禁用链接,只使用 html,这里是代码。 Fiddle 已更新以显示此代码。下面的 cmets 提供了一个使用 Javascript 的优雅解决方案。

    <nav>
        <ul id="menu">
            <li><a href="~/">Home</a></li>
            <li><span class="current" >About</span></li>
            <li><a href="~/Contact">Contact</a></li>
        </ul>
    </nav>
    

    我在这里做了一个简单的例子,你可以看看这是否是你要找的: Example in jsFiddle.net

    最好的祝福

    【讨论】:

    • 这向我展示了如何让“关于”始终为黑色,但我认为缺少一些 jQuery 来真正实现此功能。
    • $('nav ul li a').click(function() { $(this).addClass('current').siblings().removeClass('current'); }); // 可选地在那里添加fancybox,并返回false..
    • @psychobrm:这正是我正在寻找的优雅化; jsfiddled 在这里:jsfiddle.net/yXMYW/1 让它成为一个答案,我会标记它并奖励它。
    • @ClayShannon 很高兴为您提供帮助。另外,我不是为了奖励......:D
    【解决方案3】:

    更新

    再想一想,您的问题是,当您单击指向新页面的链接时,您正在刷新 javascript...所以 click 事件会触发,但随后会立即被原始的 DOM 元素替换为任何内容您浏览到的页面。

    改用这个:

    HTML/Razor

    <nav>
        <ul id="menu">
            <li><a href="/">Home</a></li>
            <li><a href="/About">About</a></li>
            <li><a href="/Contact">Contact</a></li>
        </ul>
    </nav>
    

    jQuery

    $(document).ready(function () {
            $("#menu a").each(function(){
                //set all menu items to 'black
                $(this).css("color","black");
    
                var linkPath=$(this).attr("href");
                var relativePath=window.location.pathname.replace('http://'+window.location.hostname,'');
    
                //set the <a> with the same path as the current address to blue
                if(linkPath==relativePath)
                    $(this).css("color","blue");
            });
    });
    

    【讨论】:

      【解决方案4】:

      您可以使用某些服务器端语言(例如 PHP)检查当前页面是否为主页、关于或联系人,并相应地应用“当前”类。或者,如果您愿意,可以使用 JavaScript 执行此操作。我不确定您的绝对 URL 看起来如何,但我会这样做:

      $(document).ready(function() {
           $('a[href="' + window.location.pathname + '"]').addClass('current');
      });
      

      您可能需要在其中添加一些正斜杠,具体取决于您的 URL 的外观。

      【讨论】:

        【解决方案5】:

        这个通用开发任务有三组解决方案:1) 服务器端脚本为您改变菜单/链接,2) 使用类似“当前”类的 CSS 样式,或 3) javascript/css 混合解决方案。

        这完全取决于您的系统和开发范围。对于大型动态站点,如果它已经被使用,显然也可以使用服务器端代码。但是对于大多数尚未使用此类脚本的项目,可以手动添加“当前”类来链接并使用 CSS 或更多锚点完全包裹文本(取决于您的链接样式) /菜单)。

        要获得更强大的 javascript 解决方案,您可以试试这个:automatic link hightler/styling

        function extractPageName(hrefString)
        {
            var arr = hrefString.split('/');
            return  (arr.length < 2) ? hrefString : arr[arr.length-2].toLowerCase() + arr[arr.length-1].toLowerCase();
        }
        
        function setActiveMenu(arr, crtPage)
        {
            for (var i=0; i < arr.length; i++)
            {
                if(extractPageName(arr[i].href) == crtPage)
                {
                    if (arr[i].parentNode.tagName != "DIV")
                    {
                        arr[i].className = "current";
                        arr[i].parentNode.className = "current";
                    }
                }
            }
        }
        
        function setPage()
        {
            hrefString = document.location.href ? document.location.href : document.location;
        
            if (document.getElementById("nav") !=null )
            setActiveMenu(document.getElementById("nav").getElementsByTagName("a"), extractPageName(hrefString));
        }
        

        然后运行setPage onload,比如用:

        window.onload=function()
        {
            setPage();
        }
        

        就可用性而言,人们普遍认为,只需将导航链接的样式设置为看起来不那么有趣、对比度较低、灰色、没有下划线等,就足以帮助人们了解他们的位置。点击您已经访问的链接的成本非常低,但无论如何对于大多数网站来说,这都是一种不错的设计风格。

        【讨论】:

          【解决方案6】:

          要根据当前 url 以编程方式更改我的链接,我更喜欢 jquery:

          <style type="text/css">
          .current {
             color: #cccccc;
          }
          </style>
          
          ...
          
          <nav>
             <ul id="menu">
                <li><a href="~/">Home</a></li>
                <li><a href="~/About">About</a></li>
                <li><a href="~/Contact">Contact</a></li>
             </ul>
          </nav>
          
          ...
          
          <script type="text/javascript">
             $(document).ready(function() {
                var href = $("#menu li a").prop("href");
                $("a[href$='"+href.substr( href.lastIndexOf("/") )+"']").addClass("current");
             });
          </script>
          

          ..jquery 代码将“当前”类添加到任何将其href 属性设置为last part of addressa 链接(在最后一个/ 之后)。如果你的链接有点像/Contact/More..

          【讨论】:

          • 今晚我会捷克出这个;但是对于以前是当前但不再是当前的页面,是否还需要相应的“.removeClass(“current”)”? IOW,如果用户捣碎“关于”链接,它变成颜色#cccccc;如果他们随后将“联系人”混搭,“关于”仍然不会是#cccccc(现在也是“联系人”)?
          • 上面的代码只处理“当前页面”,也就是 location.href.. 要处理以前查看过的页面,我会使用 CSS,例如 :visited pseudos..
          【解决方案7】:

          您的“更新 2”版本即将开始工作 - 您只需要将类添加到 #home,而不是 home

          类似:

          .current {
              color: blue;
          }
          
          .current a {
                text-decoration: none;
          }
          

          与:

          // ...
          $("#home").addClass('current');
          // ...
          

          【讨论】:

            【解决方案8】:

            这样的事情怎么样?

            我们在这里所做的是调用updateMenu,并使用包含在菜单锚点的href 属性中的字符串。如果字符串和anchor.href 匹配,那么我们隐藏锚并将它的text content 复制到new text node,然后我们将append 复制到li 元素。

            如果我们没有匹配,那么我们取消隐藏菜单锚并检查li 元素(在这种情况下为parentNodelast child 是否是文本节点,如果是,我们将其删除因为它是我们添加的。

            您要求:

            我希望当前页面的链接能够提供一些视觉指示 单击相应的链接将毫无意义,因为用户是 已经在那个页面上。

            此解决方案会执行此操作,并且还会使链接无法点击。

            当然它不必完全是这个公式,但可以是其他一些变体,当然如果你愿意,你可以使用 jquery 而不是 vanilla javascript 来实现这一点。

            HTML

            <nav>
                <ul id="menu">
                    <li><a href="/">Home</a></li>
                    <li><a href="/About">About</a></li>
                    <li><a href="/Contact">Contact</a></li>
                </ul>
            </nav>
            

            Javascript

            (function () {
                var updateMenu = (function () {
                    var anchors = document.getElementById("menu").getElementsByTagName("a");
            
                    return function (page) {
                        Array.prototype.forEach.call(anchors, function (anchor) {
                            var last;
            
                            if (anchor.pathname === page) {
                                anchor.style.display = "none";
                                anchor.parentNode.appendChild(document.createTextNode(anchor.textContent));
                            } else {
                                last = anchor.parentNode.lastChild;
                                anchor.style.display = "block";
                                if (last.nodeType === 3) {
                                    anchor.parentNode.removeChild(last);
                                }
                            }
                        });
                    }
                }());
            
                setTimeout(function () {
                    updateMenu("/");
                    setTimeout(function () {
                        updateMenu("/About");
                        setTimeout(function () {
                            updateMenu("/Contact");
                            setTimeout(function () {
                                updateMenu("");
                            }, 5000);
                        }, 5000);
                    }, 5000);
                }, 5000);
            }());
            

            开启jsfiddle

            如果你想在你的例子中使用hrefs,即“~/About”,那么你需要制定你的字符串以传递给updateMenu,就像我的例子一样;

            HTML

            <a href="~/About">About</a>
            

            Javascript

            console.log(document.getElementsByTagName("a")[0].pathname);
            console.log(window.location.pathname + "~/About");
            

            输出

            /Xotic750/G5YuV/show/~/About
            /Xotic750/G5YuV/show/~/About 
            

            开启jsfiddle

            查看window.location 了解它的其他属性

            返回一个包含当前位置信息的位置对象 文件。

            对于纯 CSS 解决方案,您可以尝试 pointer-events,这是一个 jsfiddle 显示它正在使用中。

            警告:在 CSS 中对非 SVG 元素使用指针事件是 实验性的。该功能曾经是 CSS3 UI 草案的一部分 规范,但由于许多未解决的问题,已推迟到 CSS4。

            CSS

            .current {
                pointer-events: none;
                cursor: default;
                text-decoration: none;
                color: black;
            }
            

            HTML

            <nav>
                <ul id="menu">
                    <li><a href="/">Home</a></li>
                    <li><a class="current" href="/About">About</a></li>
                    <li><a href="/Contact">Contact</a></li>
                </ul>
            </nav>
            

            【讨论】:

              【解决方案9】:

              您的更新 #2 应该可以工作,但您忘记输入“#”($('#home').addClass...)。

              但如果它再次不起作用,请特别注意您的 CSS

              如果你有,例如,像

              #home{color : blue;}
              .current{color : orange;}
              

              文本将是蓝色的,因为#home 是“更强”

              如果我们给选择器赋值: id=10 class=5 节点选择器 (div) = 1

              所以 #home = 10 并且高于 .current 等于 5,#homestyles 将被覆盖。

              您可以使用li.current,但同样,5+1=6 低于 id。

              #home.current 将等于 15! Wich 将覆盖 #home 样式!

              但是,如果您的颜色样式在具有属性 style="" 的节点本身上,则必须使用 jquery 将其删除或使用 !important

              .current{
                  color: blue !important;
              }
              

              它将覆盖每个 css,但不建议这样做。

              【讨论】:

                【解决方案10】:

                您的更新 #3 已结束。

                给你的身体一个 ID 任何你想要的页面名称,并给你的链接 ID 像这样

                <body id="about">
                    <nav>
                        <ul id="menu">
                            <li class="home"><a href="~/">Home</a></li>
                            <li class="about"><a href="~/About">About</a></li>
                            <li class="contact"><a href="~/Contact">Contact</a></li>
                        </ul>
                    </nav>
                </body
                

                那么您的 CSS 可能看起来有点像您的更新 #3 示例:

                li a {color:blue}
                #home .home{color:red !important}
                #about .about{color:red !important}
                #contact .contact{color:red !important}
                

                这应该忽略任何未使用的类,只将选定的类着色为红色。

                【讨论】:

                • 我的导航块在_SiteLayout.cshtml中;我认为这可能会使事情复杂化。将正文标识为“关于”(或“家”或“联系人”)没有任何意义,因为它们都使用该导航块/部分。
                • 只要您将导航块与您的身体分开,它就非常有意义。导航块,即使被包含在内,仍然会被读取并呈现为直接的 HTML。只要您的导航块嵌套在您的身体内部,这将起作用。 CSS 正在为特定元素制定规则。它将忽略该页面中未包含的元素。
                • 我还不能测试它(必须等到我下班回家),但似乎在这里添加 jQuery:jsfiddle.net/yXMYW/1 到 _SiteLayout.cshtml 应该可以工作......Si o 没有?
                • 假设您没有刷新页面并且您通过 ajax 提取所有信息,这将起作用。另外,我知道您在这里有很多答案,但不确定这是否是该评论的答案。
                【解决方案11】:

                我不想指出您的 css 颜色未应用于链接的原因是因为链接的 css 颜色必须在锚标记上设置(锚标记不会从包装 LI 元素继承颜色)。试试看

                .current a {color:#123456;} 
                

                或者保留你的css,但是改变你的标记,以便将“当前”类应用于标签而不是

              • 编辑:您的 jsfiddle 在尝试更改颜色时起作用(而您的生产代码没有)的原因是因为小提琴文本不在 A 标记内。

                如果您希望自动检测您当前所在的页面,只需将每个链接的 HREF 值与 document.URL 字符串进行比较:

                $('nav').find('a').each(function(){
                    if ( document.URL.indexOf( $(this).attr('href') ) !== -1 ){
                        $(this).parent().addClass('current');
                    }
                });
                

                详细描述和测试可在此处获得:-> http://jsfiddle.net/vV4h5/26/

                编辑#2:还有一件事......你的asp.net链接会有点混乱,因为document.URL不会包含〜字符......只需从你的href值中删除第一个字符如下:

                 var href = $(this).attr('href').split(1); //
                 if ( document.URL.indexOf( href[1] ) !== -1 ){
                      ...
                

                【讨论】:

                • 我的更新 6 和 7 怎么样——至少在 jsfiddle 中,它似乎可以工作,尽管承认有点笨拙(我知道必须有一种不那么冗长的方式,就像 Update 中的伪代码一样7 表示)。
                • 您的小提琴有效,因为 LI 内部没有链接。我不太确定你想要达到什么目的。您的小提琴的另一个问题是它将 li 文本设置为适当的颜色,但除非您覆盖 标签上的默认点击事件,否则它将加载一个新页面 - 一旦该页面被加载,您所做的任何更改made 将被否定。
                • 我想要实现的是非常基本的,我想几乎每个网站都希望以这种方式工作:当网站上的各个页面都有导航链接时,当前页面应该与其他页面不同以显示它是当前页面;也许禁用它,这本身可能会改变外观。这没什么大不了的,只是为了让用户知道他们在哪里,而不是点击链接,然后留在同一个地方。导航到你已经在的地方有点像当汽车已经在运行时转动点火装置,没有磨擦。
                • 不,我正在寻找比这更简单的东西。我只需要选择的最后一个链接,即当前链接,以与所有其他链接不同。我认为 Psychobrm 上面的答案可以解决问题,但我必须先在家里把它弄出来。
                【解决方案12】:

                我只是从您当前所在的那个中删除链接。您可以通过在 CSS 中以不同的方式定位 lili a 来控制样式。唯一有点棘手的事情是为您正在使用的链接获取实际的href 值,但这不应该太难。而且代码也不多。

                $(function(){
                    var href = window.location.pathname.replace(/.*\//, "/"),
                        $active = $("nav ul#menu a[href='"+href+"']");
                    $active.replaceWith($active.text());
                });
                

                【讨论】:

                  【解决方案13】:

                  我在我的网站上使用这些。它不使用 JavaScript,但几乎可以满足您的要求。

                  <style>
                  .header-nav a:target {
                      pointer-events: none;
                      color: #000;
                      font-weight: bold;
                      text-decoration: underline;
                  }
                  </style>
                  <p class="header-nav">
                      <a id="headerabout" href="/about.html#headerabout">about</a>
                      |
                      <a id="headertags" href="/tags.html#headertags">tags</a>
                      |
                      <a id="headershit" href="/shit.html#headershit">Shit I say</a>
                  </p>
                  

                  它将 id 添加到锚点及其目标 URL。如果锚点是:target-ed,它们将被完全禁用。此外,如果当前页面与锚目标页面匹配,则将# 添加到href 属性将导致单击时锚不刷新

                  【讨论】:

                    猜你喜欢
                    • 2015-02-06
                    • 1970-01-01
                    • 2022-08-02
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-01-31
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-08-21
                    相关资源
                    最近更新 更多