gpt4 book ai didi

html - 如何在非同级 DOM 节点上创建背景?

转载 作者:行者123 更新时间:2023-12-04 08:17:39 24 4
gpt4 key购买 nike

所以我有一个很好地组织的网页:

<html>
<head>...</head>
<body>
<header>header</header>
<main style="max-width: 80vw; margin: 0 auto;">
<section>section 1</section>
<section>section 2</section>
<section>section 3</section>
<section>section 4</section>
</main>
<footer>footer</footer>
</body>
</html>
我想要一个跨越标题和第一部分的线性渐变背景。
它提出了两个问题:
  • 如何创建跨越非同级 DOM 节点的元素?
  • 如何创建一个跨越第一部分有限宽度的元素?

  • 理想情况下,我想保留我的 HTML 组织,因为它是语义的。
    Edit infallible-silence-wcjkr

    最佳答案

    how to create an element that spans non-sibling DOM nodes?


    你不能。有效的 HTML 需要只有一个直接父级的层次结构(在您的假设示例中,第一个 section 将有两个: main 和带有渐变的新父级)。
    如果你想达到这个效果,你有几个选择:
    改变你的层次结构
    您可以将层次结构扁平化为
    <div class="gradient-wrapper">
    <header>header</header>
    <section>section 1</section>
    </div>
    <section>section 2</section>
    <section>section 3</section>
    <section>section 4</section>
    并强加 main 的原始样式到使用的部分
    section {
    max-width: 80vw;
    margin: 0 auto;
    }

    .gradient-wrapper {
    background: linear-gradient(...);
    }
    这是最简单的方法,因为它在设计上是垂直响应的:渐变将自动拉伸(stretch)以包含其子级。
    Edit zealous-sound-7jvy4
    使用 CSS 的恒定高度
    如果您的第一个 section 的高度和距离已知且不变,您可以部署 CSS hack 来制作 header 的背景伸出您的 section 的高度(不改变原来的层次结构)。
    header {
    position: relative;
    }

    header::before {
    display: block;
    width: 100%;
    content: "";
    position: absolute;
    z-index: -1;

    --first-section-height: (1px + 30vh + 2px);
    height: calc(100% + var(--first-section-height));

    background: linear-gradient(...);
    }
    为清楚起见,我创建了 --first-section-height变量,表示从 header 底部开始的总高度到您的 section 底部. 1pxborder-bottomheader , 30vh是您的 section 的恒定高度和 2px是它的 border-topborder-bottom .
    Edit vibrant-liskov-uw2zh
    Javascript
    如果您希望保留原来的层次结构并需要您的 section要可变大小或间隔,您可以使用 javascript 来监听窗口大小的变化并定位 div在两个元素的组合边界框处。该行为的最小工作示例:

    window.addEventListener("load", updateGradientBox);
    window.addEventListener("resize", updateGradientBox);
    updateGradientBox();

    function updateGradientBox() {
    let header = document.querySelector("header");
    let section = document.querySelector("main section:first-child");
    let gradient = document.querySelector("#gradient");
    if (header === null || section === null || gradient === null) return;

    let rects = [header, section].map((el) => el.getBoundingClientRect());
    let rect = getCombinedBoundingRect(rects);

    gradient.style.top = `${rect.top}px`;
    gradient.style.left = `${rect.left}px`;
    gradient.style.width = `${rect.width}px`;
    gradient.style.height = `${rect.height}px`;
    }

    function getCombinedBoundingRect(rects) {
    const r = {
    top: Math.min(...rects.map((r) => r.top)),
    left: Math.min(...rects.map((r) => r.left)),
    bottom: Math.max(...rects.map((r) => r.bottom)),
    right: Math.max(...rects.map((r) => r.right))
    };
    return {
    ...r,
    width: r.right - r.left,
    height: r.bottom - r.top
    };
    }
    #gradient {
    position: absolute;
    display: block;
    z-index: -1;
    background: linear-gradient(rgba(217, 217, 217, 1) 0%, rgba(85, 85, 85, 1) 100%);
    }
    <div id="gradient"></div>
    <header>header</header>
    <main>
    <section>section 1</section>
    <section>section 2</section>
    <section>section 3</section>
    <section>section 4</section>
    </main>
    <footer>footer</footer>

    这种方法的优点是它可以适应每一个可以想到的尺寸和位置(正如我的最小示例所证明的那样,它根本不代表您提出的布局)。
    一个完整的工作示例可以在
    Edit naughty-fermi-0i2l5
    (请记住,我在示例中使用了最新的 javascript 语法和 API;根据您对旧浏览器的所需支持,您可能需要使用 Babel 进行填充或编译)

    关于html - 如何在非同级 DOM 节点上创建背景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65645672/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com