Phát hiện nếu một đầu vào có văn bản trong đó bằng CSS - trên trang tôi đang truy cập và không kiểm soát?


183

Có cách nào để phát hiện xem một đầu vào có văn bản trong đó thông qua CSS không? Tôi đã thử sử dụng lớp :emptygiả, và tôi đã thử sử dụng [value=""], cả hai đều không hoạt động. Tôi dường như không thể tìm thấy một giải pháp duy nhất cho việc này.

Tôi tưởng tượng điều này phải có thể, vì chúng tôi có các lớp giả cho :checked, và :indeterminate, cả hai đều là loại tương tự.

Xin lưu ý: Tôi đang làm điều này theo phong cách "Phong cách" , không thể sử dụng JavaScript.

Cũng lưu ý rằng, Kiểu được sử dụng, phía máy khách, trên các trang mà người dùng không kiểm soát.


Tôi không chắc chắn về cách thực hiện với CSS (dù sao cũng không cập nhật nhanh). Điều này là dễ dàng với JavaScript, mặc dù.
ralph.m

Tôi không nghĩ rằng tôi có thể sử dụng JavaScript. Tôi đang làm việc theo phong cách "sành điệu". Khá chắc chắn rằng nó phải được thực hiện hoàn toàn với CSS. Nếu nó không cập nhật khi người dùng nhập văn bản, tôi đoán đây là một sự lãng phí thời gian. Không nghĩ về điều đó. Hừm. Ít nhất điều này không quan trọng đối với phong cách, nó chỉ là một điều tốt đẹp mà tôi hy vọng sẽ thêm vào.
JacobTheDev

Câu trả lời:


64

Sành điệu không thể làm điều này vì CSS không thể làm điều này. CSS không có bộ chọn (giả) cho <input>giá trị (s). Xem:

Bộ :emptychọn chỉ tham chiếu đến các nút con, không phải giá trị đầu vào.
[value=""] không làm việc; Nhưng chỉ cho trạng thái ban đầu . Điều này là do một nút value thuộc tính (mà CSS thấy), không giống như của nút value bất động sản (thay đổi bởi người dùng hoặc DOM javascript, và gửi theo mẫu dữ liệu).

Trừ khi bạn chỉ quan tâm đến trạng thái ban đầu, bạn phải sử dụng tập lệnh usercript hoặc Greasemonkey. May mắn là điều này không khó. Tập lệnh sau sẽ hoạt động trong Chrome hoặc Firefox có cài đặt Greasemonkey hoặc Scriptish hoặc trong bất kỳ trình duyệt nào hỗ trợ mô tả người dùng (ví dụ: hầu hết các trình duyệt, ngoại trừ IE).

Xem bản giới thiệu về các giới hạn của CSS cộng với giải pháp javascript tại trang jsBin này .

// ==UserScript==
// @name     _Dynamically style inputs based on whether they are blank.
// @include  http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant    GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/

var inpsToMonitor = document.querySelectorAll (
    "form[name='JustCSS'] input[name^='inp']"
);
for (var J = inpsToMonitor.length - 1;  J >= 0;  --J) {
    inpsToMonitor[J].addEventListener ("change",    adjustStyling, false);
    inpsToMonitor[J].addEventListener ("keyup",     adjustStyling, false);
    inpsToMonitor[J].addEventListener ("focus",     adjustStyling, false);
    inpsToMonitor[J].addEventListener ("blur",      adjustStyling, false);
    inpsToMonitor[J].addEventListener ("mousedown", adjustStyling, false);

    //-- Initial update. note that IE support is NOT needed.
    var evt = document.createEvent ("HTMLEvents");
    evt.initEvent ("change", false, true);
    inpsToMonitor[J].dispatchEvent (evt);
}

function adjustStyling (zEvent) {
    var inpVal  = zEvent.target.value;
    if (inpVal  &&  inpVal.replace (/^\s+|\s+$/g, "") )
        zEvent.target.style.background = "lime";
    else
        zEvent.target.style.background = "inherit";
}

