Verwenden Sie CSS, um automatisch ein Sternchen "Erforderliches Feld" hinzuzufügen, um Eingaben zu bilden

133

Was ist ein guter Weg, um die unglückliche Tatsache zu überwinden, dass dieser Code nicht wie gewünscht funktioniert:

<div class="required">
    <label>Name:</label>
    <input type="text">
</div>

<style>
    .required input:after { content:"*"; }
</style>

In einer perfekten Welt würden alle erforderlichen inputs das kleine Sternchen erhalten, das angibt, dass das Feld erforderlich ist. Diese Lösung ist unmöglich, da das CSS nach dem Elementinhalt eingefügt wird, nicht nach dem Element selbst, sondern so etwas wie ideal. Auf einer Site mit Tausenden von erforderlichen Feldern kann ich das Sternchen vor der Eingabe mit einer Änderung in eine Zeile ( :afternach :before) oder an das Ende des Etiketts ( .required label:after) oder vor das Etikett oder nach verschieben eine Position auf der enthaltenen Box, etc ...

Dies ist nicht nur wichtig, wenn ich es mir anders überlege, wo das Sternchen überall platziert werden soll, sondern auch in ungeraden Fällen, in denen das Formularlayout das Sternchen nicht an der Standardposition zulässt. Es funktioniert auch gut mit der Validierung, die das Formular überprüft oder nicht ordnungsgemäß ausgefüllte Steuerelemente hervorhebt.

Schließlich werden keine zusätzlichen Markups hinzugefügt.

Gibt es gute Lösungen, die alle oder die meisten Vorteile des unmöglichen Codes bieten?

Brentonstrin
quelle
Vielleicht ein Hintergrundbild eines Sterns anwenden?
Valamas
required<input...
Fügen

Antworten:

229

Hast du das gedacht?

http://jsfiddle.net/erqrN/1/

<label class="required">Name:</label>
<input type="text">

<style>
  .required:after {
    content:" *";
    color: red;
  }
</style>

Siehe https://developer.mozilla.org/en-US/docs/Web/CSS/pseudo-elements

Max Girkens
quelle
2
Dies ist in vielen Situationen eine gute Lösung, funktioniert jedoch nicht, wenn zum Ausrichten der Formulare absolute Positionierungen oder Gleitkommazahlen verwendet werden (z . B. jsfiddle.net/erqrN/2 ). Ich verwende tatsächlich die absolute Positionierung, um meine Formulare auszurichten. Ich könnte das absolut positionieren, *aber es würde bedeuten, dass ich den Abstand für jede Länge der Formulareingabe manuell eingeben müsste und keine flexiblen Eingaben haben könnte.
Brentonstrine
4
@brentonstrine Die Chancen stehen gut, dass Sie keine absolute Positionierung verwenden sollten, um Ihre Formulare auszurichten. Obwohl häufig verwendet, reagiert die absolute Positionierung nicht (es sei denn, JS modifiziert das DOM beim Ändern der Größe), während die gleichen Effekte immer mit der statischen oder relativen Position erzielt werden können, die im Design reagieren kann. Leser, bitte vermeiden Sie die Verwendung von Stilen wie der absoluten Positionierung auf Dingen wie Formularelementen, da dies ein ziemlich archaischer Ansatz für die Positionierung ist. Ich weiß, dass Ihr Kommentar sehr alt war, aber das ist für die Leser.
WebWanderer
Das Sternchen wird bei Verwendung von Lynx nicht angezeigt. Dies kann ein Problem mit der Barrierefreiheit sein.
Dave Jarvis
kann ich das in meine .css einfügen? Wenn ja, können Sie bitte ein Beispiel geben? Ich wusste das nicht : Syntax
Leonardo Maffei
67
.required label {
    font-weight: bold;
}
.required label:after {
    color: #e32;
    content: ' *';
    display:inline;
}

Spielen Sie mit Ihrer genauen Struktur: http://jsfiddle.net/bQ859/

laffuste
quelle
Sie benötigen immer noch Klassen auf Ihren Etiketten. Die einzige Möglichkeit, die Dokumentstruktur sauber zu halten, ist die Hintergrundbildmethode. Prägnant.
Henry's Cat
37

Obwohl dies die akzeptierte Antwort ist, ignorieren Sie mich bitte und verwenden Sie die :afterunten vorgeschlagene Syntax. Meine Lösung ist nicht zugänglich.


