我正在制作一个自定义元素,它的功能是具有语法突出显示和其他一些功能的文本区.我已经将其简化为一个定制元素,其中包含一个div,当单击页面时会获得高度.

为了使自定义元素具有默认高度并能够因内容较多而增加高度,我使用了min-height: 40vh.问题是,映像DOM内的div中的height: 100%不起作用.它不会扩展到阴影DOM/自定义元素内部高度的min-height: 40vh%.但是,当需要时,自定义元素仍会增长以适合div.

请注意,自定义元素使用box-sizing: border-box并且也有一个边框.

我try 了以下几点:

我在Chrome和Firefox上都试过了,但它们都不能as desired%地在这两种浏览器上运行.

height: anything between 0 and 40vh on custom element

这是可行的,除非当div比自定义元素大时,自定义元素不会增长到适合div.

min-height: inherit on div

除非它包含自定义元素父元素的边框,否则这会起作用,默认情况下,使用box-sizing: border-box会使父元素的边框大于40vh.我希望自定义元素的值为min-height: 40vhbox-sizing: border-box.

Flexbox

自定义元素上的Flexbox不影响阴影根中的元素.

有问题的代码

请注意,StackOverflow doesn't give the snippet enough screen height to show the problem,然后单击"Expand snippet"并运行它也有同样的问题,so make sure to first start it and then click "Full page",然后单击页面将使div变大.

<!DOCTYPE html>
<html>
    <head>
        <style>
            * {
                box-sizing: border-box;
                margin: 0;
                padding: 0;
            }
            html, body {
                height: 100%;
            }
            my-element {
                border: 40px solid gray;
                min-height: 40vh;
            }
        </style>
    </head>
    <body>
        <my-element></my-element>

        <script>
            class MyElement extends HTMLElement {
                constructor() {
                    super();
        
                    const shadow = this.attachShadow({ mode: "open" });
                    const stylesheet = new CSSStyleSheet();
                    stylesheet.replaceSync(`
                        * {
                            margin: 0;
                            padding: 0;
                        }
                        :host {
                            display: block;
                        }
                        div {
                            background: green;
                            width: 100%;
                            height: 100%; /* not working */
                        }
                    `);
                    shadow.adoptedStyleSheets = [stylesheet];

                    const div = document.createElement("div");
                    div.innerText = "Hello";
                    shadow.appendChild(div);
                    document.body.onclick = () => {
                        div.innerText += "\nHi";
                    };
                }
            }
            customElements.define("my-element", MyElement);
        </script>
    </body>
</html>

我可以用JS做一个黑客解决方案,但我想看看是否有一种方法可以只用CSS来做到这一点.

推荐答案

我的解决方案:

最后,我只是添加了元素作为自定义元素的直接子元素,并放弃了影子DOM.这带来了一个缺点,即全球的CSS会影响它,但在我看来,这是值得的.

顺便说一句,我不得不将定制元素类中的代码移到connectedCallback,因为您不能从构造函数将子代附加到定制元素.

Css相关问答推荐

沿浮动形状—面元素外路径将文字垂直居中""

当滚动到页脚时,是否可以隐藏固定元素?

如何将CSS Paint API与Reaction一起使用

R SHINY:FILL CONTAINER=TRUE时调整DT数据表高度,

如何让 v-col 变成可滚动的?

React MUI 从 CSS 伪元素中删除内容

使用框架时样式冲突导致的 CSS 网格布局问题

内部和外部 div 之间的像素大小的间隙

如何为柔和的配色方案提供易于使用的高对比度替代方案?

AngularJS Graphs & Charts - 实线和虚线的混合

基于类的 CSS Select 器

你能用 JavaScript 控制 GIF 动画吗?

将一行文本保留为单行 - 换行或不换行

如何始终在浏览器中显示垂直滚动条?

如何在需要时通过 HTTPS 包含 CSS 和 JS 文件?

CSS:固定到底部并居中

CSS媒体查询仅针对iPad和iPad?

使用 CSS/HTML 更改悬停图像

如何使内容出现在固定的 DIV 元素下方?

名称-值对的语义和 struct