Sử dụng CSS để tự động thêm dấu hoa thị 'trường bắt buộc' để tạo đầu vào


133

Cách tốt để khắc phục sự thật đáng tiếc là mã này sẽ không hoạt động như mong muốn:

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

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

Trong một thế giới hoàn hảo, tất cả các yêu cầu inputsẽ có dấu hoa thị nhỏ cho biết trường là bắt buộc. Giải pháp này là không thể vì CSS được chèn vào sau nội dung phần tử, không phải sau chính phần tử, nhưng một cái gì đó giống như nó sẽ là lý tưởng. Trên một trang web có hàng ngàn trường bắt buộc, tôi có thể di chuyển dấu hoa thị phía trước đầu vào với một thay đổi thành một dòng ( :afterđến :before) hoặc tôi có thể di chuyển nó đến cuối nhãn (.required label:after ) hoặc trước nhãn hoặc đến một vị trí trên hộp chứa, v.v ...

Điều này rất quan trọng không chỉ trong trường hợp tôi thay đổi suy nghĩ về nơi đặt dấu sao ở mọi nơi, mà còn cho các trường hợp kỳ lạ khi bố cục biểu mẫu không cho phép dấu hoa thị ở vị trí chuẩn. Nó cũng chơi tốt với xác nhận kiểm tra biểu mẫu hoặc tô sáng các điều khiển hoàn thành không đúng.

Cuối cùng, nó không thêm đánh dấu bổ sung.

Có giải pháp tốt nào có tất cả hoặc hầu hết các lợi thế của mã không thể?


có lẽ áp dụng một hình ảnh nền của một dấu sao?
Valamas

Để làm cho trường đầu vào thực sự cần thiết , hãy thêm requiredthuộc tính vào <input... developer.mozilla.org/en-US/docs/Web/HTML/Euity/input/
Kẻ

Câu trả lời:


229

Đó có phải là những gì bạn có trong tâm trí?

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

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

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

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


2
Đó là một giải pháp tốt trong nhiều tình huống, tuy nhiên nó không hoạt động nếu định vị tuyệt đối hoặc phao được sử dụng để sắp xếp các biểu mẫu (ví dụ: jsfiddle.net/erqrN/2 ). Tôi thực sự đang sử dụng định vị tuyệt đối để sắp xếp các hình thức của tôi. Tôi hoàn toàn có thể định vị *nhưng điều đó có nghĩa là tôi sẽ phải đặt khoảng cách theo cách thủ công cho mỗi độ dài của hình thức nhập và sẽ không thể có bất kỳ đầu vào linh hoạt nào.
brentonstrine

4
@brentonstrine Các tỷ lệ cược là, bạn không nên sử dụng định vị tuyệt đối để sắp xếp các biểu mẫu của mình. Mặc dù thường được sử dụng, định vị tuyệt đối không đáp ứng (trừ khi bạn có chế độ mã hóa DOM khi thay đổi kích thước) trong khi các hiệu ứng tương tự luôn có thể đạt được bằng cách sử dụng vị trí tĩnh hoặc tương đối, có thể đáp ứng trong thiết kế. Độc giả, xin vui lòng tránh sử dụng các phong cách như định vị tuyệt đối trên những thứ như các yếu tố hình thức, vì đây là một cách tiếp cận khá cổ xưa để định vị. Tôi biết bình luận của bạn đã rất cũ, nhưng điều này là dành cho độc giả.
WebWanderer

Dấu hoa thị không xuất hiện bằng Lynx , đây có thể là một vấn đề về khả năng truy cập.
Dave Jarvis

Tôi có thể đặt cái này trong .css của tôi không? Nếu có, bạn có thể vui lòng cho một ví dụ? Tôi không biết rằng : cú pháp
Leonardo Maffei


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

Fiddle với cấu trúc chính xác của bạn: http://jsfiddle.net/bQ859/


Bạn vẫn cần các lớp trên nhãn của mình, thực sự cách duy nhất để giữ cấu trúc tài liệu gọn gàng là phương thức ảnh nền. Mặc dù súc tích.
Henry's Cat

