如何给当前页面's链接一个禁用的外观
How can I give the current page's link a disabled look?
在我的网站,我有三个页面:主页,关于,和联系。我希望当前页面的链接给出一些视觉指示,单击相应的链接将是毫无意义的,因为用户已经在该页上。这个任务是由CSS还是jQuery更好地处理,在任何一种情况下,最优雅的解决方案是什么,它也会自动应用于将来可能添加的任何页面?
这是我的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>
更新我想知道为什么这不起作用;我在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>
然而链接仍然保持不变(正如齐柏林飞艇预测的那样)。
更新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的"位置",并将其添加到默认值。Cshtml的"ready"函数:
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");我想我还必须为两个链接添加一个"removeClass",在每个if/else块中索引为-1。
我的啤酒每纳秒都在变咸。
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来处理这个?那么,我可以这样做吗:
@{
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
另一种可能性是"jQuery for ASP。在"ready"函数(伪代码;如果这可以工作,我欢迎特定的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使用click事件来完成它。优雅化欢迎来到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也不行。让它看起来像这样:
$(document).ready(function () {
$("#tabs").tabs();
$(".fancybox").fancybox();
$("#home").click(function (event) {
$("#home").css("color", "blue");
$("#about").css("color", "black");
$("#contact").css("color", "black");
});
});
我认为这非常接近你在这里寻找的:
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,你只需要比较两个url。
你必须为这个活动状态创建一个CSS类,就像评论中建议的那样,我在这个例子中使用current
.current {
text-decoration: none;
/* here you style the seemingly disabled link as you please */
}
对于HTML,活动菜单页应该是这样的:
如果您在About页面
<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中的示例
祝福
更新
仔细一想,你的问题是,当你点击链接到一个新的页面,你刷新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");
});
});
您可以使用一些服务器端语言(例如PHP)检查当前页面是Home, About还是Contact,并应用相应的"current"类。或者,如果您愿意,您也可以使用JavaScript来实现这一点。我不确定你的绝对url看起来如何,但我会这样做:
$(document).ready(function() {
$('a[href="' + window.location.pathname + '"]').addClass('current');
});
您可能需要在那里添加一些正斜杠,这取决于您的url的外观。
对于这个通用的开发任务有三种解决方案:1)服务器端脚本为您更改菜单/链接,2)使用类似"current"类的CSS样式,或者3)javascript/CSS混合解决方案。
这完全取决于你的系统和开发范围。对于大型动态站点,如果已经在使用服务器端代码,显然也可以使用它。但是对于大多数项目,你还没有使用这样的脚本,你可以手动添加一个"当前"类的链接和样式,你喜欢的CSS,甚至更多的锚包装文本完全(取决于你的链接/菜单的风格)。
对于一个更健壮的javascript解决方案,你可以尝试这样做:automatic link highler/stylesfunction 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();
}
就可用性而言,人们普遍认为,只是把导航链接设计得不那么有趣、对比度更低、更灰、没有下划线等,就足以帮助人们知道他们在这里。点击链接的成本很低,但对大多数网站来说,这是一个很好的设计。
以编程方式更改我的链接,基于当前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代码将"当前"类添加到任何a
链接,其href
属性设置为last part of address
(在last/之后)。如果你的链接有点像/Contact/More
,那就不完美了。
您的"Update 2"版本接近工作-您只需要将类添加到#home
,而不是home
类似:
.current {
color: blue;
}
.current a {
text-decoration: none;
}
:
// ...
$("#home").addClass('current');
// ...
这样怎么样?
我们在这里所做的是,我们使用包含在菜单锚点的href
属性中的字符串调用updateMenu
。如果绳子和锚。href匹配,然后我们隐藏锚并复制它的文本内容到一个新的文本节点,然后我们将其附加到li
元素。
如果我们没有匹配,那么我们取消隐藏菜单锚点,并检查li
元素(在本例中为parentNode)的最后一个子节点是否为文本节点,如果是,我们删除它,因为它是由我们添加的。
您请求的:
我希望当前页面的链接给出一些视觉指示对于用户来说,点击相应的链接是毫无意义的已经在那一页了
这个解决方案做到了这一点,并使链接不可点击。
当然,它不必完全是这个公式,但可以是其他一些变体,当然,如果你喜欢,你可以使用jquery而不是普通的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 如果你想使用href
s就像你的例子,即。"~/About",那么您将需要制定要传递给updateMenu
的字符串,就像我的示例;
<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 看到窗口。其他属性的位置
返回包含当前位置信息的位置对象
对于一个纯css的解决方案,你可以尝试指针事件,这里是一个jsfiddle显示它的使用。
CSS警告:CSS中指针事件对非svg元素的使用是实验。这个特性曾经是CSS3 UI草案的一部分规范,但由于许多悬而未决的问题,已被推迟到CSS4 .
.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>
你的更新#2应该可以工作,但是你忘了放"#" ($('#home').addClass...
)。
但如果它仍然不起作用,请特别注意你的CSS
例如,如果你有一个像
这样的css#home{color : blue;}
.current{color : orange;}
文字为蓝色,因为#home
是"strong "
如果我们把值放到选择器中:id = 10类= 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,但不建议这样做。
你更新# 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}
这将忽略所有未使用的类,只将选中的类涂成红色。
我不愿意指出,你的css颜色没有应用到你的链接的原因是css颜色必须在锚标记上设置链接(锚标记不会从包装的LI元素继承颜色)。试着
.current a {color:#123456;}
或保持CSS不变,但更改标记,使"current"类应用于<标签,而不是><李> . 李>
编辑:当你试图改变颜色时,你的jsfiddle工作的原因(而你的生产代码没有)是因为fiddle文本不在A标签内。
如果您希望自动检测当前在哪个页面上,只需比较每个链接到文档的HREF值。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链接会像文档一样弄得有点乱。URL不包含~字符…只需从href值中删除第一个字符,如下所示: var href = $(this).attr('href').split(1); //
if ( document.URL.indexOf( href[1] ) !== -1 ){
...
我只是从你当前的链接中删除链接。您可以通过在CSS中以不同的方式定位li
和li a
来控制样式。唯一稍微有点棘手的事情是为您正在使用的链接获得正确的实际href
值,但这应该不会太难。而且代码并不多。
$(function(){
var href = window.location.pathname.replace(/.*'//, "/"),
$active = $("nav ul#menu a[href='"+href+"']");
$active.replaceWith($active.text());
});
我在我的网站上使用这些。它不使用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
属性将导致锚点在当前页面与锚点目标页面匹配时不刷新。
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- jQuery:循环一个具有不同超时值的循环
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 从javascript创建一个列表
- 节点导出返回一个空对象
- 使用clickToggle并在单击另一个元素时关闭元素
- 我可以在json对象中添加一个函数吗
- 使用javascript将动态表从一个html页面打印到另一个html页
- 将jsp文件下拉列表中的选定项分配给一个java变量(比如String selection)
- 表追加而不附加最后一个元素
- 我如何找到一个句子中的所有空格并替换忽略它们
- D3在一个调用中绘制不同的SVG形状,没有可见性
- 如何在android中使用phonegap将文件从一个文件夹移动/复制到另一个文件夹
- 使用类从一个标记中双击事件
- 从一个字符串中提取特定的项目,并设置为其他外观
- 我如何制作一个外观和行为都像切换的浏览器操作按钮
- 如何给当前页面's链接一个禁用的外观
- 是否有一个UI框架来模拟Mac应用程序的外观
- 在Javascript中,我需要一个RegEx来删除具有多个外观的两个文本(范围)之间的字符串中的文本
- 选择一个网页的外观和感觉没有重新加载,与一个CSS