Как сделать поисковую строку с выпадающим списком (как в браузерах) и что лучше для этого использовать?

Как мне создать строку поиска с выпадающим списком (подсказками), какие языки программирования лучше для этого использовать, (чтобы было с анимацией) и возможно ли это сделать только с помощью html и css? То есть, когда вы вводите определенные символы/текст, появляется список, и вам предлагается щелкнуть по одному из них (как в браузере), так, когда вы нажимаете на определенный из предложенных пунктов, он открывается.

Что-то вроде этого:

Пример

Вот макет:

Макет


Ответы (1 шт):

Автор решения: Sergio

На чистом html/css не получится. Можно на JS.

Вообще JS — хорошая штука. Вот учебник.

Данные для поиска должны где-то храниться, кстати. Почитайте про json, fetch-запросы.

Я делал вот так, у меня тут поиск по ФИО клиентов (на идеальное решение не претендую):

function search() {
    const searchBar = document.querySelector('.header-search__input');
    const results = document.querySelector('.header-search__results');
    const searchClearBtn = document.querySelector('.header-search__clear-btn');
    let clientsArray = [];
    const WAIT_TIME = 300;
    let timeout;

    function renderResults() {
        document.addEventListener('click', function(e) {
            if ((!searchBar.contains(e.target))) {
                results.classList.remove('be');
            };
        });
        clearTimeout(timeout);
        timeout = setTimeout(() => {
            results.innerHTML = '';
            const searchRequest = ((searchBar.value).replaceAll(' ', '')).toLowerCase();
            clientsArray.forEach(client => {
                const fullname = (client.surname + client.name + client.lastName).toLowerCase();
                if (fullname.includes(searchRequest)) {
                    const resultItem = document.createElement('li');
                    resultItem.classList.add('basic-text', 'header-search__results__item');
                    resultItem.setAttribute('tabindex', '0');
                    resultItem.innerHTML = `${client.surname} ${client.name} ${client.lastName}`;
                    resultItem.addEventListener('click', () => {
                        changeClient(client);
                    });
                    results.append(resultItem);
                }
                });
                if (results.innerHTML === '') {
                    const resultItem = document.createElement('li');
                    resultItem.classList.add('basic-text', 'header-search__results__item--empty');
                    resultItem.innerHTML = `По запросу «${searchBar.value}» не найдено ни одного клиента`;
                    results.append(resultItem);
                };
        }, WAIT_TIME);
    }

    searchBar.addEventListener('focus', async () => {
        clientsArray = await data.getClientsDataArray();
        if (searchBar.value.trim()) {
            searchClearBtn.classList.add('be');
            results.classList.add('be');
            renderResults();
        }
    });

    searchBar.addEventListener('input', () => {
        if (searchBar.value.trim()) {
            searchClearBtn.classList.add('be');
            results.classList.add('be');
            renderResults();
        } else {
            results.classList.remove('be');
            searchClearBtn.classList.remove('be');
        }
    });

    searchClearBtn.addEventListener('click', () => {
        searchBar.value = '';
        results.classList.remove('be');
        searchClearBtn.classList.remove('be');
    });
};

Но... не зная JS вот так сразу вы вряд ли сможете что-то сделать.

→ Ссылка