37

Mặc dù đây là câu trả lời được chấp nhận, xin vui lòng bỏ qua tôi và sử dụng :aftercú pháp được đề xuất bên dưới. Giải pháp của tôi là không thể truy cập.


Một kết quả tương tự có thể đạt được bằng cách sử dụng hình ảnh nền của hình ảnh dấu hoa thị và đặt nền của nhãn / đầu vào / div bên ngoài và phần đệm kích thước của hình ảnh dấu hoa thị. Một cái gì đó như thế này:

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

Điều này sẽ đặt dấu hoa thị bên trong hộp văn bản, nhưng đặt tương tự div.requiredthay vì .required inputcó thể sẽ là những gì bạn đang tìm kiếm, nếu một chút thanh lịch.

Phương pháp này không yêu cầu đầu vào bổ sung.


5
Tuy nhiên, điều đáng chú ý là điều này không thân thiện với người đọc màn hình. Về mặt này, câu trả lời của Max tốt hơn nhiều. Trong thực tế, trong hầu hết các trường hợp, câu trả lời của Max là lý tưởng hơn - chỉ không dành cho OP.
jaypeagi

20

Để đặt chính xác đầu vào INTO như được hiển thị trên hình ảnh sau:

nhập mô tả hình ảnh ở đây

Tôi tìm thấy cách tiếp cận sau:

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

Trang web mà tôi làm việc được mã hóa bằng cách sử dụng bố cục cố định vì vậy nó ổn với tôi.

Tôi không chắc chắn rằng nó tốt cho thiết kế chất lỏng.


vâng, nó trông giống nhau Sự khác biệt là anh ấy đã sử dụng hình nền. (hoặc tôi đã hiểu nhầm điều gì đó)
Tebe

2
thêm đánh dấu nhịp trống cho một cái gì đó như thế này đánh bại toàn bộ điểm của css, phải không?
Jason Silver

1
span không tốn kém gì, đó là một mẹo phổ biến để đơn giản hóa những thứ được tìm thấy khá thường xuyên giữa số lượng lớn các thư viện tôi đã thấy
Tebe

14

viết bằng CSS

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

và HTML

<div class="form-group required">

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

    <input type="text">

</div>

Tôi nghĩ cách tiếp cận của bạn chỉ hoạt động nếu bạn chỉ định lớp nhãn điều khiển trong thẻ nhãn như thế nào <label class="control-label">...</label>. Nhưng nó thực hiện công việc (Y)
MarcoLe

Tôi chỉ đưa cho bạn mẫu ví dụ mục đích kiểm soát nhãn hiệu câu chuyện
Mr.creep

Điều này có cú pháp phần tử giả cũ hơn cộng với không cần súp div. Tôi đã thêm một câu trả lời giữ cho mẫu div và lớp miễn phí.
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;
}

Tại sao có hai radial-gradientđiều khoản trên background-image? Tôi không thể có được cú pháp này để kết hôn với developer.mozilla.org/en-US/docs/Web/CSS/radial-gradient tuy nhiên hoạt động chính xác khi tôi thử nó.
Chris Walsh

Điều này được ưa thích vì nó không yêu cầu bất kỳ đánh dấu bổ sung nào để làm cho nó hoạt động. Tuy nhiên, tôi muốn thấy một giải pháp sử dụng :: cho các tùy chọn tùy chỉnh hơn.
Jason Silver

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

Hình ảnh có khoảng trống 20px ở bên phải không trùng với mũi tên thả xuống được chọn

nhập mô tả hình ảnh ở đây

Và nó trông như thế này: nhập mô tả hình ảnh ở đây


Đây là cảm hứng, xem cách của tôi để tránh phải tải một hình ảnh nền.
Henry's Cat

5

Sử dụng jQuery và 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

Tôi nghĩ rằng đây là cách hiệu quả để làm, tại sao rất đau đầu

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

Lưu ý nhịp được áp dụng cho thẻ nhãn chứ không phải thẻ đầu vào. Nếu được thêm vào thẻ đầu vào, dấu sao màu đỏ sẽ rơi xuống dòng tiếp theo - đó không phải là điều mà hầu hết các nhà phát triển muốn
MarcoZen