Ein ähnliches Ergebnis könnte erzielt werden, indem ein Hintergrundbild eines Sternchenbildes verwendet und der Hintergrund des Etiketts / der Eingabe / des äußeren Divs und ein Auffüllen der Größe des Sternchenbildes festgelegt werden. Etwas wie das:

.required input {
   padding-right: 25px;
   background-image: url(...);
   background-position: right top;
}

Dadurch wird das Sternchen IN das Textfeld eingefügt, aber das Anbringen des gleichen div.requiredanstelle von .required inputwird wahrscheinlich mehr das sein, wonach Sie suchen, wenn auch etwas weniger elegant.

Diese Methode erfordert keine zusätzliche Eingabe.

Jaypeagi
quelle
5
Es ist jedoch erwähnenswert, dass dies nicht sehr bildschirmleserfreundlich ist. Max 'Antwort ist in dieser Hinsicht viel besser. Tatsächlich ist Max 'Antwort in den meisten Fällen idealer - nur nicht für das OP.
Jaypeagi
20

Um es genau in die Eingabe zu setzen, wie es auf dem folgenden Bild gezeigt wird:

Geben Sie hier die Bildbeschreibung ein

Ich habe folgenden Ansatz gefunden:

.asterisk_input::after {
content:" *"; 
color: #e32;
position: absolute; 
margin: 0px 0px 0px -20px; 
font-size: xx-large; 
padding: 0 5px 0 0; }
 <form>
    <div>              
        <input type="text" size="15" />                                 
        <span class="asterisk_input">  </span>            
    </div>            
</form> 

Die Site, an der ich arbeite, ist mit einem festen Layout codiert, daher war es für mich in Ordnung.

Ich bin mir nicht sicher, ob es gut für flüssiges Design ist.

Tebe
quelle
Ja, es sieht genauso aus. Der Unterschied ist, dass er Hintergrundbild verwendet hat. (oder ich habe etwas falsch verstanden)
Tebe
2
Das Hinzufügen eines leeren Span-Markups für so etwas macht den ganzen Sinn von CSS zunichte, nicht wahr?
Jason Silver
1
span kostet nichts, es ist ein üblicher Trick, um Dinge zu vereinfachen, die ziemlich oft in einer großen Anzahl von Bibliotheken zu finden sind, die ich gesehen habe
Tebe
14

Schreiben Sie in CSS

.form-group.required .control-label:after {content:"*";color:red;}

und HTML

<div class="form-group required">

    <label class="control-label">Name:</label>

    <input type="text">

