Реакция: наложение при наведении курсора мыши без внешнего контейнера для элемента

#javascript #html #css #reactjs #css-position

Вопрос:

Я разрабатываю платформу без кода, на которой вы можете перетаскивать HTML-элементы.

требуется 2 вещи:

  • пользователь может ВЫБРАТЬ каждый элемент
  • пользователь может стилизовать каждый элемент через правую панель (ширина, длина, размер шрифта, …)

Для того, чтобы 1) Я использовал это решение:

Selector.js

 export default Selector = ({children}) => {
    const [isHovered, setIsHovered] = useState(false);

    const mouseOverHandler = (ev) => {
        ev.stopPropagation();
        setIsHovered(true);
    }

    const mouseOutHandler = (ev) => {
        ev.stopPropagation();
        setIsHovered(false);
    }

    return (
        <div className="container" onMouseOver={mouseOverHandler} onMouseOut={mouseOutHandler}>
            {children}
            { isHovered amp;amp; <div className="overlay"></div> }
        </div>
    );
}
 

Selector.css

 .container {
    position: relative;               // For .overlay to be absolute
    max-width: fit-content;           // To fit children/content size
}

.overlay {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    background-color: rgba(122, 122, 122, 0.2);
}
 

App.js

 export default App = () => [
    return (
         <div className="workspace">
             <Selector><Input style={{width: "100%"}} /></Selector>
             <Selector><Block style={{width: "100px"}} /></Selector>
             <Selector><Block style={{width: "100%"}} /></Selector>
         </div>
    );
}
 

ПРОБЛЕМА заключается в том, когда я пытаюсь установить width:100% Block , например, на компонент. Я хочу Block растянуть его на всю ширину .workspace , но поскольку Block Selector он включен, он будет иметь .container родительский элемент, поэтому он будет заполнять только этот элемент, а не .workspace . При этом я не могу выполнить требование 2).

Вы можете проверить это здесь, на скрипке: https://jsfiddle.net/49cmok2a/2 /. Если вы установите ширину блока в 100 пикселей, это будет блок шириной 100 пикселей, но если вы добавите 100% ширины, он просто уменьшится до 1 пикселя.

Знаете ли вы, как создать Selector , чтобы он не создавал родительский div для элементов. Спасибо!

Комментарии:

1. Смогли ли вы найти решение для этого?

2. Частично. Я создал абсолютный блок div, который имеет динамическое положение и размер, поэтому он покрывает HTML-элемент при наведении, но я не удовлетворен этим решением.

Ответ №1:

Ваша проблема в том, что вы пытаетесь перезаписать относительный стиль в дочернем элементе. Вы можете легко управлять шириной стиля вашего селектора всего за 2 действия:

Прежде всего, вы должны изменить свой параметр max-width: object-fit, это свойство используется в основном для тегов img или video. Измените его свойство, как я сделал

 .container{
position: relative;
max-width: 100%;
cursor: pointer;
}
 

В следующий раз вы можете легко изменить ширину селектора.

Надеюсь, я правильно понял ваш вопрос, хорошего дня!

Комментарии:

1. Спасибо, Ян, что изучил это. Если для максимальной ширины задано значение 100%, то наложение больше, чем элемент, который он должен покрывать. Вы можете проверить это на скрипке, если измените это свойство по ссылке, которую я предоставил 🙂

Ответ №2:

Если вам нужен только квадрат, вы можете использовать 100vw вместо 100% :

 const App = () => {
    return (
         <div className="workspace">
              <Selector><Input style={{width: "100%"}} /></Selector>
              <Selector><Block style={{width: "100vw"}} /></Selector>
         </div>
    );
}
 

Или сделайте .рабочее пространство на 100% от его родительского элемента, сделайте так, чтобы селектор занимал 100% его родительского элемента (.workspace) и придавал блоку или вводу желаемый размер :

 
 <div className="workspace" style={{width: "100%"}} >
              <Selector style={{width: "100%"}} ><Input /></Selector>
              <Selector style={{width: "100%"}} ><Block/></Selector>
         </div>

 

но вам нужно, чтобы максимальная ширина составляла 100% от файла css.

   max-width: 100%;

 

Комментарии:

1. Спасибо Amit за изучение этого. Если вы измените на 100vw, element превысит. рабочее пространство. Кроме того, если вы зададите 100% для максимальной ширины, .overlay превысит элемент, который он должен покрывать. Вы можете проверить это по ссылке на скрипку, о которой идет речь 🙂