Використовуйте CSS для автоматичного додавання зірочки "обов'язкове поле" для формування входів


133

Який хороший спосіб подолати нещасний факт, що цей код не спрацює як слід:

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

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

У ідеальному світі всі необхідні inputs отримали б маленьку зірочку, яка вказує на необхідність поля. Це рішення неможливе, оскільки CSS вставляється після вмісту елемента, не після самого елемента, а щось подібне було б ідеально. На сайті з тисячами необхідних полів я можу перемістити зірочку перед входом однією зміною в один рядок ( :afterдо :before) або можу перемістити її до кінця мітки ( .required label:after) або перед міткою, або до положення на поле, що містить, і т.д. ...

Це важливо не лише в тому випадку, якщо я передумав, де розмістити зірочку скрізь, але також і для непарних випадків, коли макет форми не дозволяє зірочку в стандартному положенні. Він також добре поєднується з валідацією, яка перевіряє форму або виділяє неправильно виконані елементи управління.

Нарешті, це не додає додаткової розмітки.

Чи є якісь хороші рішення, які мають усі або більшість переваг неможливого коду?


можливо застосувати фонове зображення зірочки?
Валамас

Щоб поле для введення було дійсно необхідним , додайте requiredатрибут <input... developer.mozilla.org/en-US/docs/Web/HTML/Element/input/…
tomByrer

Відповіді:


230

Це те, що ти мав на увазі?

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

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

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

Дивіться https://developer.mozilla.org/en-US/docs/Web/CSS/pseudo-elements


2
Це хороше рішення у багатьох ситуаціях, однак воно не спрацьовує, якщо для вирівнювання форм використовується абсолютне позиціонування чи плавання (наприклад, jsfiddle.net/erqrN/2 ). Я фактично використовую абсолютне позиціонування для вирівнювання моїх форм. Я можу абсолютно позиціонувати, *але це означатиме, що мені доведеться вручну розміщувати відстань на кожну довжину введення форми, і я не зможу мати гнучких даних.
brentonstrine

4
@brentonstrine Коефіцієнти є, ви не повинні використовувати абсолютне позиціонування для вирівнювання форм. Хоча зазвичай використовується абсолютне позиціонування не реагує (якщо у вас JS не моделює DOM на розмір), тоді як ті самі ефекти завжди можна досягти, використовуючи статичне або відносне положення, яке може бути чуйним у дизайні. Читачі, будь ласка, уникайте використання таких стилів, як абсолютне позиціонування на таких речах, як елементи форми, оскільки це досить архаїчний підхід до позиціонування. Я знаю, що ваш коментар був дуже старим, але це для читачів.
WebWanderer

Зірочка не з’являється за допомогою Lynx , що може бути проблемою доступності.
Дейв Джарвіс

чи можу я поставити це у свій .css? Якщо так, чи можете ви надати приклад? Я цього не знав : синтаксис
Леонардо Маффей


68
.required label {
    font-weight: bold;
}
.required label:after {
    color: #e32;
    content: ' *';
    display:inline;
}

Погляньте на вашу точну структуру: http://jsfiddle.net/bQ859/


Вам все ще потрібні заняття на ваших етикетках, адже єдиний спосіб зберегти структуру документа акуратним - це метод фонового зображення. Короткий, хоча.
Кіт Генріха

37

Хоча це прийнята відповідь, будь ласка, проігноруйте мене та використовуйте :afterзапропонований нижче синтаксис. Моє рішення недоступне.


Подібного результату можна досягти, використовуючи фонове зображення зображення зірочки та встановивши фон етикетки / вводу / зовнішнього діва та накладки розміру зображення зірочки. Щось на зразок цього:

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

Це помістить зірочку ВНУТРИ текстове поле, але надягати її div.requiredзамість цього .required input, ймовірно, буде більше, що ви шукаєте, якщо трохи менш елегантним.

Цей метод не потребує додаткового введення.


5
Однак варто зазначити, що це не дуже привабливо для читання екрана. Відповідь Макса в цьому відношенні набагато краща. Насправді у більшості випадків відповідь Макса є більш ідеальною - просто не для ОП.
jaypeagi

20

Щоб встановити його саме INTO, як це показано на наступному зображенні:

введіть тут опис зображення

Я знайшов такий підхід:

.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> 

Сайт, на якому я працюю, кодується за допомогою фіксованого макета, щоб для мене це було нормально.

Я не впевнений, що це добре для рідкого дизайну.


так, це виглядає так само. Різниця полягає в тому, що він використовував фонове зображення. (або я щось неправильно зрозумів)
Тебе,

2
додавання порожньої розмітної розмітки для чогось подібного перемагає всю точку css, чи не так?
Джейсон Сілвер

1
Простір нічого не коштує, це звичайний трюк, щоб спростити речі, які часто зустрічаються серед величезної кількості бібліотек, яких я бачив
Tebe

14

