css 如何像我的其他引导浮动标签元素一样设计Stripe.js自定义元素

0sgqnhkj  于 2023-03-09  发布在  其他
关注(0)|答案(2)|浏览(162)

bounty将在4天后过期。回答此问题可获得+200声望奖励。user1186050正在查找规范答案:如果你能修改Stackblitz,使元素占位符在聚焦时浮动,文本在不聚焦时隐藏,在聚焦时显示,就像Bootstrap浮动标签一样,我会奖励你的分数

我想用浮动标签来设计我的Stripe.js元素(卡号、Cvc、有效期),以与我的其他引导浮动标签保持一致。我使用ngx-stripe作为Stripe.js的 Package 器。我已经能够使它们看起来与我的其他引导元素相似,但当这里给出焦点时,它们不会浮动。
Stripe在这里有一些关于浮动标签外观的信息,但是在尝试了不同的东西之后,什么都没有改变!所以我可能没有正确地使用它,或者我的引导类可能会干扰Stripe CSS?

  1. https://stripe.com/docs/elements/appearance-api?platform=web#form-inputs---floating-labels
  2. https://stripe.com/docs/elements/appearance-api?platform=web#others
    下面是使用bootstrap的浮点类时卡号元素的样子:
<div class="form-floating mb-3">
  <div id="floatingNumber" class="form-control stripe-form-control" placeholder="ex. 1111 1111 1111 1111"></div>
  <label for="floatingNumber">Card Number</label>
</div>

图片来自我的Stackblitz

你可以看到标签和文本的位置是固定的,它们不会浮动。
这是我的Stackblitz已经设置好了。这是我尝试的。
1.添加了引导浮动类
1.在创建条纹元素时,我添加了外观:外观中的{ labels:'floating' }
1.添加了“stripe-form-control”作为类-可在Stripe网站上找到

fumotvh3

fumotvh31#

我不是一个Maven,在Angular ,引导,或条纹,但我只是阅读文件。
首先,为了使引导浮动标签工作,它要求<input><label>兄弟,因为浮动标签将工作,因为:placeholder-shown伪元素。这里的问题是,你的挂载条带元素不是一个输入,他们成为一个输入 Package iframe,所以引导浮动标签不会工作,没有一些调整。
其次,您提到了stripe API文档,其中说明我们可以使用{ labels: 'floating' },但在尝试之后,发现它仅适用于作为 Package 载的元素(不确定它的名称),其中一个元素是address,它之所以有效,是因为标签位于iframe内部(我在下面的Stackblitz链接上附上了证明)。然后,为了在挂载的元素上使用标签,我们必须使用this method。不幸的是,该方法没有将标签注入到iframe内部,它仍然在外部。因此外观API中的浮动标签无法工作。
尽管在iframe内部,但幸运的是,输入仍然可以在iframe外部更改类(它可以给予StripeElement--focusStripeElement--completeStripeElement--invalid),因此我们可以模仿引导浮动标签的行为,并通过复制引导行为将其实现到我们的定制代码中。
我能想到的最简单的解决方案是添加以下CSS:

...
/* reset the original behavior of the floating labels for #custom-inputs */
#custom-inputs .form-floating > .form-control:focus ~ label,
#custom-inputs .form-floating > .form-control:not(:placeholder-shown) ~ label {
  opacity: 1;
  transform: scale(1) translateY(0) translateX(0);
}

/* mimic the behavior of bootstrap floating labels for #custom-inputs */
#custom-inputs .form-floating > .form-control.StripeElement--focus ~ label,
#custom-inputs .form-floating > .form-control.StripeElement--complete ~ label,
#custom-inputs .form-floating > .form-control.StripeElement--invalid ~ label {
  opacity: 0.8;
  transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);
}

#custom-inputs .StripeElement--focus {
  color: #212529;
  background-color: #fff;
  border-color: #86b7fe;
  outline: 0;
  box-shadow: 0 0 0 0.25rem rgb(13 110 253 / 25%);
}
...

然后清空占位符(因为我们要使用浮动标签):

...
      if (!this.cardNumber) {
        this.cardNumber = this.elements.create('cardNumber', {
          ...this.emptyOptions,
          placeholder: '',
        });
        this.cardNumber.mount('#floatingNumber');
      }
      if (!this.cardCvc) {
        this.cardCvc = this.elements.create('cardCvc', {
          ...this.emptyOptions,
          placeholder: '',
        });
        this.cardCvc.mount('#floatingCvc');
      }
      if (!this.cardExpiry) {
        this.cardExpiry = this.elements.create('cardExpiry', {
          ...this.emptyOptions,
          placeholder: '',
        });
        this.cardExpiry.mount('#floatingExpiry');
      }
...

Here is the working altered Stackblitz

lmvvr0a8

lmvvr0a82#

我对你的代码做了一点改动,用set input代替了div。你想这么做吗?https://stackblitz.com/edit/angular-kauqxz?file=src%2Ftest%2Fstripe%2Fstripe.component.css,src%2Ftest%2Fstripe%2Fstripe.component.html
它使用名称输入,bc表示名称,您有一个input,而不是div标记

<h5>Working Floating name</h5>
   <div class="form-floating mb-3">
      <input type="text" class="form-control" id="floatingInput" formControlName="name" placeholder="Brad Pitt">
      <label for="floatingInput">Name</label>
   </div>

在这里,您可以看到您尝试使用的样式包括:focus伪类,但它不适用于div

.form-floating>.form-control-plaintext~label, .form-floating>.form-control:focus~label, .form-floating>.form-control:not(:placeholder-shown)~label, .form-floating>.form-select~label {
    opacity: .65;
    transform: scale(.85) translateY(-0.5rem) translateX(0.15rem);
}

div:focus-〉它不工作
input:focus-〉它工作正常

相关问题