Как заставить родительский div реагировать на ширину дочернего div с абсолютным позиционированием

CodeSandbox
Я создал кастомный select компонент и его выпадающего списка задано position: absolute из за этого он не влияет на размер родительского контейнера, это меня не устраивает, я хочу сделать так чтобы родительский элемент был такой же ширины как и выпадающий список, но при этом не задавая какую-либо фиксированную ширину.

Скриншоты:


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

Автор решения: Нина Лисицинская

Абсолютно позиционированные элементы и не могут влиять на размеры своих родительских, они как-бы выпадают из обычного потока документа.

Можно обновлять размеры родительского элемента при помощи JS. В вашем примере на React это можно сделать так:

const Select = () => {
  const select = useRef(null);
  const options = useRef(null);

  useEffect(() => {
    const { width } = options.current.getBoundingClientRect();
    select.current.style.width = `${width}px`;
  });

  return (
    <div className={"select"} ref={select}>
      <div className={classnames("control", "activeControl")}>
        <div className={"title"}>Option 1</div>
      </div>

      <ul className={"options"} ref={options}>
        <li className={classnames("option", "activeOption")}>Option 1</li>
        <li className={classnames("option", "activeOption")}>
          Optioooooooon 2
        </li>
        <li className={classnames("option", "activeOption")}>
          Optioooooooooooooooooooon 3
        </li>
      </ul>
    </div>
  );
};

Переданный в useEffect коллбек вызывается при каждом обновлении компонента и устанавливает ширину select в соответствии с шириной options.

→ Ссылка