Tôi sẽ xem xét điều đó. Cảm ơn.
JacobTheDev

@MartinGottweis, không phải trong trường hợp của OP. Đây là một câu hỏi [phong cách] .
Brock Adams

1
@BrockAdams, op nói rằng nó không thể sử dụng javascript, vì vậy: tùy chọn hợp lệ là một cách để đi. Tui bỏ lỡ điều gì vậy?
Martin Gottweis

1
@MartinGottweis, các :validtùy chọn đòi hỏi phải viết lại trang - đó là một cái gì đó OP không thể làm với phong cách và rằng không có câu trả lời khác hiển thị ở tất cả trong một bối cảnh duyệt. Người dùng không có quyền kiểm soát trang mà anh ta đang truy cập.
Brock Adams

263

Có thể, với các cảnh báo CSS thông thường và nếu mã HTML có thể được sửa đổi. Nếu bạn thêm requiredthuộc tính cho phần tử, thì phần tử đó sẽ khớp :invalidhoặc :validtùy theo giá trị của điều khiển có trống hay không. Nếu phần tử không có valuethuộc tính (hoặc nó có value=""), giá trị của điều khiển ban đầu trống và trở nên không trống khi bất kỳ ký tự nào (thậm chí là khoảng trắng) được nhập.

Thí dụ:

<style>
#foo { background: yellow; }
#foo:valid { outline: solid blue 2px; }
#foo:invalid { outline: solid red 2px; }
</style>
<input id=foo required>

Loại giả :valid:invalidchỉ được xác định trong các tài liệu CSS cấp Dự thảo, nhưng hỗ trợ khá phổ biến trong các trình duyệt, ngoại trừ trong IE, nó đi kèm với IE 10.

Nếu bạn muốn làm cho trống rỗng, bao gồm các giá trị chỉ bao gồm các khoảng trắng, bạn có thể thêm thuộc tính pattern=.*\S.*.

(Hiện tại) không có bộ chọn CSS để phát hiện trực tiếp liệu điều khiển đầu vào có giá trị không trống hay không, vì vậy chúng ta cần thực hiện gián tiếp, như được mô tả ở trên.

Nói chung, các bộ chọn CSS đề cập đến đánh dấu hoặc, trong một số trường hợp, thuộc tính phần tử như được đặt với tập lệnh (JavaScript phía máy khách), thay vì hành động của người dùng. Ví dụ: :emptykhớp phần tử với nội dung trống trong đánh dấu; tất cả các inputyếu tố là không thể tránh khỏi trống rỗng trong ý nghĩa này. Bộ chọn [value=""]kiểm tra xem phần tử có valuethuộc tính trong đánh dấu và có chuỗi rỗng làm giá trị của nó không. Và :checked:indeterminatenhững điều tương tự. Họ không bị ảnh hưởng bởi đầu vào người dùng thực tế.


7
Đây là một giải pháp tuyệt vời nếu và chỉ khi mọi đầu vào là bắt buộc-- nếu không, bạn sẽ gặp phải trường hợp bạn có trường nhập liệu trống nhưng hợp lệ không bị ảnh hưởng bởi kiểu không hợp lệ . JS có lẽ là người chiến thắng cho giải pháp này
AdamSchuld

6
Điều này là bẩn nhưng thông minh tuyệt vời. Không phải là một giải pháp cho câu hỏi, nhưng nó chắc chắn đã lừa tôi
ngày 1

1
Dung dịch bẩn. Lưu ý rằng điều này có thể gây ra sự cố với tự động hoàn tất trong Chrome nếu bạn cố gắng thêm logic hiển thị nhãn dựa trên HOẶC nếu thực sự không bắt buộc và biểu mẫu có xác thực dựa trên điều này
Artjom Kurapov