</div>
Kondal
quelle
Ich denke, Ihr Ansatz funktioniert nur, wenn Sie die Control-Label-Klasse im Label-Tag wie zuweisen <label class="control-label">...</label>. Aber es macht den Job (Y)
MarcoLe
Ich gab Ihnen nur Beispiel Beispiel Zweck Kontrolle-Label Mr.creep-Geschichte
Kondal
Dies hat die ältere Pseudo-Element-Syntax und es besteht keine Notwendigkeit für Div-Suppe. Ich habe eine Antwort hinzugefügt, die das Formular div und class frei hält.
Henry's Cat
12
input[required]{
    background-image: radial-gradient(#F00 15%, transparent 16%), radial-gradient(#F00 15%, transparent 16%);
    background-size: 1em 1em;
    background-position: right top;
    background-repeat: no-repeat;
}
faisal
quelle
Warum gibt es zwei radial-gradientBegriffe background-image? Ich kann diese Syntax nicht dazu bringen, mit developer.mozilla.org/en-US/docs/Web/CSS/radial-gradient zu heiraten, funktioniert jedoch korrekt, wenn ich es versuche.
Chris Walsh
Dies wird bevorzugt, da kein zusätzliches Markup erforderlich ist, damit es funktioniert. Ich würde gerne eine Lösung sehen, die :: after für anpassbarere Optionen verwendet.
Jason Silver
10
input[required], select[required] {
    background-image: url('/img/star.png');
    background-repeat: no-repeat;
    background-position-x: right;
}

Das Bild hat rechts einen Abstand von 20 Pixel, um sich nicht mit dem Dropdown-Pfeil zu überlappen

Geben Sie hier die Bildbeschreibung ein

Und es sieht so aus: Geben Sie hier die Bildbeschreibung ein

Toolkit
quelle
Das ist inspirierend. Sehen Sie, wie ich vermeiden kann, ein Hintergrundbild laden zu müssen.
Henry's Cat
5

Verwenden Sie jQuery und CSS

jQuery(document).ready(function() {
 jQuery("[required]").after("<span class='required'>*</span>");
});
.required {
    position: absolute;
    margin-left: -10px;
    color: #FB0000;
    font-size: 15px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" value="xxx" required>

Falah
quelle
5

Ich denke, das ist der effiziente Weg, warum so viel Kopfschmerzen

    <div class="full-row">
     <label for="email-id">Email Address<span style="color:red">*</span></label>
  <input type="email" id="email-id" name="email-id"  ng-model="user.email" >
    </div> 
user2903536
quelle
Beachten Sie, dass die Spanne auf das Beschriftungs-Tag und nicht auf das Eingabe-Tag angewendet wird. Wenn es auf das Eingabe-Tag angewendet wird, fällt das rote Sternchen in die nächste Zeile - was die meisten Entwickler nicht möchten
MarcoZen
4

Es ist 2019 und frühere Antworten auf dieses Problem werden nicht verwendet

  1. CSS-Raster
  2. CSS-Variablen
  3. HTML5-Formularelemente
  4. SVG in CSS

Das CSS-Raster ist die Möglichkeit, Formulare im Jahr 2019 zu erstellen, da Ihre Beschriftungen Ihren Eingaben vorausgehen können, ohne dass zusätzliche Divs, Bereiche, Bereiche mit Sternchen und andere Relikte vorhanden sind.

Hier ist, wohin wir mit minimalem CSS gehen:

Beispiel-Screenshot

Der HTML-Code für die oben genannten:

<form action="https://www.example.com/register/" method="post" id="form-validate" enctype="multipart/form-data">
    <p class="form-instructions">Please enter the following information to create your account.</p>
    <label for="firstname">First name</label>
    <input type="text" id="firstname" name="firstname" value="" title="First name" maxlength="255" required="">
    <label for="lastname">Last name</label>
    <input type="text" id="lastname" name="lastname" value="" title="Last name" maxlength="255" required="">
    <label for="email_address">Email address</label>
    <input type="email" autocapitalize="off" autocorrect="off" spellcheck="false" name="email" id="email_address" value="" title="Email address" size="30" required="">
    <label for="password">Password</label>
    <input type="password" name="password" id="password" title="Password" required="">
    <label for="confirmation">Confirm password</label>
    <input type="password" name="confirmation" title="Confirm password" id="confirmation" required="">
    <input type="checkbox" name="is_subscribed" title="Subscribe to our newsletter" value="1" id="is_subscribed" class="checkbox">
    <label for="is_subscribed">Subscribe to the newsletter</label>
    <input type="checkbox" name="persistent_remember_me" id="remember_meGCJiRe0GbJ" checked="checked" title="Remember me">
    <label for="remember_meGCJiRe0GbJ">Remember me</label>
    <p class="required">* Required</p>
    <button type="submit" title="Register">Register</button>
</form>

Platzhaltertext kann ebenfalls hinzugefügt werden und wird dringend empfohlen. (Ich beantworte nur diese Zwischenform).

Nun zu den CSS-Variablen:

--icon-required: url('data:image/svg+xml,\
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="-10 -6 16 16"> \
  <line id="line" y1="-3" y2="3" stroke="%23df0000" stroke-linecap="butt" transform="rotate(15)"></line> \
  <line id="line" y1="-3" y2="3" stroke="%23df0000" stroke-linecap="butt" transform="rotate(75)"></line> \
  <line id="line" y1="-3" y2="3" stroke="%23df0000" stroke-linecap="butt" transform="rotate(-45)"></line> \
</svg>');

--icon-tick: url('data:image/svg+xml,\
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100" height="100" viewBox="-2 -2 16 16"> \
            <path fill="green" stroke-linejoin="round" d="M2 6L1 7l3 4 7-10h-1L4 8z"/> \
</svg>');

Das CSS für die Formularelemente:

input[type=text][required],
input[type=email][required],
input[type=password][required],
input[type=tel][required] {
    background-image: var(--icon-required);
    background-position-x: right;
    background-repeat: no-repeat;
    background-size: contain;
}

input:valid {
    --icon-required: var(--icon-tick);
}

Das Formular selbst sollte sich im CSS-Raster befinden:

form {
    align-items: center;
    display: grid;
    grid-gap: var(--form-grid-gap);
    grid-template-columns: var(--form-grid-template-columns);
    margin: auto;
}

Die Werte für die Spalten können auf 1fr autooder 1frmit <p>Tags festgelegt werden, die auf 1 / -1 festgelegt sind. Sie ändern die Variablen in Ihren Medienabfragen so, dass die Eingabefelder auf Mobilgeräten und wie oben auf dem Desktop in voller Breite angezeigt werden. Sie können Ihre Rasterlücke auch auf Mobilgeräten ändern, wenn Sie dies mit dem CSS-Variablenansatz wünschen.

Wenn die Kästchen gültig sind, sollten Sie anstelle des Sterns ein grünes Häkchen erhalten.

Die SVG in CSS ist eine Möglichkeit, den Browser vor einem Roundtrip zum Server zu bewahren, um ein Bild des Sternchens zu erhalten. Auf diese Weise können Sie die Sternchen fein einstellen. Die Beispiele hier befinden sich in einem ungewöhnlichen Winkel. Sie können dies herausarbeiten, da das SVG-Symbol oben vollständig lesbar ist. Das Ansichtsfeld kann auch geändert werden, um das Sternchen über oder unter der Mitte zu platzieren.

Henrys Katze
quelle
1

.asterisc {
  display: block;
  color: red;
  margin: -19px 185px;
}
<input style="width:200px">
<span class="asterisc">*</span>

Vitaly Zdanevich
quelle
0

In diesem Beispiel wird ein Sternchen vor eine Beschriftung gesetzt, um diese bestimmte Eingabe als erforderliches Feld zu kennzeichnen. Ich habe die CSS-Eigenschaften mit% und em festgelegt, um sicherzustellen, dass meine Webseite reagiert. Sie können px oder andere absolute Einheiten verwenden, wenn Sie möchten.

#name {
   display: inline-block;
   margin-left: 40%;
   font-size:25px;
    
}
.nameinput{
   margin-left: 10px;
   font-size:90%;
   width: 17em;
   
}

.nameinput::placeholder {
  font-size: 0.7em;
  vertical-align: middle;
}

#name p{
   margin:0;
   border:0;
   padding:0;
   display:inline-block;
   font-size: 40%;
   vertical-align: super;
}
<label id="name" value="name">
<p>*</p> 
Name:  <input class="nameinput" type="text" placeholder="Enter your name" required>
</label>

