Современный формат телефона Bootstrap 5

Во многих сайта встречаются красивые и удобные форматы телефона. Например выбираешь из списка страну и формат в поле вводе меняется соответсвенно. Еще флаги стран с городами. Решил разобраться и поделиться как это делается для Веб страниц.

Использовал CDN - Bootstrap 5

<!-- Стили -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB" crossorigin="anonymous">
<!-- Скрипты -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js" integrity="sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI" crossorigin="anonymous"></script>

Контейнер элементы:

<div class="container">
    <div class="row mt-5">
        <div class="col-sm-6 mb-3 mb-sm-0">
            <div class="card">
                <div class="card-body">
                    <h5 class="card-title">Телефон</h5>
                    <div class="input-group mb-3 form-drop">
                        <button class="btn btn-outline-secondary dropdown-toggle js-form-drop-toggle js-dropdown" type="button" data-bs-toggle="dropdown" aria-expanded="false">
                            <img src="/images/flag/flag-ru.png" class="" alt=""/>
                        </button>
                        <ul class="dropdown-menu">
                            <li>
                                <label class="dropdown-item d-flex align-items-center">
                                    <input type="radio" class="form-drop__control js-form-drop-control" name="code" value="+7" checked="checked"/>
                                    <span class="form-drop__pic"><img src="/images/flag/flag-ru.png" alt=""/></span><span class="form-drop__text">Россия <span>+7</span></span>
                                </label>
                            </li>
                            <li>
                                <label class="dropdown-item d-flex align-items-center">
                                    <input type="radio" class="form-drop__control js-form-drop-control" name="code" value="+375"/>
                                    <span class="form-drop__pic"><img src="/images/flag/flag-by.png" alt=""/></span><span class="form-drop__text">Беларусь <span>+375</span></span>
                                </label>
                            </li>
                            <li>
                                <label class="dropdown-item d-flex align-items-center">
                                    <input type="radio" class="form-drop__control js-form-drop-control" name="code" value="+7"/>
                                    <span class="form-drop__pic"><img src="/images/flag/flag-kz.png" alt=""/></span><span class="form-drop__text">Казахстан <span>+7</span></span>
                                </label>
                            </li>
                            <li><hr class="dropdown-divider"></li>
                            <li>
                                <label class="dropdown-item d-flex align-items-center">
                                    <input type="radio" class="form-drop__control js-form-drop-control" name="code" value="+996">
                                    <span class="form-drop__pic">
                                        <img src="/images/flag/flag-kg.png" alt="">
                                    </span>
                                    <span class="form-drop__text">Кыргызстан <span>+996</span></span>
                                </label>
                            </li>
                            <li>
                                <label class="dropdown-item d-flex align-items-center">
                                    <input type="radio" class="form-drop__control js-form-drop-control" name="code" value="+998">
                                    <span class="form-drop__pic">
                                        <img src="/images/flag/flag-uz.png" alt="">
                                    </span>
                                    <span class="form-drop__text">Узбекистан <span>+998</span></span>
                                </label>
                            </li>
                            <li>
                                <label class="dropdown-item d-flex align-items-center">
                                    <input type="radio" class="form-drop__control js-form-drop-control" name="code" value="+992">
                                    <span class="form-drop__pic">
                                        <img src="/images/flag/flag-tj.png" alt="">
                                    </span>
                                    <span class="form-drop__text">Таджикистан <span>+992</span></span>
                                </label>
                            </li>
                            <li>
                                <label class="dropdown-item d-flex align-items-center">
                                    <input type="radio" class="form-drop__control js-form-drop-control" name="code" value="+994"/>
                                    <span class="form-drop__pic"><img src="/images/flag/flag-az.png" alt=""/></span><span class="form-drop__text">Азербайджан <span>+994</span></span>
                                </label>
                            </li>
                        </ul>
                        <input type="text" class="form-control js-code-tel" aria-label="Text input with dropdown button">
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

CND Библиотека для маски телефона 

 <script src="https://unpkg.com/imask"></script>

Стилистика для элемента dropdown-toggle

.js-dropdown {
    display: flex;
    justify-content: center;
    align-items: center;
    user-select: none;
    height: 40px;
}

.js-form-drop-toggle img {
    max-width: 100%;
    max-height: 100%;
}

.dropdown-item input {
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
}

.form-drop__pic {
    margin-right: 10px;
    width: 30px;
    display: flex;
}

.form-drop__pic img {
    max-width: 100%;
    max-height: 100%;
}

.form-drop__text {
    display: block;
    flex: 1;
    color: #000;
    font-size: 14px;
    line-height: 1;
    font-weight: 400;
}

.form-drop__text span {
    color: #B5BBC2;
}

.form-drop .dropdown-menu > li > label {
    cursor: pointer;
}

Javascript код:

let maskCodeTelArray = {};

function initMaskCode(e, t, n = 16) {
    let i = null;
    void 0 === e.dataset.tmpid ? (e.dataset.tmpid = Math.random().toString(36).substr(2, 9), maskCodeTelArray[e.dataset.tmpid] = {
        element: e,
        maskCode: null
    }, i = maskCodeTelArray[e.dataset.tmpid]) : i = maskCodeTelArray[e.dataset.tmpid], void 0 === e.dataset.minlength && e.setAttribute("minlength", n), i.maskCode && (i.maskCode.destroy(), i.maskCode = null), i.maskCode = "+7" === t ? new IMask(e, {
        mask: "+{7} 000 000-00-00",
        prepare: function (e, t) {
            return "8" === e && "" === t.value ? "" : e
        }
    }) : new IMask(e, {mask: `{${t}} 000 000-00-00`})
}

function setMaskOnTel(e, t = !0, n) {
    const i = e.value, r = e.parentNode, s = r.querySelector("img"), o = r.closest(".form-drop"),
        a = o.querySelector(".js-code-tel");
    console.log(s.getAttribute("src"));
    o.querySelector(".js-form-drop-toggle img").setAttribute("src", s.getAttribute("src"));
    const l = a.value.replace(/[^ ]+ /, "");
    a.value = i + " " + l, 2 === i.length ? initMaskCode(a, i, 16) : 4 === i.length ? initMaskCode(a, i, 18) : initMaskCode(a, i), t && a.focus()
}

function checkDefMaskPhone() {
    $(".js-form-drop-control:checked").each((function () {
        console.log("checkDefMaskPhone other", this), setMaskOnTel(this, !1, !0)
    }))
}

$(document).on("change", ".js-form-drop-control", (function () {
    setMaskOnTel(this)
}))

checkDefMaskPhone();

  • 25 просмотров