【问题标题】:How do I draw an incomplete circle with CSS and in it how to put a picture?如何使用 CSS 绘制一个不完整的圆圈以及如何在其中放置图片?
【发布时间】:2015-03-13 21:54:46
【问题描述】:

如何使用 CSS 和图片创建一个带有切口的圆圈?下面显示了我想要的示例。需要一个跨浏览器解决方案,并且使用 css 而不是 html。

【问题讨论】:

标签: css svg geometry css-shapes


【解决方案1】:

您可以通过使用伪元素创建圆然后使用overflow: hidden 倾斜容器来做到这一点。

子伪元素被反向倾斜,使其看起来好像根本没有倾斜。

.shape {
  position: relative;
  height: 100px;
  width: 120px;
  overflow: hidden;
  -webkit-transform: skew(-45deg);
  -moz-transform: skew(-45deg);
  transform: skew(-45deg);
}
.shape:after {
  position: absolute;
  content: '';
  top: 0px;
  left: 0px;
  height: 100px;
  width: 100px;
  background: black;
  border-radius: 50%;
  -webkit-transform: skew(45deg);
  -moz-transform: skew(45deg);
  transform: skew(45deg);
}
<div class="shape"></div>

【讨论】:

    【解决方案2】:

    我有另一个解决方案,这个也使用 SVG,但是是 cross 浏览器兼容 根据 OP 需要:

    看到这个Fiddle

    你不需要任何 CSS,只需要三行 html

    <svg >
     
     <circle cx="50" cy="50" r="50" clip-path="url(#cut-off-bottom)" />
      <polygon points="0,0 40,0 0,50" style="fill:white;" />
    </svg>

    编辑: 我想补充一点,你也可以在 svg 中显示图片

    <svg>
    
      <pattern id="img1" patternUnits="userSpaceOnUse" width="200" height="200">
        <image xlink:href="http://images.visitcanberra.com.au/images/canberra_hero_image.jpg" x="0" y="-50" width="200" height="200" />
      </pattern>
      <circle cx="50" cy="50" r="50" fill="url(#img1)" />
    
    
      <polygon points="0,0 40,0 0,50" style="fill:white;" />
    </svg>

    再一次,你甚至不需要 css,而且它是高度跨浏览器兼容的。

    【讨论】:

    • @Persijn:这些被称为XY problems,当用户提出问题并最终得到不同的解决方案时。无论如何,这个解决方案只使用 HTML 来满足它的需求,不是很好.. 或者采取这种方式.. 你仍然需要编写 html 来绘制一个 css 圆圈.. 删除所有 html 并只使用 css 怎么样.. 你呢有这样的解决方案(只有css,没有html)
    • @NoDownvotesPlz 我正在尝试将您的代码与我的设计集成,我有一个更大的图像,当我将您的代码放在上面时,它并没有看起来像您的小提琴。我知道我需要更改 x、y、z 坐标,但不知道具体如何,您能帮我吗?
    • @AnahitGhazaryan.. 也接受对您有用的答案,不要一直接受然后再不接受答案.. 如果您有更多问题,请以不同的方式提问
    • @NoDownvotesPlz 这里是Fiddle。我需要更大的图像
    【解决方案3】:

    使用 SVG 的一些不同方法

    您可以使用 svg 绘制一个剪裁圆然后旋转它。

    小提琴:http://jsfiddle.net/j66xt2so/

    svg{-webkit-transform: rotate(135deg);
      -moz-transform: rotate(135deg);
      transform: rotate(135deg);
    }
    <svg >
      <defs>
        <clipPath id="cut-off-bottom">
          <rect x="0" y="0" width="200" height="100" />
        </clipPath>
      </defs>
    
      <circle cx="100" cy="70" r="50" clip-path="url(#cut-off-bottom)" />
    </svg>

    【讨论】:

    • @AnahitGhazaryan:请不要误认为这是要求接受我的回答,因为我不是。接受是您自己的选择,但两个答案的跨浏览器性质相同,因为两者都使用转换。
    • @AnahitGhazaryan.. Harry 是对的:这两种解决方案在跨浏览器兼容性方面都是相同的
    • @web-tiki 这是我更喜欢的第二个解决方案,但它对我不起作用,因为在我有 img 的 div 中它通常不是空的,你能帮我解决这个问题吗?
    【解决方案4】:

    渐变背景是一种解决溢出的奇怪行为:隐藏
    border-radius:100%; 设置为各种方式获取通知。

    添加了:after 来添加我们需要的内容来取消我们不想要的部分。

    .cut {
      overflow: hidden;
      width: 100px;
      height: 100px;
      border-radius: 100%;
      background: -moz-radial-gradient(center, ellipse cover, #000 0%, #000 1%, #000 95%, rgba(0, 0, 0, 0) 100%);
      background: -webkit-radial-gradient(center, ellipse cover, #000 0%, #000 1%, #000 95%, rgba(0, 0, 0, 0) 100%);
      background: -ms-radial-gradient(center, ellipse cover, #000 0%, #000 1%, #000 95%, rgba(0, 0, 0, 0) 100%);
      background: radial-gradient(ellipse at center, #000 0, #000 48px, transparent 49px);
    }
    .cut:after {
      transform: rotate(-60deg) translate(-25px, -20px);
      display: block;
      content: "";
      height: 30px;
      width: 100px;
      background-color: white;
    }
    &lt;div class="cut"&gt;&lt;/div&gt;

    【讨论】:

    • @Persijn 讨论了“奇怪的边界”行为here
    • box-shadow 也会出现同样的问题。
    猜你喜欢
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多