【问题标题】:Invert rounded corner in CSS?在CSS中反转圆角?
【发布时间】:2011-04-30 01:14:01
【问题描述】:

我有一个 CSS 代码:

-moz-border-radius-topleft:50px;

我得到了结果:

有没有可能这样给:

【问题讨论】:

    标签: css svg border css-shapes


    【解决方案1】:

    这可以通过radial gradient 来完成。

    div {
      width: 20vw;
      height: 20vw;
      background: radial-gradient(circle at top left,transparent 4vw, darkblue 4.1vw);
    }
    <div></div>

    为了好玩,可以通过定义多个背景来添加额外的倒角 - 每个角一个:

    div {
      width: 40vw;
      height: 40vw;
      position: relative;
      background-color: darkblue;
      --circle: radial-gradient(circle,white 8vw, darkblue 8.1vw);
    }
    div:before {
      content: '';
      position: absolute;
      width: 100%;
      height: 100%;
      background-image: var(--circle), var(--circle), var(--circle), var(--circle);
      background-size: 18vw 18vw;
      background-position: -40% -40%, 140% -40%, -40% 140%, 140% 140%;
      background-repeat: no-repeat;
    }
    <div></div>

    【讨论】:

      【解决方案2】:

      在现代浏览器中,您可以使用mask-image

      #aux-container {
        width: 100px;
        height: 100px;
        background: #f00;
        -webkit-mask-image: radial-gradient(circle 10px at 0 0, transparent 0, transparent 20px, black 21px);
      }
      <div id="aux-container"></div>

      http://jsbin.com/eViJexO/1/

      另外,看看http://www.html5rocks.com/en/tutorials/masking/adobe/,它描述了如何使用mask-box-image实现类似的结果。

      【讨论】:

      【解决方案3】:

      可以使用 after 元素来完成。 check this jsfiddle linkenter code here

      【讨论】:

      • .box{width:100px;height:100px;background:#1D005D;position:relative;overflow:hidden;} .box:after{background: #fff none 重复滚动 0 0;边框半径:20px;内容: ” ”;显示:块;高度:20px;左:-5px;位置:绝对;顶部:-5px;宽度:20px;}
      【解决方案4】:

      您也可以使用 inline svgpath element

      body{background:url('http://i.imgur.com/RECDV24.jpg');background-size:cover;}
      svg{width:30%;}
      <svg viewbox="0 0 10 10">
        <path d="M9 1 V9 H1 V3 Q3 3 3 1" fill="#fff"/>
      </svg>

      在本例中,我使用cubic bezier curve 表示倒圆边。

      通过这种方法,您还可以用图像填充形状或渐变:

      body{background:url('http://i.imgur.com/RECDV24.jpg');background-size:cover;}
      svg{width:30%;}
      <svg viewbox="0 0 10 6.7">
        <defs>
          <clipPath id="clip">
            <path d="M9 1 V6.7 H1 V3 Q3 3 3 1" fill="#fff"/>
          </clipPath>
        </defs>
        <image xlink:href="http://i.imgur.com/qi5FGET.jpg" x="0" y="0" height="6.7" width="10" clip-path="url(#clip)"/>
      </svg>

      【讨论】:

      • 我使用它来支持基于背景的解决方案,因为它也适合打印。不错。
      【解决方案5】:

      对于一个普通的背景色,你实际上可以,使用伪元素和盒子阴影来绘制背景色,它不会隐藏父容器的背景,你会真正看到它们 .

      您需要的是一个能够理解 :before/:after 和 box-shadow 的浏览器 :) ...

      对于 IE8 ,您可以绘制 hudge 边框而不是阴影。 http://codepen.io/anon/pen/fFgDo

      box-shadow 方法:http://codepen.io/anon/pen/FwLnd

      div {
        margin:2em; /* keep it away from sides to see result */
        padding:2em;/* for test to size it when empty */
        position:relative; /* reference to set pseudo element where you wish */
        overflow:hidden;/* you do not want the box-shadow all over the page */
      }
      div:before {
        content:'';
        position:absolute;
        width:80px;
        height:80px;
        top:-40px;
        left:-40px;
        border-radius:100%;
        box-shadow:0 0 0 2000px #1D005D;/* here draw the shadow inside its parent , maybe z-index will be required for content */
      }
      


      伪元素可以采用任何形状,并通过 css 进行转换,并在其元素中设置任何位置以通过:示例:http://codepen.io/gc-nomade/pen/nKAka

      【讨论】:

        【解决方案6】:

        只是为了更新这个,看来你可以通过多种方式。

        Lea Verou posted a solution

        Here is mine using border-image

        使用边框图片

        html

        <div><img src="https://s3.amazonaws.com/resized-images-new/23292454-E6CD-4F0F-B7DA-0EB46BC2E548" /></div>
        

        css

        div {
            width: 200px;           
            border-width: 55px;
            -moz-border-image: url(http://i47.tinypic.com/2qxba03.png) 55 repeat;
            -webkit-border-image: url(http://i47.tinypic.com/2qxba03.png) 55 repeat;
            -o-border-image: url(http://i47.tinypic.com/2qxba03.png) 55 repeat;
            border-image: url(http://i47.tinypic.com/2qxba03.png) 55 repeat;
            margin: 50px auto;   
        }
        

        使用径向渐变

        Lea Verou's solution

        html

        <div class="inner-round"></div>
        

        css

        .inner-round {
            background-image:
                radial-gradient(circle at 0 0, rgba(204,0,0,0) 14px, #c00 15px),
                radial-gradient(circle at 100% 0, rgba(204,0,0,0) 14px, #c00 15px),
                radial-gradient(circle at 100% 100%, rgba(204,0,0,0) 14px, #c00 15px),
                radial-gradient(circle at 0 100%, rgba(204,0,0,0) 14px, #c00 15px);
        }
        

        【讨论】:

        【解决方案7】:

        有一些方法可以通过仅使用 CSS 来解决此问题 - 但是这将取决于您的背景颜色(如果是纯色则更容易),如果您有背景图案,它可能会稍微复杂一些。

        我在这里介绍如何制作Inverse Border Radius in CSS (here) 的基本示例。这使用了边框大小的技巧来使用内部,您可能需要做一些定位才能使其正常工作,但是您可以看到它是可能的。特别是如果您为每个 span 指定一个 background-color

        如果您想要所有 4 个角,则必须在 div 中为每个 span 添加一个单独的类,并且每个类都会模拟一个角、左上角、右上角等。

        【讨论】:

          【解决方案8】:

          很遗憾,目前还没有基于官方或实施的 CSS Specs 的解决方案 :(

          但是,正如其他人所补充的,您可以使用 JS 库或复杂的 HTML/CSS 实现来实现相同的效果。我在寻找一种在不使用图像的情况下制作比 OP 更复杂的拐角的方法时遇到了这个问题。

          我在 webkit 网站上提交了一个错误(功能请求) - 因为似乎还没有提交。

          Bug 62458 - Feature Request: Inverse rounded corners

          【讨论】:

            【解决方案9】:

            其实有一种方法,像这样:

            <div style="background-color: red;height: 12px; width: 12px;">
                <div style="margin-top: 40px; height: 12px; width: 12px; moz-border-radius-topright: 12px;
                    -webkit-border-top-right-radius: 12px; border-top-right-radius: 12px; background-color:#fff">
                </div>
            </div>
            

            但正如@Domenic 所说,你需要一个坚实的背景,否则你会得到这个:

            <div style=" background-color:#666">
              <div style="background-color: red;height: 12px; width: 12px;">
                <div style="margin-top: 40px; height: 12px; width: 12px; moz-border-radius-topright: 12px;
                    -webkit-border-top-right-radius: 12px; border-top-right-radius: 12px; background-color:#fff">
                </div>
            </div>
            

            【讨论】:

              【解决方案10】:

              没有。 如果您有纯色背景,您可能可以使用 css 来创建咬合。
              否则,除了使用 PNG 之外,您无法做任何特别的事情,就像您在 border-radius 之前创建圆角一样。

              【讨论】:

                【解决方案11】:

                不,没有。

                【讨论】:

                • 这个答案看起来有点多余,而其他人已经发布了很多实现这种形状的方法。 :)
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多