css 使monaco编辑器的诊断窗口超出分配面板

hgb9j2n6  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(142)

bounty将在18小时后过期。回答此问题可获得+150声望奖励。SoftTimur希望引起更多人关注此问题。

我做了一个可拖动的分割面板https://github.com/johnwalley/allotment
在面板面板中,我有一个monaco编辑器。当我将鼠标悬停在monaco编辑器上时,会出现一个诊断窗口。目前,即使在style.css中使用.monaco-hover { z-index: 1000 !important },诊断窗口也不会超过第一个面板。有人知道如何使诊断窗口超过第一个面板吗?
代码沙箱:https://codesandbox.io/s/reset-forked-7wvrbj?file=/src/App.js

import React from "react";
import { Allotment } from "allotment";
import "allotment/dist/style.css";

import "./style.css";

import Editor, { monaco } from "@monaco-editor/react";

monaco
  .init()
  .then((monaco) => {
    monaco.languages.registerHoverProvider("html", {
      provideHover: function (model, position) {
        console.log(position);
        return {
          range: new monaco.Range(
            1,
            1,
            model.getLineCount(),
            model.getLineMaxColumn(model.getLineCount())
          ),
          contents: [
            { value: "**SOURCE**" },
            { value: "hey man, how are you?" }
          ]
        };
      }
    });
  })
  .catch((error) =>
    console.error("An error occurred during initialization of Monaco: ", error)
  );

export default class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      toExpand: true
    };
    this.myRef = React.createRef();
  }

  handleChange = (sizes) => {
    if (sizes.length > 1) {
      if (sizes[1] < 31) {
        this.setState({ toExpand: true });
      } else {
        this.setState({ toExpand: false });
      }
    }
  };

  render() {
    return (
      <div
        style={{
          minWidth: 200,
          height: "100vh",
          overflowX: "auto",
          width: "auto",
          margin: "0px 0px 0px 0px"
        }}
      >
        <Allotment
          vertical
          onChange={this.handleChangeAllotment}
          ref={this.myRef}
        >
          <Allotment.Pane>
            <Editor
              height="30vh"
              language="html"
              value={`
<section>
  <div>
    <span>
      {{ some_value }}
    </span>
  </div>
</section>
    `}
              options={{
                selectOnLineNumber: true,
                lineNumbersMinChars: 0,
                glyphMargin: true,
                readOnly: true,
                hover: {
                  enabled: true
                }
              }}
            />
          </Allotment.Pane>
          <Allotment.Pane preferredSize="0%" minSize={20}>
            short <br /> short <br />
            short <br /> short <br />
            short <br /> short <br />
            short <br /> short <br />
            short <br /> short <br />
            short <br /> short <br />
          </Allotment.Pane>
        </Allotment>
      </div>
    );
  }
}
s4n0splo

s4n0splo1#

我不知道你说的诊断窗口是什么意思,但我假设它是一个显示**“hey man,how are you?”的框,当代码悬停时,我还假设你希望这个框显示在面板上,那里有“short”**文本。如果这是你想要的,那么它看起来像为什么它没有显示在其他面板上的原因是因为父窗口有overflow: hidden,所有你需要做的就是将面板overflow更改为visible。要做到这一点,你可以使用以下CSS:

...
div[data-testid="split-view-view"][data-testid="split-view-view"][data-testid="split-view-view"] {
  overflow: visible;
}

div[data-testid="split-view-view"][data-testid="split-view-view"][data-testid="split-view-view"]:nth-child(2) {
  background: white;
}
...

为什么我重复了这么多次[data-testid="split-view-view"]?这是为了增加规则的特异性(或者,您可以将!important添加到overflow: visible中,而不重复[data-testid="split-view-view"])。至于为什么第二个面板的背景是白色的,这是因为当溢出未隐藏时,第一个面板中的元素将与第二个面板重叠。
This是工作codesandbox fork。

相关问题