1
Về mặt ngữ nghĩa, điều này là sai. Như đã đề cập trong các nhận xét trước đây, một số đầu vào có thể là tùy chọn và requiredthuộc tính có thể ngăn việc gửi biểu mẫu.
zhenming

1
Đã thêm novalidatethuộc tính vào <form>phần tử để không phải lo lắng về hiển thị màu đỏ khi trường trống sau khi điền một lần:<form ... novalidate> <input ... required /> </form>
Alcalyn

226

Bạn có thể sử dụng :placeholder-shownlớp giả. Về mặt kỹ thuật, cần có một trình giữ chỗ, nhưng bạn có thể sử dụng một khoảng trắng để thay thế.

input:not(:placeholder-shown) {
  border-color: green;
}

input:placeholder-shown {
  border-color: red;
}
<input placeholder="Text is required" />
<input placeholder=" " value="This one is valid" />
<input placeholder=" " />


10
Điều này hoàn toàn không được IE hoặc Firefox hỗ trợ. Nguồn: caniuse.com/#feat=css-placeholder-shown
Sean Dawson

2
Câu trả lời tuyệt vời. Hỗ trợ trình duyệt rất tệ, nhưng nếu một polyfill xuất hiện :placeholder-shownthì đây sẽ trở thành câu trả lời được chấp nhận. Các requiredphương pháp không tính đến trường hợp tài khoản của rìa. Cần lưu ý rằng bạn có thể chuyển một không gian cho một trình giữ chỗ và phương pháp này sẽ vẫn hoạt động. Thanh danh.
corysimmons

5
Nhược điểm khác của điều này là bạn dường như cần phải có một trình giữ chỗ. Nói cách khác, input:not(:placeholder-shown)sẽ luôn khớp <input/>ngay cả khi không có giá trị.
redbmk

5
Đối với tôi nó hoạt động trong Chrome, Firefox và Safari. Không có trong IE11.
J0ANMM ngày

1
@redbmk như corysimmons đã đề cập, Cần lưu ý rằng bạn có thể chuyển một khoảng trắng cho trình giữ chỗ và phương thức này sẽ vẫn hoạt động.
Naeem Baghi

32
<input onkeyup="this.setAttribute('value', this.value);" />

input[value=""]

sẽ làm việc :-)

chỉnh sửa: http://jsfiddle.net/XwZR2/


23
Đó có phải là CSS không? Nó trông giống như HTML và Javascript (nhưng tôi có thể bị nhầm lẫn).
jww

Brook Adams đã viết: [value = ""] không hoạt động; Nhưng chỉ cho trạng thái ban đầu. Điều này là do thuộc tính giá trị của nút (CSS nhìn thấy), không giống với thuộc tính giá trị của nút (Được thay đổi bởi người dùng hoặc DOM javascript và được gửi dưới dạng dữ liệu biểu mẫu). -> Điều kỳ diệu là cập nhật thuộc tính giá trị khi thay đổi: jsfiddle.net/XwZR2
Tom D.

2
@ Jánosweisz không nó sẽ không. Trình xử lý đó sẽ được đặt trước khi tập lệnh có thể thao tác phần tử đó và nó có thể hoạt động cùng với trình xử lý được thêm bằng addEventListener.
Dinoboff

1
Rõ ràng, onkeyup chỉ chăm sóc đầu vào bàn phím. Tuy nhiên, đừng quên rằng bạn có thể dán văn bản vào hộp nhập bằng chuột. Dùng thử: Sao chép một số văn bản vào bảng tạm của bạn và sau đó nhấp chuột phải vào đầu vào và nhấp Dán. Xem CSS KHÔNG hoạt động. Tương tự với văn bản kéo và thả vào hộp nhập bằng chuột.
beluga

4
input[value]:not([value=""])- tốt hơn. Cảm ơn tất cả. codepen.io/iegik/pen/ObZpqo
iegik

29

Về cơ bản những gì mọi người đang tìm kiếm là:

ÍT HƠN:

input:focus:required{
    &:invalid{ color: red; border-color: red; box-shadow: 0 0 6px red;}
    &:valid,
    &:placeholder-shown{ border-color: green; box-shadow: 0 0 8px green;}
}

CSS thuần túy:

input:focus:required:invalid{ color: red; border-color: red; box-shadow: 0 0 6px red;}
input:focus:required:valid,
input:focus:required:placeholder-shown{ border-color: green; box-shadow: 0 0 8px green;}

1
Bạn rõ ràng vừa sử dụng giải pháp làm việc và bạn đã nhận được 0 phiếu bầu lên?
ProNOOB

5
Câu trả lời tuyệt vời. Tuy nhiên, lớp giả được hiển thị giữ chỗ không hoạt động trong IE hoặc Edge, vì vậy nó không phải là một giải pháp hoàn chỉnh. Mặc dù vậy, nó rất gần, và nó khiến tôi muốn giết Edge vì không hỗ trợ nó. IE tôi có thể chấp nhận, nhưng Edge? Thôi nào Microsoft!
Aaron Martin-Colby

2
Đây không phải là một giải pháp css thuần túy nếu bạn phải thêm "bắt buộc" vào html của mình
user1566694

Cảm ơn bạn, thưa ngài, tôi chân thành hy vọng điều này sẽ tăng lên vì theo tôi đây là điều mà hầu hết mọi người thực sự muốn.
sivi911

18

Bạn có thể sử dụng placeholderthủ thuật như được viết ở trên trường w / o required.

Vấn đề requiredlà khi bạn viết một cái gì đó, sau đó xóa nó - đầu vào bây giờ sẽ luôn có màu đỏ như một phần của thông số HTML5 - thì bạn sẽ cần một CSS như được viết ở trên để sửa / ghi đè lên nó.

Bạn có thể làm điều đơn giản required

<input type="text" placeholder="filter here" id="mytest" />

CSS

#mytest:placeholder-shown {
/* if placeholder is shown - meaning - no value in input */
  border: black 1px solid;
  color: black;
}
#mytest {
  /* placeholder isn't shown - we have a value in input */
  border: red 1px solid;
  color: red;
}

Bút mã: https://codepen.io/arlevi/pen/LBgXjZ


1
Cách tiếp cận này là một sự phù hợp hoàn hảo cho trường hợp sử dụng của tôi. Tôi đã có các bộ lọc tìm kiếm có trình giữ chỗ và tôi muốn đường viền của hộp đầu vào được tô sáng khi có giá trị.
Stephen T Inkbee

7

Css đơn giản:

input[value]:not([value=""])

Mã này sẽ áp dụng css đã cho khi tải trang nếu đầu vào được lấp đầy.


9
Điều này chỉ hoạt động trên tải trang. Không động gõ một giá trị.
Ben Racicot

Vấn đề tải trang nên được lưu ý rõ ràng cho câu trả lời này.
Bryce Snyder

6

Bạn có thể định kiểu input[type=text]khác nhau tùy thuộc vào việc đầu vào có văn bản hay không bằng cách tạo kiểu giữ chỗ. Đây không phải là một tiêu chuẩn chính thức tại thời điểm này nhưng có hỗ trợ trình duyệt rộng, mặc dù với các tiền tố khác nhau:

input[type=text] {
    color: red;
}
input[type=text]:-moz-placeholder {
    color: green;
}
input[type=text]::-moz-placeholder {
    color: green;
}
input[type=text]:-ms-input-placeholder {
    color: green;
}
input[type=text]::-webkit-input-placeholder {
    color: green;
}

Ví dụ: http://fiddlesalad.com/scss/input-placeholder-css


FYI, điều này đáng tin cậy định dạng giữ chỗ, nhưng chỉ chính nó giữ chỗ. Điều này cung cấp cho bạn một ảo ảnh về việc thay đổi màu văn bản, nhưng đó là trường hợp, chỉ với màu xám và đen theo mặc định.
John Weisz