5

Đó là năm 2019 và các câu trả lời trước cho vấn đề này không được sử dụng

  1. Lưới CSS
  2. Biến CSS
  3. Các yếu tố hình thức HTML5
  4. SVG trong CSS

Lưới CSS là cách để thực hiện các biểu mẫu vào năm 2019 vì bạn có thể có các nhãn của mình trước các đầu vào của bạn mà không cần thêm div, spans, spans với dấu hoa thị và các thánh tích khác.

Đây là nơi chúng ta sẽ thực hiện với CSS tối thiểu:

Ảnh chụp màn hình ví dụ

HTML cho ở trên:

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

Văn bản giữ chỗ cũng có thể được thêm vào và rất khuyến khích. (Tôi chỉ trả lời mẫu giữa này).

Bây giờ cho các biến 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 cho các thành phần của biểu mẫu:

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

Bản thân biểu mẫu phải ở dạng lưới CSS:

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

Các giá trị cho các cột có thể được đặt thành 1fr autohoặc 1frvới bất kỳ thứ gì như<p> các thẻ trong biểu mẫu được đặt thành nhịp 1 / -1. Bạn thay đổi các biến trong các truy vấn phương tiện để bạn có các hộp đầu vào có chiều rộng đầy đủ trên thiết bị di động và như trên trên máy tính để bàn. Bạn cũng có thể thay đổi khoảng cách lưới của mình trên thiết bị di động nếu bạn muốn bằng cách sử dụng phương pháp biến CSS.

Khi các hộp hợp lệ thì bạn nên đánh dấu màu xanh lá cây thay vì dấu hoa thị.

SVG trong CSS là một cách để tiết kiệm trình duyệt khỏi phải thực hiện một chuyến đi khứ hồi đến máy chủ để có được hình ảnh của dấu hoa thị. Theo cách này, bạn có thể tinh chỉnh các dấu sao, các ví dụ ở đây là ở một góc độ khác thường, bạn có thể chỉnh sửa điều này vì biểu tượng SVG ở trên hoàn toàn có thể đọc được. Hộp ngắm cũng có thể được sửa đổi để đặt dấu hoa thị phía trên hoặc bên dưới trung tâm.



0

Ví dụ này đặt biểu tượng dấu hoa thị trước nhãn để biểu thị đầu vào cụ thể đó là trường bắt buộc. Tôi đặt các thuộc tính CSS bằng% và em để đảm bảo trang web của tôi phản hồi nhanh. Bạn có thể sử dụng px hoặc các đơn vị tuyệt đối khác nếu bạn muốn.

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


Chào mừng đến với SO! Khi bạn đặt câu trả lời với một điểm mới cho chế độ xem, hãy cố gắng giải thích câu trả lời của bạn, không chỉ đặt mã mà không giải thích.
David García Bodego

0

Những gì bạn cần là: bộ chọn bắt buộc - nó sẽ chọn tất cả các trường có thuộc tính 'bắt buộc' (vì vậy không cần thêm bất kỳ lớp bổ sung nào). Sau đó - phong cách đầu vào theo nhu cầu của bạn. Bạn có thể sử dụng bộ chọn ': after' và thêm dấu hoa thị theo cách được đề xuất trong số các câu trả lời khác


-1

Bạn có thể đạt được kết quả mong muốn bằng cách đóng gói mã HTML trong thẻ div chứa lớp "bắt buộc" theo sau là lớp "nhóm biểu mẫu". * Tuy nhiên, điều này chỉ hoạt động nếu bạn có Bootstrap.

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

-2

Đối với những người kết thúc ở đây, nhưng có jQuery:

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

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

Tại sao sử dụng js nếu bạn có thể đạt được kết quả tương tự mà không cần js?
Vitaly Zdanevich

@VitalyZdanevich vì bạn cần tải một hình nền không cần thiết với giải pháp đó. Ngoài ra, tôi đã có js rồi (như nhiều người khác cũng vậy).
Andy Hayden
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.