input:not(:placeholder-shown) ~ label selector does not work with autofill

Jen*_*iya 5 css placeholder css-selectors pseudo-class css3

I have floating placeholder in the input field.

Placeholder will appear in center when we input value has not been provided. as shown in the below screenshot (Email and password is placeholder).

在此处输入图片说明

Now when you provide the value to email it does look like below. Observer the Email and password has been pulled up when value has been provided

在此处输入图片说明

The problem occurs when browser starts auto-filling/autocomplete this value from the saved credentials on page load like username, email, password so on. see the screen shot below:

在此处输入图片说明

css

:root {
  --input-padding-x: .75rem;
  --input-padding-y: .75rem;
}

html,
body {
  height: 100%;
}

.form-signin {
  width: 100%;
  max-width: 600px;
  padding: 15px;
  margin: auto;
  padding-top: 40px;
  padding-bottom: 40px;
}

.form-label-group {
  position: relative;
  margin-bottom: 1rem;
}

.form-label-group > input,
.form-label-group > label {
  padding: var(--input-padding-y) var(--input-padding-x);
}

.form-label-group > label {
  position: absolute;
  top: 0;
  left: 0;
  display: block;
  width: 100%;
  margin-bottom: 0; /* Override default `<label>` margin */
  line-height: 1.5;
  color: #495057;
  border: 1px solid transparent;
  border-radius: .25rem;
  transition: all .1s ease-in-out;
}

.form-label-group input::-webkit-input-placeholder {
  color: transparent;
}

.form-label-group input:-ms-input-placeholder {
  color: transparent;
}

.form-label-group input::-ms-input-placeholder {
  color: transparent;
}

.form-label-group input::-moz-placeholder {
  color: transparent;
}

.form-label-group input::placeholder {
  color: transparent;
}

.form-label-group input:not(:placeholder-shown) {
  padding-top: calc(var(--input-padding-y) + var(--input-padding-y) * (2 / 3));
  padding-bottom: calc(var(--input-padding-y) / 3);
}

.form-label-group input:not(:placeholder-shown) ~ label {
  padding-top: calc(var(--input-padding-y) / 3);
  padding-bottom: calc(var(--input-padding-y) / 3);
  font-size: 12px;
  color: #777;
}
Run Code Online (Sandbox Code Playgroud)

HTML

<form class="form-signin">
    <h1 class="h3 mb-3 font-weight-normal">Please Type new password</h1>
    <div class="form-label-group">
        <input type="text" id="inputEmail" [(ngModel)]="email" name="email" class="form-control" placeholder="Email" required=""
            autofocus="">
        <label for="inputEmail">Email</label>
    </div>

    <div class="form-label-group">
        <input type="password" id="inputPassword" [(ngModel)]="password" name="password" class="form-control" placeholder="Password"
            required="">
        <label for="inputPassword">Password</label>
    </div>

    <div class="row">
      <div class="col-sm-6">
        <button class="btn btn-lg btn-primary btn-block" (click)="onSubmit()" type="button">Change password</button>
      </div>
    </div>
</form>
Run Code Online (Sandbox Code Playgroud)

I had already tried to autofocus on the email field but that did not worked. I also tried to click the element from the code after the page load but with no luck. Please help me how do I fix this.

Rak*_*san 13

这个对我有用

.form-label-group input:-webkit-autofill ~ label {
        /* CSS property  */
}
Run Code Online (Sandbox Code Playgroud)

你可以试试看


Jef*_*ard 7

我有同样的问题。在我的表单中,我使用以下选择器在以下 3 个条件中的任何一个条件下将我的标签文本移开:

  1. :focus (所以它在聚焦时不会妨碍光标)
  2. :not(:placeholder-shown) (表示“输入不为空”)
  3. :-webkit-autofill (因为 2 没有在页面刷新/自动填充时触发)

SCSS 组合是:

input {
  &:focus, &:not(:placeholder-shown), &:-webkit-autofill {
    &+label { /* Move your label */ }
  }
}
Run Code Online (Sandbox Code Playgroud)

(请注意,您placeholder=" "的输入还需要一个。)

这是一个活生生的例子:https : //codepen.io/jeffward/pen/ZdBxXd

  • 确实,愚蠢的FireFox。对于 `:-moz-autofill` 有一个非常古老的、突出的功能请求 https://bugzilla.mozilla.org/show_bug.cgi?id=740979 虽然 `:autofill` 甚至不需要,如果 `:placeholder-自动填充时显示的工作正常。:P (2认同)