Событие MouseLeave не запускается для якорных элементов - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть ссылка на кодовое поле, и проблема лучше всего наблюдается в Chrome:

https://codepen.io/pkroupoderov/pen/jdRowv

Событие mouseLeave иногда не срабатывает, когда пользователь быстро перемещает мышь над несколькимиизображения, это означает, что к некоторым изображениям все еще будет применен фильтр оттенков серого.Как это исправить?Если я использую div вместо якорного элемента, он работает совершенно нормально.Должен ли я немного изменить разметку или применить определенные стили к элементу привязки?Или, может быть, вместо этого я должен использовать какой-нибудь компонент из React-Bootstrap?

Я пытаюсь создать эффект наложения на изображение, когда пользователь наводит курсор на него, как в Instagram.Я добавлю содержимое в оверлей позже, мне просто нужно решить проблему с событием mouseLeave.

const imageUrls = [
  'https://farm8.staticflickr.com/7909/33089338628_052e9e2149_z.jpg',
  'https://farm8.staticflickr.com/7894/46240285474_81642cbd37_z.jpg',
  'https://farm8.staticflickr.com/7840/32023738937_17d3cec52f_z.jpg',
  'https://farm8.staticflickr.com/7815/33089272548_fbd18ac39f_z.jpg',
  'https://farm5.staticflickr.com/4840/40000181463_6eab94e877_z.jpg',
  'https://farm8.staticflickr.com/7906/46912640552_4a7c36da63_z.jpg',
  'https://farm5.staticflickr.com/4897/46912634852_93440c416a_z.jpg',
  'https://farm5.staticflickr.com/4832/46964511231_6da8ef5ed0_z.jpg'
]

class Image extends React.Component {
  state = {hovering: false} 

  handleHover = () => {
    this.setState({hovering: true})
  }
  handleLeave = () => {
    this.setState({hovering: false})
  }

  render() {
    if (!this.state.hovering) {
      return (
        <div onMouseOver={this.handleHover}>
          <img src={this.props.url} alt='' />
        </div>
      )
    } else {
      return ( // works fine when using <div> tag instead of <a> or <span>
        <a href="#" style={{display: 'block'}} onMouseLeave={this.handleLeave}>
          <img style={{filter: 'opacity(20%)'}} src={this.props.url} alt='' />
        </a>  
      )
    }
  }
}

const Images = () => {
  return (
    <div className="gallery">  
      {imageUrls.map((image, i) => {
        return <Image key={i} url={image} />
      })}
    </div>
  )
}

ReactDOM.render(<Images />, document.getElementById('app'))

1 Ответ

0 голосов
/ 21 февраля 2019

Вы можете добиться этого, используя чистый CSS, не нужно использовать Javascript.

a {
   display: block;
}

a:hover {
   filter: opacity(.2);
}
...