这有点具体… 但我想着,也许它对某些人有用。我最近需要在一个页面上创建多个不同的登录表单。通过 CSS 我们知道我们可以使用:active来对活动输入应用样式。这很有用… 而且我们之前已经介绍了如何进行 输入和标签高亮。但现在我们需要更进一步,高亮当前的表单本身。
这篇文章相当古老。你可能现在会直接使用 :focus-within。

HTML
三个块,每个块都有一个表单
<div class="login-block">
<h3>Sharepoint Login</h3>
<form action="#" method="post" target="_blank">
<p><label for="sharepoint-company-name">Company</label><input type="text" name="sharepoint-company-name" id="sharepoint-company-name" /></p>
<p><label for="sharepoint-user-name">User Name</label><input type="text" name="ftp-user-name" id="ftp-user-name" /></p>
<p><label for="sharepoint-password">Password</label><input type="password" name="ftp-password" id="ftp-password" /></p>
<p class="submit-wrap"><input type="submit" id="sharepoint-submit" class="button" value="Login" /></p>
</form>
</div>
<div class="login-block">
<h3>FTP Login</h3>
<form action="#" method="post" target="_blank">
<p><label for="ftp-user-name">User Name</label><input type="text" name="ftp-user-name" id="ftp-user-name" /></p>
<p><label for="ftp-password">Password</label><input type="password" name="ftp-password" id="ftp-password" /></p>
<p class="submit-wrap"><input type="submit" id="ftp-submit" class="button" value="Login" /></p>
</form>
</div>
<div class="login-block last">
<h3>Secret Area Login</h3>
<form action="#" method="post" target="_blank">
<p><label for="secret-user-name">User Name</label><input type="text" name="ftp-user-name" id="ftp-user-name" /></p>
<p><label for="secret-password">Password</label><input type="password" name="ftp-password" id="ftp-password" /></p>
<p class="submit-wrap"><input type="submit" id="ftp-submit" class="button" value="Login" /></p>
</form>
</div>
CSS
CSS 并不特别有趣。表单本身周围有白色边框,我们设置了一个带有彩色边框的类。这个类将通过 JavaScript 应用和移除,将样式信息正确地从 JavaScript 中分离出来。
.login-block {
float:left;
margin:0 49px 25px 0;
text-align:center;
width:260px;
}
.login-block form {
-moz-border-radius:15px 15px 15px 15px;
-moz-box-shadow:0 0 10px #333333;
border:3px solid white;
padding:20px;
}
.login-block .active-form {
border-color:#d09e6d;
}
jQuery JavaScript
使这“工作”的部分在这里。 当一个输入获得焦点时,它会移除站点上所有表单的高亮,然后将其添加回包含这个新获得焦点的输入的表单。 感谢 bartaz 指出 jQuery 1.4 现在支持表单的“focusin”和“focusout”事件,这些事件在表单内的任何输入处于活动状态时触发。我们可以监视它。当 focusin 触发时,我们将移除所有表单的高亮,并将它添加回刚刚触发事件的那个表单。
$(function() {
var $forms = $("form");
$forms.focusin(function() {
$forms.removeClass("active-form");
$(this).addClass("active-form");
});
});
演示
请注意,它使用了一个古老版本的 jQuery。较新的版本不支持直接使用 focusin。
有趣的想法。感谢分享 :)
在这个上下文中,.parent().parent() 的替代方案是 .closest(‘form’) - 它向上遍历 DOM 树并返回与选择器匹配的第一个元素(在本例中为 ‘form’)。
啊,谢谢,非常好。我会使用它,但一个更完美的想法在下面被发现了。
但在 IE 中…..
在 IE 中没问题。IE 6 有一些格式问题(你需要使用类名而不是属性选择器),IE 7 不支持圆角或阴影,但它们都支持活动表单高亮,这正是这篇文章的重点。
正如 Ben 所说,.closest('form')在这里会更好。
但 jQuery 1.4 有新的focusin事件,它就是focus它会向上冒泡到 DOM 树,所以可以被委托(并在表单本身触发)。
所以像这样的代码应该可以工作
$('form').bind('focusin focusout', function(){$(this).toggleClass("active-form");
});
太棒了
谢谢!这是理想的。我已经更新了文章和下载。我使用了这个
我很高兴能帮上忙。
顺便说一下,你也可以在演示中添加一些针对 WebKit 浏览器的 CSS 爱心 ;)
不仅仅是 WebKit 浏览器。Opera 10.50 同时支持
border-radius和box-shadow显而易见的表单是显而易见的。:P
我喜欢它,但我发现自己自然地期望当我在表单块的任何部分(不仅仅是文本字段或其他表单元素内部)点击时,表单获得焦点。
也许一个改进(虽然很小)将是一个 hover 事件,暗示一个表单是可点击的,然后是一个 onclick 事件,将焦点设置到被点击的表单。
-Theo
+1 支持这个想法!
在表单元素上使用 cursor:pointer。并在 click() 上触发 focus,就像 input:focus 会做的那样。
所以我们有一个表单,当它获得焦点时会改变边框。欢迎来到 1998 年。
非常有用,感谢分享!
是的,一个非常具体的帖子,与在获得焦点时高亮显示身份验证框有关。这是一个开发 Area 51 忍者风格授权网关的绝佳起点。
@bill:试试这个 - Buysellads.com 上的 Konami 代码。得到提示。
提醒一下… 第二个登录框上的标签会激活第一个登录框上的输入框… 与这篇文章无关,只是通知一下 ;)
感谢 Jack,再次修复了演示和下载。问题在于输入的“name”属性由于笨拙的复制粘贴而混乱。
但这带来了一个有趣的事情,.focusin 命令也适用于标签点击,这很酷。
简单的 CSS 可以实现相同的功能。:focus 和后代。
表单是输入的父级,而不是后代。不能在 CSS 中向上遍历树。
嘿,Chris,好文章。如何用一些 PHP 与此搭配,使其可用?我想要一个密码屏幕来保护一些页面。
为什么不直接使用 CSS 呢?
向我们展示如何做到。
这个教程给了我一些想法… 谢谢。
谢谢 Chris!
非常有用,谢谢!
解释得很清楚,对于登录表单非常有用的教程。感谢分享,Chris。:)
不确定这在哪里有用…
你不能使用 form:focus 做到吗?
你能尝试在某一天制作一个使用某种方式的 lightbox 的登录表单教程吗?
我希望您能理解我的意思,就像用户点击登录链接时,用户名和密码的登录框会以弹窗的形式在光盒中弹出。
我会尝试使用纯CSS来实现相同的效果。另外,我认为输入框的onBlur事件应该使高亮的活动表单变为非活动状态。
好主意!执行起来也不太难。
我希望你能帮忙。我想找一种方法来创建一个联系表单,让用户可以发送电子邮件到多个电子邮件地址…我设想一个下拉列表,本质上是一个电子邮件地址列表。这样用户填写完表格后,就可以从下拉列表中选择一个电子邮件地址,提交后就会发送到所选的电子邮件地址。你知道哪里可以找到更多信息吗?非常感谢。继续努力,干得好。