пишіть у CSS

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

та HTML

<div class="form-group required">

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

    <input type="text">

</div>

Я думаю, що ваш підхід працює лише в тому випадку, якщо ви призначаєте клас контрольних міток у тезі label, як <label class="control-label">...</label>. Але це робить роботу (Y)
MarcoLe

Я дав вам лише зразок прикладу цільової контрольної мітки Mr.creep-story
Kondal,

У цьому є старший синтаксис псевдоелементів, плюс немає необхідності в супі діва. Я додав відповідь, яка зберігає форму діва та класу безкоштовно.
Кіт Генріха

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;
}

чому існують два radial-gradientтерміни background-image? Я не можу змусити цей синтаксис одружитися з developer.mozilla.org/en-US/docs/Web/CSS/radial-gradient, проте я працюю правильно, коли я його намагаюся.
Кріс Уолш

Це бажано, оскільки для його роботи не потрібна додаткова розмітка. Однак я хотів би побачити рішення, яке використовувало :: after для більш налаштованих варіантів.
Джейсон Сілвер

10
input[required], select[required] {
    background-image: url('/img/star.png');
    background-repeat: no-repeat;
    background-position-x: right;
}

Зображення має деякий пробіл у 20 пікселів праворуч, щоб не перекриватися стрілкою, що випадає

введіть тут опис зображення

І це виглядає приблизно так: введіть тут опис зображення


Це надихає, дивіться, як я уникаю завантажувати фонове зображення.
Кіт Генріха

5

Використовуйте jQuery та 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>


5

Я думаю, що це ефективний спосіб зробити, чому так сильно болить голова

    <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> 

Зверніть увагу, що проміжок застосовано до мітки мітки, а не до тегу введення. Якщо додано тег для введення, червона зірочка переходить до наступного рядка - що не те, чого хотіла б більшість
дияволів

5

Саме 2019 рік і попередні відповіді на цю проблему не використовують

  1. CSS сітка
  2. Змінні CSS
  3. Елементи форми HTML5
  4. SVG у CSS

CSS сітка - це спосіб робити форми в 2019 році, оскільки ви можете мати мітки, що передують вашим введенням, не маючи зайвих знаків, прольотів, прольотів із зірочками та інших реліквій.

Ось, де ми йдемо з мінімальною CSS:

Приклад скріншоту

HTML для вищезазначеного:

<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>

Текст заповнювача також може бути доданий і настійно рекомендується. (Я просто відповідаю на цю середину форми).

Тепер для змінних CSS:

--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>');

CSS для елементів форми:

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);
}

Сама форма повинна бути в сітці CSS:

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

Значення стовпців можна встановити на 1fr autoабо 1frз будь-чим, наприклад, <p>тегами у формі, встановленій для проміжку 1 / -1. Ви змінюєте змінні у ваших медіа-запитах, щоб у вас було поле для введення на повній ширині на мобільному і відповідно до вище на робочому столі. Ви також можете змінити розрив сітки на мобільному, якщо хочете, використовуючи підхід змінних CSS.

Якщо вікна дійсні, ви повинні отримати зелений галочку замість зірочки.

SVG в CSS - це спосіб врятувати браузер від необхідності об’їзду до сервера, щоб отримати зображення зірочки. Таким чином ви зможете точно налаштувати зірочки, приклади тут під незвичним кутом, ви можете відредагувати це, оскільки значок SVG, наведений вище, повністю читабельний. Вікно перегляду також може бути змінено, щоб розмістити зірочку вище або нижче центру.



0

Цей приклад ставить символ зірочки перед міткою для позначення конкретного введення як обов'язкового поля. Я встановлюю властивості CSS за допомогою% та em, щоб переконатися, що моя веб-сторінка відповідає. Ви можете використовувати px або інші абсолютні одиниці, якщо хочете.

#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>


Ласкаво просимо до SO! Коли ви розміщуєте відповідь з новою точкою перегляду, спробуйте пояснити свою відповідь, а не просто розміщуйте код без пояснень.
Девід Гарсія Бодего

0

Вам потрібно: необхідний селектор - він вибере всі поля з атрибутом 'обов’язково' (тому немає необхідності додавати додаткові класи). Потім - введіть стиль відповідно до ваших потреб. Ви можете використовувати селектор ": after" та додати зірочку у спосіб, запропонований серед інших відповідей


-1

Ви можете досягти бажаного результату, інкапсулюючи HTML-код у тег div, який містить клас "необхідний", а потім клас "форма-група".

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

-2

Для тих, хто опинився тут, але має jQuery:

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

// css
.red-star { color: red; }

Навіщо використовувати js, якщо ви можете досягти такого ж результату без js?
Віталій Зданевич,

@VitalyZdanevich, оскільки вам потрібно завантажити це непотрібне фонове зображення з цим рішенням. Також у мене вже є js (як і багато інших).
Енді Хейден
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.