Das ist etwas spezifisch… aber ich dachte, was soll’s, vielleicht ist es für jemanden nützlich. Ich hatte kürzlich Gelegenheit, mehrere verschiedene Login-Formulare auf einer einzigen Seite zu erstellen. Mit CSS können wir aktive Eingabefelder mit:activestylen. Das ist nützlich… und wir haben bereits besprochen, wie man sowohl Eingabefelder und Labels hervorhebt. Aber jetzt müssen wir einen Schritt weiter gehen und das aktuelle Formular selbst hervorheben.
Dieser Artikel ist ziemlich alt. Heutzutage würde man wahrscheinlich nur :focus-within verwenden.

HTML
Drei Blöcke, jeder mit einem Formular
<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
Das CSS ist nicht besonders interessant. Die Formulare selbst haben einen weißen Rand, und wir richten eine Klasse ein, die einen farbigen Rand hat. Diese Klasse wird mit JavaScript angewendet und entfernt, wobei Stilinformationen ordnungsgemäß aus JavaScript herausgehalten werden.
.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
Das, was das „funktionieren“ lässt, ist hier. Wenn ein Eingabefeld fokussiert ist, werden die Hervorhebungen von allen Formularen auf der Website entfernt und dem Formular hinzugefügt, das dieses neu fokussierte Eingabefeld enthält. Dank bartaz für den Hinweis, dass jQuery 1.4 jetzt „focusin“- und „focusout“-Ereignisse für Formulare unterstützt, die ausgelöst werden, wenn ein beliebiges Eingabefeld darin aktiv ist. Wir können darauf achten. Wenn focusin ausgelöst wird, entfernen wir die Hervorhebungen von allen Formularen und fügen sie demjenigen hinzu, das gerade das Ereignis ausgelöst hat.
$(function() {
var $forms = $("form");
$forms.focusin(function() {
$forms.removeClass("active-form");
$(this).addClass("active-form");
});
});
Demo
Beachten Sie, dass dies eine veraltete Version von jQuery verwendet. Neuere Versionen unterstützen diese focusin-Verwendung nicht direkt.
Interessante Idee. Danke fürs Teilen :)
Eine Alternative zu .parent().parent() in diesem Kontext ist .closest(‘form‘) – es steigt im DOM-Baum auf und gibt das erste passende Element zum Selektor zurück (in diesem Fall ‘form‘).
Ah, danke, sehr nett. Ich würde das verwenden, außer dass unten eine noch perfektere Idee entdeckt wurde.
Aber in IE…..
Das ist in Ordnung in IE. IE 6 hat einige Formatierungsprobleme (Sie müssen Klassennamen anstelle von Attributselektoren verwenden) und IE 7 unterstützt die abgerundeten Ecken oder Schatten nicht, aber beide unterstützen die Hervorhebung des aktiven Formulars, was der Sinn der Sache ist.
Wie Ben sagte,.closest(‘form‘)ist hier besser.
Aber jQuery 1.4 hat neuefocusinEreignisse, diefocussind, die den DOM-Baum aufwärts blubbern, so dass sie delegiert werden können (und auf einem Formular selbst ausgelöst werden).
Der Code sollte also so funktionieren
$('form').bind('focusin focusout', function(){$(this).toggleClass("active-form");
});
Großartig
Danke! Das ist ideal. Ich habe den Artikel und den Download aktualisiert. Ich habe mich für diesen entschieden
Ich bin froh, dass ich helfen konnte.
Und übrigens, Sie könnten dem Demo auch etwas CSS-Liebe für Webkit-Browser hinzufügen ;)
Nicht nur Webkit-Browser. Opera 10.50 unterstützt sowohl
border-radiusals auchbox-shadow.Offensichtliches Formular ist offensichtlich. :P
Mir gefällt es, aber ich erwarte natürlich, dass ein Formular den Fokus erhält, wenn ich auf irgendeinen Teil eines Formularblocks klicke, nicht nur auf ein Textfeld (oder ein anderes Formularelement).
Vielleicht wäre eine Verbesserung (wenn auch eine ziemlich kleine) ein Hover-Ereignis, um anzuzeigen, dass ein Formular klickbar ist, und dann ein onclick-Ereignis, das den Fokus auf ein geklicktes Formular setzt.
-Theo
+1 für diese Idee!
cursor:pointer auf dem Formularelement. und bei click() den Fokus auslösen, genau wie input:focus es tun würde.
Wir haben also ein Formular, das seinen Rand ändert, wenn es den Fokus erhält. Willkommen im Jahr 1998.
Sehr nützlich, danke fürs Teilen!
Ja, tatsächlich ein sehr spezifischer Beitrag zur Hervorhebung einer Authentifizierungsbox bei Fokus. Dies ist ein großartiger Ausgangspunkt, um ein Area 51 Ninja-Style-Autorisierungs-Gateway zu entwickeln.
@bill: Probieren Sie diesen hier – Der Konami-Code auf buysellads.com. Verstehen Sie den Hinweis.
Nur zur Info… die Labels auf der zweiten Login-Box aktivieren die Eingabefelder auf der ersten… nicht relevant für den Beitrag, aber nur zur Info ;)
Danke Jack, Demo und Download erneut repariert. Das Problem waren die „name“-Attribute der Eingabefelder, die durch ungeschicktes Kopieren und Einfügen durcheinander geraten waren.
Aber das bringt etwas Interessantes hervor, der .focusin-Befehl funktioniert auch für Label-Klicks, was ziemlich cool ist.
Einfaches CSS macht dasselbe möglich. :focus und Descendenz.
Formulare sind Eltern von Eingabefeldern, nicht Nachkommen. Man kann in CSS nicht „nach oben“ im Baum navigieren.
Hey, netter Artikel Chris. Wie wäre es mit etwas PHP dazu, um es nutzbar zu machen? Ich hätte gerne eine Passwortseite, um ein paar Seiten zu schützen.
Warum nicht einfach nativ mit CSS…?
Zeigen Sie uns, wie.
Dieses Tutorial hat mir gerade einige Ideen gegeben… danke.
Danke Chris!
Sehr nützlich, danke!
Gut erklärt und sehr nützliches Tutorial für Login-Formulare. Danke fürs Teilen, Chris. :)
Bin mir nicht sicher, wo das hilfreich wäre…
Könnte man das nicht mit form:focus machen?
Könnten Sie vielleicht einmal ein Tutorial für ein Login-Formular erstellen, das irgendwie ein Lightbox verwendet?
Ich hoffe, Sie verstehen, was ich meine, so dass, wenn der Benutzer auf einen Login-Link klickt, das Login-Feld mit Benutzer und Passwort in einer Lightbox aufpoppt.
Ich werde versuchen, dasselbe mit reinem CSS zu machen. Außerdem denke ich, dass das onBlur-Ereignis der Eingabefelder das hervorgehobene aktive Formular inaktiv machen sollte.
Tolle Idee! Nicht zu schwierig umzusetzen.
Ich hoffe, Sie können mir helfen. Ich suche nach einer Möglichkeit, ein Kontaktformular zu erstellen, mit dem Benutzer E-Mails an mehrere E-Mail-Adressen senden können… Ich stelle mir eine Dropdown-Liste vor, die im Wesentlichen eine Liste von E-Mail-Adressen ist. Ein Benutzer füllt also das Formular aus, wählt eine E-Mail aus dem Dropdown und nach dem Absenden geht sie an die gewählte E-Mail-Adresse. Haben Sie eine Idee, wo ich mehr Informationen finden kann. Vielen Dank. Machen Sie weiter so.