右側(縦方向の場合は下側)に要素をはみ出させたときにスクロールが出現するのは有る種当たり前の動作のように思えます。
viewport上で要素を配置すると、横の場合は右、縦の場合は下方向に積み重なっていきます。左上を原点として領域が拡張されていくイメージです。なので、今回right
で-300px
、つまり右方向に300px
移動したときに表示領域が拡張されスクロールが現れるのは自然な結果です。
position
やtransform
で原点よりマイナスの位置(左・上)に要素を配置したときにその方向に表示領域が拡張されてしまうと全ての位置が崩れます。なのでleft
で左方向に300px
移動したときにはスクロールが現れないのも自然な結果です。
ではブラウザサイズより右側に要素を移動させたときにスクロールを表示させないためにはどうするかですが、通常overflow-x
で隠すのでは無いでしょうか。
下記のコードが最適だとは思えませんが、取り囲む要素をrelative
にしてabsolute
の基準に設定し、overflow-x
はhidden
にしてはみ出した要素を表示しない様にしています。
Diff
1const App: FC = () => {
2 const [click, setIsClick] = useState(false);
3 return (
4 <div
5 style={{
6 display: "flex",
7 justifyContent: "center",
8+ position: "relative",
9+ height: "100vh",
10+ overflowX: "hidden"
11 }}
12 >
13 <div
14 style={{
15 background: "blue",
16 height: "100vh",
17 width: "300px",
18 position: "absolute",
19 right: click ? "0" : "-300px",
20+ top: "0px"
21 }}
22 ></div>
23 <button
24- style={{}}
25+ style={{ height: "20px" }}
26 onClick={() => setIsClick((isClick) => !isClick)}
27 >
28 click
29 </button>
30 </div>
31 );
32};