【问题标题】:How can I create a concave bottom border in CSS?如何在 CSS 中创建凹下边框?
【发布时间】:2015-02-11 00:56:38
【问题描述】:

内容需要能够在其后面的凹区滚动且不被遮挡。具体来说,我正在尝试创建这个:

【问题讨论】:

  • 你可以使用 PNG 图像吗?
  • 我认为 SVG 图像加上边框图像可能是唯一的方法。我希望有一个完全基于代码的解决方案。
  • 我更喜欢非 JS 解决方案,但作为最后的手段,我可​​能不得不依靠它。
  • 嗯,你可以使用 SVG 并用 JS 改变它的颜色...

标签: css css-shapes


【解决方案1】:

对于透明背景,您可以使用 box-shadows :

DEMO

说明:

这种技术的重点是使用带有盒子阴影和透明背景的伪元素来透视它。伪元素是绝对定位的,并且具有比容器大得多的宽度,以便(在边框半径的帮助下)为 div 的底部提供平滑的插入曲线。

简单来说:div的背景是伪元素的box-shadow。

z-index 值允许 div 的内容显示在阴影上。

****** 编辑 *************************

随着形状后面的内容,你可以看到这个DEMO


html,body{
    height:100%;
    margin:0;
    padding:0;
    background: url('http://lorempixel.com/output/people-q-c-640-480-1.jpg');
    background-size:cover;
}
div {
    background:none;
    height:50%;
    position:relative;
    overflow:hidden;
    z-index:1;
}
div:after {
    content:'';
    position:absolute;
    left:-600%;
    width:1300%;
    padding-bottom:1300%;
    top:80%;
    background:none;
    border-radius:50%;
    box-shadow: 0px 0px 0px 9999px teal;
    z-index:-1;
}
<div>content</div>

【讨论】:

  • 太棒了!这似乎是最干净的解决方案。
  • 我喜欢这种解决方案,但必须指出的是,“形状内部”(老实说,形状上方)的内容存在限制。也无法将形状内的内容剪切到凹底线;它会简单地溢出。
  • @PeterSorowka 我不明白你的意思可以解释一下吗?
  • @web-tiki 我的意思是如果你把更多的内容放在形状里面会发生什么。 (jsfiddle.net/ftw7d5ap/6) 这不会剪裁到曲线上。但我明白了,这可能不是一个要求。
  • @PeterSorowka 那是因为形状有一个指定的高度,如果你删除它,内容会将它扩展为普通元素:jsfiddle.net/webtiki/ftw7d5ap/8
【解决方案2】:

我不知道有什么方法可以用边框来做到这一点,但您可以尝试在 CSS3 中使用 ::before 并结合 border-radius,如本演示所示。

#header {
    position: fixed;
    z-index: 1;
    height: 80px;
    background: #f00;
    overflow: hidden;
    top: 0;
    left: 0;
    right: 0;
    z-index: 2;
}
#header::before {
    content: "";
    position: absolute;
    background: #fff;
    bottom: -22px;
    height: 30px;    
    left: -50px;
    right: -50px;
    border-radius: 50%;
}
#content {
    padding: 20px;
    position: absolute;
    z-index: 1;
    top: 80px;
    left: 0;
    width: 460px;
}
<div id="header">Header</div>
<div id="content">
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>

【讨论】:

  • 当我在 div 中添加多个 Test&lt;br /&gt; 时,内容似乎没有滚动,这是 OP 请求的一部分。或者只是我的浏览器没有滚动,我在win8 chrome中。似乎在 IE 或 FF 中不起作用。虽然在视觉解决方案上占了一席之地。
  • @Dpeif 很公平,我已经更改了答案以反映这一点。
  • 我刚刚在 jsFiddle 中做了同样的事情。我知道的唯一解决方案。它无法滚动,因为他固定了示例的高度。随意删除它并测试。
  • 我根据你的小提琴做了一些调整,使形状看起来正确。但是,如果我将内容放在 div 后面,它会在滚动到后面时被白色 ::before 元素遮挡。见这里:jsfiddle.net/nbt4Le0n
  • 不完全是,需要让文字内容滚动到形状后面。
【解决方案3】:

您应该了解一下针对您的目的使用 CSS 剪辑/遮罩技术。

具体来说,你可以通过一些SVG定义来指定你想要达到的边界:

<svg>
  <defs>
    <mask id="masking">
      <!-- white area means: visible -->
      <rect width="300" height="300" fill="white"/>

      <!-- black area means: hidden -->
      <ellipse rx="150" ry="10" cx="150" cy="300" fill="black" />
    </mask>
  </defs>
</svg>

并在 CSS 中使用以下方式引用此掩码:

#your-div {

    mask: url('#masking');
}

我创建了一个小例子,在下面的小提琴中演示了这一点。这仍然需要稍作调整,以便在涉及不同维度时更加灵活,但它应该为您指明方向:http://jsfiddle.net/m8fo5zbk/

更新:跟随小提琴也显示滚动行为http://jsfiddle.net/m8fo5zbk/2/ - 我是否正确理解您的意图?

第二次更新:现在明白内容应该放在 inside 的 div 中,反映在这个演示中:http://jsfiddle.net/m8fo5zbk/3/

【讨论】:

  • 非常接近。我正在尝试将内容放入形状中。我最好的尝试是在曲线上方创建另一个 div,它提供相同的视觉效果,尽管标记更多:jsfiddle.net/z3x86k0r
【解决方案4】:

我测试了一种使用伪元素的border-top 实现这一目标的方法(此处为:之后):http://jsfiddle.net/z6eqvnxw/

.test {
    width: 300px;
    height: 300px;
    background: blue;
    position: relative;

}
.test:after {
    display: block;
    content: "";
    position: absolute;
    width: 100%;
    height: 25px;
    border-top: blue 10px solid;
    bottom: -23px;
    left: 0;
    border-radius: 40%;
}

这并不完美,渲染效果不佳。

是否可以选择使用 Javascript/Canvas?还是只有 CSS?

【讨论】:

    【解决方案5】:

    不确定您需要什么,这是您需要的吗?

    Quick Demo

    html

     <div class="Fixed1"></div>
     <div class="scroll1">
     <p>DEMO CONTENT</p>
     </div>
    

    CSS

    .Fixed1 {
        color: #666;
        height: 200px;
        width: 100%;
        background-color: #06C;
        position: fixed;
        margin-top:40px;
    }
    .scroll1 {
        color: #333;
        height: 1000px;
        width: 720px;
        margin-right: auto;
        margin-left: auto;
        padding-left:50px;
        margin-top:110px;
        background-color: #CCC;
    }
    

    【讨论】:

    • div 后面的滚动在这里工作得很好,但我在蓝色区域的底部没有看到曲线。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多