Tất cả CSS là một ảo ảnh rẻ tiền, bạn chỉ thay đổi ngoại hình mà không ảnh hưởng đến nội dung thực tế :-)
vbraun 18/2/2015

Đây chính xác là những gì tôi cần. Tôi yêu cầu đầu vào thay đổi kiểu nếu nó có văn bản là thiết kế cho trình giữ chỗ khác với kiểu đầu vào. Hoàn hảo!
Christopher Marshall

Điều này làm việc cho nền, nhưng không biên giới. Tôi đã không đào quá sâu vào việc cố gắng thay đổi biên giới.
majinnaibu

5

Sử dụng JS và CSS: không phải giả

 input {
        font-size: 13px;
        padding: 5px;
        width: 100px;
    }

    input[value=""] {
        border: 2px solid #fa0000;
    }

    input:not([value=""]) {
        border: 2px solid #fafa00;
    }
<input type="text" onkeyup="this.setAttribute('value', this.value);" value="" />

   


3

Bộ chọn hợp lệ sẽ thực hiện thủ thuật.

<input type="text" class="myText" required="required" />

.myText {
    //default style of input
}
.myText:valid {
    //style when input has text
}

3

Bạn có thể tận dụng trình giữ chỗ và sử dụng:

input:not(:placeholder-shown) {
  border: 1px solid red;
}

1

Thủ thuật đơn giản với jQuery và CSS Giống như vậy:

JQuery:

$('input[value=""]').addClass('empty');
        $('input').keyup(function(){
            if( $(this).val() == ""){
                $(this).addClass("empty");
            }else{
                $(this).removeClass("empty");
            }
        });

CSS:

input.empty:valid{
        box-shadow: none;
        background-image: none;
        border: 1px solid #000;
    }

    input:invalid,
    input:required {
        box-shadow: 3px 1px 5px rgba(200, 0, 0, 0.85);
        border: 1px solid rgb(200,0,0);
    }




    input:valid{
        box-shadow: none;
        border: 1px solid #0f0;
    }

1

làm điều đó trên phần HTML như thế này:

<input type="text" name="Example" placeholder="Example" required/>

Tham số bắt buộc sẽ yêu cầu nó phải có văn bản trong trường đầu vào để hợp lệ.


Điều này không giúp phát hiện liệu đầu vào có văn bản trong đó bằng CSS hay không, đó là câu hỏi.
Jukka K. Korpela

Xin lỗi, nó thực sự có ích ... Nó làm cho nó có thể sử dụng các lớp giả, như được giải thích trong câu trả lời của tôi.
Jukka K. Korpela

1
Đây là một câu hỏi thời trang - có nghĩa là OP không thể kiểm soát hoặc thay đổi trang đích. Anh ta chỉ nhìn thấy trang phía khách hàng.
Brock Adams

3
Điều này rất hữu ích, đây là một ví dụ về những gì Xedret đang nói về: codepen.io/tolmark12/pen/LsBvf
tolmark 14/214

****** <input cần> && đầu vào: hợp lệ {...} ******
FremyCompany

0

Đúng! bạn có thể làm điều đó với thuộc tính cơ bản đơn giản với bộ chọn giá trị.

Sử dụng bộ chọn thuộc tính với giá trị trống và áp dụng thuộc tính input[value='']

input[value=''] {
    background: red;
}

-6

Điều này là không thể với css. Để thực hiện điều này, bạn sẽ phải sử dụng JavaScript (ví dụ $("#input").val() == "").


2
Tôi biết làm thế nào để làm điều đó, tôi cần phải làm điều đó với CSS. Xin vui lòng đọc các ý kiến ​​về bài viết gốc. Tôi đang xây dựng một phong cách "Phong cách", không thể sử dụng JavaScript, theo hiểu biết của tôi.
JacobTheDev
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.