HARSHA UPPUTURI
quelle
Willkommen bei SO! Wenn Sie eine Antwort mit einem neuen Standpunkt platzieren, versuchen Sie, Ihre Antwort zu erklären, und nicht nur einen Code ohne Erklärung.
David García Bodego
0

Was Sie brauchen, ist: Erforderlicher Selektor - Er wählt alle Felder mit dem Attribut 'Erforderlich' aus (daher müssen keine zusätzlichen Klassen hinzugefügt werden). Dann - Stil Eingaben nach Ihren Bedürfnissen. Sie können den Selektor ': after' verwenden und ein Sternchen hinzufügen, wie unter anderen Antworten vorgeschlagen

Skiff
quelle
-1

Sie können das gewünschte Ergebnis erzielen, indem Sie den HTML-Code in ein div-Tag einkapseln, das die Klasse "required" gefolgt von der Klasse "form-group" enthält. * Dies funktioniert jedoch nur, wenn Sie über Bootstrap verfügen.

<div class="form-group required">
    <div class="required">
        <label>Name:</label>
        <input type="text">
    </div>
  <div>
Chateracks
quelle
-2

Für diejenigen, die hier landen, aber jQuery haben:

// javascript / jQuery
$("label.required").append('<span class="red-star"> *</span>')

// css
.red-star { color: red; }
Andy Hayden
quelle
Warum js verwenden, wenn Sie ohne js das gleiche Ergebnis erzielen können?
Vitaly Zdanevich
@VitalyZdanevich, weil Sie mit dieser Lösung ein unnötiges Hintergrundbild laden müssen. Außerdem habe ich bereits js (wie viele andere auch).
Andy Hayden