У меня есть форма в веб-приложении ReactJS, и я пытаюсь включить эффект наведения на элемент <input />. Следуя шаблону, я перешел к приведенному ниже коду. Хотя я получил эффект наведения, элемент <input /> не улавливает событие щелчка, и файловый проводник не открывается, чтобы я мог выбрать файл.
<div className='hoverphoto'>
<span className='hover'>Upload</span>
<img src = {`${ServerRoutes.IMAGES_ROUTE}default.jpg`} alt = "..." className='imgavatar' />
<input className='upload' type = "file" onChange = {this.fileChangedHandler} />
</div>
Я также попытался разместить <input /> внутри <span />, но текст сдвинул <input /> и <img /> вправо.
Как я могу это исправить?
Обновлено: Включая классы CSS:
.hoverphoto{
display: inline-block;
position: relative;
margin-top: -50px;
box-shadow: 0 10px 30px -12px rgba(0, 0, 0, 0.42), 0 4px 25px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.12);
border-radius: 50%;
height: 130px;
width: 130px;
}
.hover{
height: 130px;
width: 130px;
text-align:center;
color:white;
opacity:0;
transition: opacity .2s linear;
background-color:rgba(0,0,0,.7);
position: absolute;
display: flex;
align-items: center;
justify-content: center;
z-index: 9999;
border-radius: 50%;
}
.hover:hover{
opacity:1;
}
.imgavatar{
width: 100%;
height: auto;
vertical-align: middle;
border: 0;
cursor: pointer;
position: absolute;
border-radius: 50%;
}
.upload{
position:relative;
height: 130px;
width: 130px;
overflow: hidden;
cursor: pointer;
opacity: 0;
}
Обычно я вижу это потому, что прозрачный или скрытый элемент отображается поверх элемента <input>. Трудно сказать наверняка, не глядя на CSS
@DanO Включены классы CSS, связанные с кодом. Заранее спасибо!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Как называется обработчик события щелчка? Я не вижу onClick
<input type='file' /> обрабатывает событие щелчка. Есть ли способ программно добиться того же поведения? Так что я сам могу написать для этого обработчик.
Пришлось работать над созданием обработчика onClick на родительском <div>. Для этого я создал ref на элементе <input> и использовал его для принудительного щелчка. Вот результат:
.jsx
handleUpload = () => {
this.inputElement.click();
}
render() {
[...]
<div className='hoverphoto' onClick = {this.handleUpload}>
<input
className='upload'
type = "file"
accept = "image/*"
onChange = {this.handleFileChanged}
ref = {input => this.inputElement = input}
/>
<img src = {`${ServerRoutes.IMAGES_ROUTE}${this.state.profileUri}`} alt = "..." className='imgavatar' />
<div className='span-wrapper'>
<span>Upload</span>
</div>
</div>
[...]
}
.css
.hoverphoto{
display: inline-block;
position: relative;
margin-top: -50px;
box-shadow: 0 10px 30px -12px rgba(0, 0, 0, 0.42), 0 4px 25px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.12);
border-radius: 50%;
height: 130px;
width: 130px;
overflow: hidden;
}
.hoverphoto .span-wrapper {
position: absolute;
bottom:0;
left:0;
background:rgba(0,0,0,0.8);
color:#fff;
text-align:center;
width:100%;
padding:5px;
}
.imgavatar{
width: 100%;
height: 100%;
left: 0;
bottom: 0;
vertical-align: middle;
border: 0;
z-index: 500;
position: absolute;
border-radius: 50%;
}
.imgavatar:hover {
opacity: 0.5;
cursor: pointer;
}
.upload{
opacity:0;
position:absolute;
top:0;
left:0;
width:100%;
height:100%;
z-index: 500;
}
Можете ли вы также предоставить свой CSS?