我正在制作一个自定义元素,它充当具有语法突出显示和其他一些功能的文本区域。我已将其简化为一个自定义元素,其中包含一个 div,单击页面时该元素会获得高度。
为了使自定义元素具有默认高度并能够因内容更多而增加高度,我使用了
min-height: 40vh
。问题是 Shadow dom 内 div 中的 height: 100%
不起作用。它不会扩展到 Shadow dom 高度/自定义元素内部高度的 100%。然而,自定义元素仍然会在需要时增长以适应 div。
请注意,自定义元素使用
box-sizing: border-box
并且还有边框。
我已经在 Chrome 和 Firefox 上尝试了所有这些方法,但它们都无法在任一浏览器上按预期工作。
height: anything between 0 and 40vh
自定义元素此方法有效,除非当 div 增大到大于自定义元素时,自定义元素不会增大以适合 div。
div 上的min-height: inherit
此方法有效,但它包含自定义元素父级的边框,默认情况下使用
box-sizing: border-box
会使父级变得大于 40vh。我希望自定义元素具有 min-height: 40vh
和 box-sizing: border-box
。
自定义元素上的 Flexbox 不会影响影子根中的元素。
请注意,StackOverflow 没有为代码片段提供足够的屏幕高度来显示问题,单击“展开代码片段”然后运行它也会出现同样的问题,因此请确保先启动它,然后单击“完整页面” ,然后点击页面会让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 制作一个 hacky 解决方案,但我想看看是否有办法仅使用 CSS 来做到这一点。
您的
div
占据了其父元素(即 my-element
)高度的 100%。如果你想让它占据整个屏幕,那么你需要将其父级设置为 100% 高度。
<!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;
height: 100%;
}
</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>