You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

适配ngbDatepicker组件时日历图标在输入框错位如何解决

问题描述

我想为validity字段创建一个日历选择框:
效果示意图

我的初始代码如下:

<div class="col-12 col-12 col-md-4 col-lg-2">
    <div class="form-group">
        <label for="validity">Validaty</label>
            <input id="validity" name="validity" type="text" class="form-control"
                [(ngModel)]="order.validity"
                style="background-color: white; max-width: 300px;width: 100%;"
                placeholder="Validity" autofocus>
    </div>
</div>

我参考了正常的日历字段实现:
参考实现示意图

参考用的代码如下:

<div class="form-group row">
 <label for="picker2" class="col-12 col-sm-4 col-form-label">{{'startDate | t }}</label>
    <div class="col-12 col-sm-8">
       <div class="input-group" style="background-color: white; max-width: 300px;">
         <input id="picker2" class="form-control" placeholder="yyyy-mm-dd" name="dp2"
            ngbDatepicker #dp2="ngbDatepicker" [(ngModel)]="search.enddate">
               <div class="input-group-append" (click)="dp2.toggle()">
                     <div class="input-group-text">
                         <i class="icon-regular i-Calendar-4"></i>
                      </div>
                </div>
        </div>
    </div>
</div>

我尝试对初始代码进行适配改造,但改造后日历图标在输入框上的位置错误,不清楚问题出在哪里,需要排查。适配后代码如下:

<div class="col-12 col-12 col-md-4 col-lg-2">
    <div class="form-group">
        <label for="validity">{{'3735' | t}}</label>
         <input id="validity" name="validity"  class="form-control" placeholder="yyyy-mm-dd" name="dp2"
            ngbDatepicker #dp2="ngbDatepicker"
            [(ngModel)]="order.validity "
            style="background-color: white; max-width: 300px;width: 100%;"
            placeholder="Validity" autofocus>

            <div class="input-group-append" (click)="dp2.toggle()">
                 <div class="input-group-text">
                     <i class="icon-regular i-Calendar-4"></i>
                  </div>
            </div>
    </div>
</div>

错位效果示意图


修复方案

图标错位的核心原因是没有用Bootstrap的input-group容器包裹输入框和日历图标模块,input-group-append是输入组专用组件,必须嵌套在input-group内部才能和输入框横向拼接。除此之外代码还有几个冗余问题:input节点重复定义了name属性和placeholder属性,[(ngModel)]绑定的变量后面多了多余空格。

修复后的完整代码如下:

<div class="col-12 col-md-4 col-lg-2">
    <div class="form-group">
        <label for="validity">{{'3735' | t}}</label>
        <!-- 新增input-group容器 -->
        <div class="input-group" style="background-color: white; max-width: 300px;width: 100%;">
            <input id="validity" name="validity" class="form-control" placeholder="yyyy-mm-dd"
                ngbDatepicker #dp2="ngbDatepicker"
                [(ngModel)]="order.validity"
                autofocus>
            <div class="input-group-append" (click)="dp2.toggle()">
                <div class="input-group-text">
                    <i class="icon-regular i-Calendar-4"></i>
                </div>
            </div>
        </div>
    </div>
</div>

内容的提问来源于stack exchange,提问作者elodie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 15:24:01