【发布时间】:2019-07-17 21:08:11
【问题描述】:
问题
我需要获取滚动位置,以便我可以根据它切换工具提示位置。
这是我的工具提示的外观:
但是当我向下滚动时,我希望它向下切换,但现在没有发生期望:向上切换
解决问题的方法
我尝试使用window.scrollY 和window.pageYOffset 来获取滚动位置,但无论我滚动多少,它都会将其记录为0。
可能的解决方案
我尝试参考this question
但删除 height: 100% 属性对我不起作用。
代码
import React, { Component } from 'react'
import ReactMarkdown from 'react-markdown'
import styled from 'styled-components'
import glossary from '../Documentation/glossary'
class Tooltip extends Component {
state = {
hover: false,
timeout: null,
width: 400,
margin: -70,
pointMargin: -15
}
tooltipWidthEval = () => {
const markdownBody = document.getElementsByClassName('markdown-body')[0]
const maxWidth = markdownBody.offsetLeft + markdownBody.clientWidth
const container = document.getElementsByClassName('tooltip-container')[0]
const tooltipWidth = container.offsetLeft + this.state.width
if (tooltipWidth > maxWidth) {
this.setState({
margin: -340,
pointMargin: 260
})
} else {
this.setState({
margin: -70,
pointMargin: -15
})
}
}
hoverIn = () => {
console.log(window.scrollY)
if (this.state.interval) {
clearTimeout(this.state.interval)
this.setState(
{
interval: null,
hover: true
},
this.tooltipWidthEval
)
} else {
this.setState(
{
hover: true
},
this.tooltipWidthEval
)
}
}
hoverOut = () => {
this.setState({
interval: setTimeout(() => {
this.setState({
hover: false
})
}, 100)
})
}
render() {
const { text } = this.props
let header = ''
let description = ''
glossary.contents.forEach(glossaryItem => {
if (glossaryItem.match.includes(text)) {
header = glossaryItem.name
description = glossaryItem.desc
}
})
return (
<>
<HighlightedText
onMouseOver={this.hoverIn}
onMouseLeave={this.hoverOut}
>
{text}
</HighlightedText>
{this.state.hover && (
<TooltipContainer
className="tooltip-container"
onMouseOver={this.hoverIn}
onMouseLeave={this.hoverOut}
>
<TooltipText
margin={this.state.margin}
width={this.state.width}
pointMargin={this.state.pointMargin}
>
<div className="header">{header}</div>
<ReactMarkdown source={description} />
</TooltipText>
</TooltipContainer>
)}
</>
)
}
}
const HighlightedText = styled.span`
border-bottom: 1px black dotted;
`
const TooltipContainer = styled.div`
position: absolute;
display: inline-block;
z-index: 300000000;
background-color: white;
`
const TooltipText = styled.div`
padding: 8px 10px;
border: 1px solid #d1d5da;
border-radius: 3px;
background-color: white;
position: absolute;
z-index: 1;
bottom: 90%;
margin-left: ${props => props.margin || -70}px;
width: ${props => props.width || 400}px;
&:after,
&:before {
content: '';
position: absolute;
top: 100%;
border-style: solid;
margin-left: ${props => props.pointMargin || -15}px;
}
&:after {
left: 10%;
border-width: 10px;
border-color: white transparent transparent transparent;
}
&:before {
left: 10%;
border-width: 11px;
border-color: #d1d5da transparent transparent transparent;
}
.header {
font-size: 1.3em;
font-weight: bold;
}
`
export default Tooltip
附:我想如果仅使用 javascript 解决问题,因为该项目不使用jQuery。
【问题讨论】:
-
scrollTop 怎么样
-
@super scrollTop 对我也不起作用。
-
scrollTop 应该可以解决问题
-
如何以及何时在脚本中调用
window.scrollY?没有代码就无能为力。另外scrollTop不是任何规范的一部分(与window.scrollY不同),所以我完全不建议使用它。 -
您的屏幕截图表明您实际上并没有滚动整个页面,而是在某处应用了
overflow:scroll(或自动)的固定高度元素。因此,您需要读取该元素的滚动偏移量,而不是窗口。
标签: javascript reactjs