1

在我的网站中,我有三个页面:主页、关于和联系方式。我希望当前页面的链接能够提供一些视觉指示,表明单击相应链接将毫无意义,因为用户已经在该页面上。这个任务是由 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");
    });
});
4

13 回答 13

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 已更新以显示此代码。下面的评论中提供了一个使用 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>

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

最好的祝愿

于 2013-04-29T05:40:22.517 回答
2

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

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,您只需比较两者即可。

于 2013-05-02T02:19:05.867 回答
1

更新

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

改用这个:

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>

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");
        });
});
于 2013-05-03T19:39:27.557 回答
1

您可以使用某种服务器端语言(例如 PHP)检查当前页面是否是 Home、About 或 Contact,并相应地应用“当前”类。或者,如果您愿意,可以使用 JavaScript 执行此操作。我不确定您的绝对 URL 的外观如何,但我会这样做:

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

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

于 2013-04-29T05:30:55.213 回答
1

这样的事情怎么样?

我们在这里所做的是使用包含在菜单锚属性中的updateMenu字符串进行调用。href如果字符串和anchor.href匹配,那么我们隐藏锚并将它的文本内容复制到一个新的文本节点,然后我们将其附加li元素上。

如果我们没有匹配,那么我们取消隐藏菜单锚并检查li元素(在本例中为parentNode )的最后一个子节点是否是文本节点,如果是,我们将其删除,因为它是我们添加的。

您要求:

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

该解决方案可以做到这一点,并且还会使链接无法点击。

当然,它不必完全是这个公式,但可以是其他一些变体,当然如果你愿意,你可以使用 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>
于 2013-05-01T22:27:05.607 回答
1

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

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

例如,如果您有类似的 CSS

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

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

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

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

您可以li.current再次使用,5+1=6 比 id 低。

#home.current将等于 15!这将超越#home风格!

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

.current{
    color: blue !important;
}

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

于 2013-05-01T13:51:14.707 回答
1

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

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

要获得更强大的 javascript 解决方案,您可以尝试以下操作:自动链接 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();
}

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

于 2013-04-29T05:37:28.513 回答
1

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

就像是:

.current {
    color: blue;
}

.current a {
      text-decoration: none;
}

和:

// ...
$("#home").addClass('current');
// ...
于 2013-05-01T20:52:57.490 回答
1

要根据当前 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 代码将“当前”类添加到ahref属性设置为last part of address(在最后一个 / 之后)的任何链接。如果您的链接有点像/Contact/More..

于 2013-05-01T16:22:24.623 回答
1

您的更新 #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}

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

于 2013-05-03T00:15:48.013 回答
1

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

.current a {color:#123456;} 

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

编辑:您的 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 ){
      ...
于 2013-05-02T21:05:52.510 回答
1

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

$(function(){
    var href = window.location.pathname.replace(/.*\//, "/"),
        $active = $("nav ul#menu a[href='"+href+"']");
    $active.replaceWith($active.text());
});
于 2013-05-03T20:00:51.600 回答
1

我在我的网站上使用这些。它不使用 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,它们将被完全禁用。此外,如果当前页面与锚目标页面匹配,则添加#tohref属性将导致单击时锚不刷新。

于 2020-11-06T22:38:12.343 回答