@@ -90,41 +90,53 @@ function Editor() {
90
90
} , [ saveFileCb ] ) ;
91
91
92
92
useEffect ( ( ) => {
93
- let mdScrollHeight = mdRef . current ! . clientHeight ;
94
- let coScrollHeight = editor && ( editor as any ) . doc . height ;
95
- // let mdVsCodemirror = mdScrollHeight / coScrollHeight; // 同样容器宽度,不同滚动条高度的比例,e.g.【2 0.5 4 0.75
96
- let baseHeight : number = containerHeight . current ;
97
- let mdVsCodemirror = ( mdScrollHeight / baseHeight - 1 ) / ( coScrollHeight / baseHeight - 1 ) ;
93
+ const layerDom = mdRef . current ;
94
+ let mdScrollHeight = layerDom ! . scrollHeight - layerDom ! . clientHeight ;
95
+ let coScrollHeight = coScroll . scrollHeight - coScroll . clientHeight ;
98
96
if ( scrollTarget . current === 1 ) {
99
- let coScrollTop = mdScroll . scrollTop / mdVsCodemirror ;
97
+ let coScrollTop = mdScroll . scrollTop / mdScrollHeight * coScrollHeight ;
100
98
editor && editor . scrollTo ( null , coScrollTop ) ;
101
99
}
102
100
else {
103
- let parentDom : any = mdRef . current ! . parentNode ;
104
- let mdScrollTop = coScroll . scrollTop * mdVsCodemirror ;
105
- parentDom && parentDom . scrollTo ( null , mdScrollTop ) ;
101
+ let mdScrollTop = coScroll . scrollTop / coScrollHeight * mdScrollHeight ;
102
+ mdRef . current && mdRef . current . scrollTo ( 0 , mdScrollTop ) ;
106
103
}
107
- } , [ coScroll . scrollTop , coScroll . scrollHeight , mdScroll . scrollTop , mdScroll . scrollHeight , editor ] ) ;
104
+ } , [
105
+ coScroll . scrollTop ,
106
+ coScroll . scrollHeight ,
107
+ coScroll . clientHeight ,
108
+ mdScroll . scrollTop ,
109
+ mdScroll . scrollHeight ,
110
+ editor
111
+ ] ) ;
112
+ const mdScrollHandler = useCallback (
113
+ ( evt : any ) => {
114
+ let { scrollTop, scrollHeight} = evt . target ;
115
+ setMdScroll ( { scrollTop, scrollHeight} ) ;
116
+ } ,
117
+ [ ] ,
118
+ ) ;
119
+ const mdMouseHandler = useCallback (
120
+ ( ) => {
121
+ scrollTarget . current = 1 ;
122
+ } ,
123
+ [ scrollTarget ] ,
124
+ ) ;
108
125
useMount ( ( ) => {
109
126
let containerDom = document . querySelector ( '.editor-wrapper' ) ;
110
127
containerHeight . current = containerDom ? containerDom . clientHeight : 0 ;
111
128
setCodemirrorEle ( editorRef . current as Element ) ;
129
+ const ele = mdRef . current ;
130
+ if ( ele ) {
131
+ // TODO: ref 放到 MdView 上
132
+ ele . addEventListener ( 'scroll' , mdScrollHandler ) ;
133
+ ele . addEventListener ( 'mouseover' , mdMouseHandler ) ;
134
+ }
135
+ return ( ) => {
136
+ mdRef . current ?. removeEventListener ( 'scroll' , mdScrollHandler ) ;
137
+ mdRef . current ?. removeEventListener ( 'mouseover' , mdMouseHandler ) ;
138
+ } ;
112
139
} ) ;
113
- const getMdViewEle = useCallback (
114
- ( ele : HTMLDivElement ) => {
115
- mdRef . current = ele ;
116
- if ( ele && ele . parentNode ) {
117
- ele . parentNode . addEventListener ( 'scroll' , ( evt : any ) => {
118
- let { scrollTop, scrollHeight} = evt . target ;
119
- setMdScroll ( { scrollTop, scrollHeight} ) ;
120
- } ) ;
121
- ele . addEventListener ( 'mouseover' , ( ) => {
122
- scrollTarget . current = 1 ;
123
- } ) ;
124
- }
125
- } ,
126
- [ ]
127
- ) ;
128
140
const getCoViewEle = useCallback (
129
141
( ele : HTMLDivElement ) => {
130
142
ele && ele . addEventListener ( 'mouseover' , ( ) => {
@@ -160,14 +172,14 @@ function Editor() {
160
172
className = "code-mirror-container"
161
173
> </ div >
162
174
</ Pane >
163
- < Pane
164
- eleRef = { getMdViewEle }
165
- className = "md-view-wrapper"
166
- >
167
- < MdView
168
- value = { code }
169
- className = "md-view-container"
170
- / >
175
+ < Pane className = "md-view-wrapper" >
176
+ < div ref = { mdRef } className = "md-view-layer" >
177
+ < MdView
178
+ value = { code }
179
+ className = "md-view-container"
180
+ />
181
+ </ div >
182
+ < div className = "iphone-frame" > </ div >
171
183
</ Pane >
172
184
</ SplitPane >
173
185
</ div >
0 commit comments