一个很有意思的题目。如何不应用 overflow: hidden
实现 overflow: hidden
?
CSS 中 overflow
定义当一个元素的内容太大而无奈适应块级格式化上下文时候该做什么。而 overflow: hidden
则会将超出容器范畴内的内容剪裁。
管制 overflow: hidden
的方向
这源自一个理论的需要,在某个需要当中,要求容器内的内容,在竖直方向上超出容器会被裁剪,而在程度方向上超出容器,则不会被裁剪。相似这样:
有意思,第一个想到的解法当然是在上述黄色背景元素自身之外再套用一层父元素,而后父元素才是理论设置 overflow: hidden
的元素,父元素的范畴就是理论才是管制是否裁剪的范畴。相似这样:
理论的父元素才是设置了 overflow: hidden
的元素。
当然,如果理论状况就是这么简略,也没什么问题。
然而如果元素处于一个简单的布局流内,那么可能就没有那么多的空间,让咱们再去包裹一层父容器了:
相似上图的状况,还是两头黄色元素,要求只有竖直方向超出裁剪。此时,包裹父元素不再那么容易施展。所以,咱们须要另辟蹊径。
利用 clip-path
进行裁剪
好的,这会能够进入注释了。CSS 中,除了 overflow: hidden
,还是有其它属性也能够实现超出容器区域进行裁剪的。clip-path
便是其中翘楚。
应用 clip-path
,咱们能够不便的管制任意方向上的裁剪。上述的需要则能够这样解决:
<div class="g-container">
<div class="sub"></div>
</div>
要害的 CSS 代码如下:
.g-container {
width: 200px;
height: 200px;
clip-path: polygon(-1000% 0, 1000% 0, 1000% 100%, -1000% 100%);
}
这里利用了 clip-path: polygon()
来裁剪一个矩形区域,而利用了 clip-path
反对负坐标的特点,将裁剪的终点定到远离坐标能画成一个大矩形的形态。示意图:
这样,咱们可能在失常布局流中,以后容器大小范畴内,画出任意心愿 overflow: hidden
的范畴。
你能够点进 Demo 外面尝试下:
CodePen — Clip-path overflow
再举两个例子:
{
// 裁剪出左右两边都 overflow:hidden,高低不 overflow:hidden 的区域
clip-path: polygon(0 -1000% ,100% -1000%, 100% 1100%,0 1100%);
// 裁剪出右边、上边、左边都 overflow:hidden,下边不 overflow: hidden 的区域
clip-path: polygon(100% 0,100% 1000%, 0 1000%, 0 0);
}
当然,上述代码中的 1000%
是非常灵活的,本人管制,够用就行。
非 overflow、clip-path 的裁剪形式
那么。通过下面的一个小例子,咱们晓得了 overflow
,clip-path
能够裁剪区域。那么除了这两个,CSS 中还有没有能够进行区域裁剪的元素呢?
有,还有一个有意思的元素,就是 — contain
。
contain
属性容许咱们指定特定的 DOM 元素和它的子元素,让它们可能独立于整个 DOM 树结构之外。目标是可能让浏览器有能力只对局部元素进行重绘、重排,而不用每次都针对整个页面。
这里不具体去介绍它的每个属性,感兴趣的能够翻看下这篇文章 — CSS 新个性 contain,管制页面的重绘与重排
contain: paint
进行内容裁剪
具体说说 contain: paint
,设定了 contain: paint
的元素即是开启了 布局限度,也就是说,此元素的子元素不会在此元素的边界之外被展现。
contain: paint
属性产生的目标,即是为放慢页面的渲染,在非必要区域,不渲染元素。因而,如果元素不在屏幕上或以其余形式设定为不可见,则其后辈不可见不被渲染。
.g-container {contain: paint;}
看看示例:
CodePen Demo — contain: paint Demo
contain: paint
的副作用
contain: paint
的本意是用于晋升页面的渲染,裁剪到容器之外的元素不进行渲染。然而应用它会产生一些副作用:
- 它会生成一个本人的新的重叠上下文(It becomes a stacking context),也就是说,它会扭转它的子元素的 absolute 定位和 fixed 定位的基准;
- 它会成为新的格式化上下文(It becomes a new formatting context),也就是说,这意味着元素内部的布局不会再影响它的子元素;
更具体的,能够看看这篇文章 — CSS Containment in Chrome 52
咱们解释下第一点,十分的有意思,它会生成一个本人的新的重叠上下文,也就是说,它将扭转 position: fixed
元素的基准,它会使得设置了 position: fixed
的元素不再绝对于视口进行定位,而是绝对于该元素进行定位。也就是进化成了 position: absolute
。
当然,这个不是本文的重点,我提供了一个 Demo — contain: paint create a stacking context,这里就不持续开展。
总结一下
到此,本文提供了 3 种能够实现超出容器范畴裁剪的办法:
overflow: hidden
clip-path
绘制裁切区域contain: paint
不绘制元素范畴外的内容
这里再提供下 3 个示例的 Demo:CodePen Demo — Overflow Hidden In CSS
当然,它们之间还是有一些差别:
overflow: hidden
和contain: paint
会创立一个 BFC,而clip-path
不会,它只是单纯的裁剪- 兼容性间的差别
所以也就是说,CSS 不仅仅只有 overflow: hidden
实现 overflow: hidden
,很多状况,能够灵便应用。
牛刀小试
再来个有意思的环节,在 一行 CSS 代码的魅力 中,提到了 CSS Battle。
这个网站是外围玩法就是:官网给出一张图形,在给定的 400 x 300 的画布上,可能用越短的代码实现它,分数就越高。
上次讲了一题通过一行 CSS 代码实现,明天,咱们再来看看第二题:
怎么用最短的代码实现它呢?想想明天说的 clip-path
。
首先,咱们利用这一一段代码,生成这样一个图形:
<style>
body {
margin: 0 50px;
background: #62374e;
border: 50px dashed #fdc57b;
}
而后,利用 clip-path
,把高低两局部裁掉即可。
<style>
body {
margin: 0 50px;
background: #62374e;
border: 50px dashed #fdc57b;
+ clip-path: polygon(0 50px, 100% 50px, 100% 250px, 0 250px);
}
这样就完满实现啦。当然,当初字符数有点多,有 158 个字符这么多。其实对于裁剪矩形区域,clip-path
有更便捷的语法,上述 clip-path:polygon(0 50px, 100% 50px, 100% 250px, 0 250px)
能够替换成 clip-path:inset(50px 0)
,缩小了 20 个字符。
当然,再暴力一点,咱们也能够一行实现:
<body bgcolor=62374e style=margin:0+50;border:dashed+50px#fdc57b;clip-path:inset(50px+0>
当然,这里可能用了一些这个网站才容许的语法,不过外围实现还是在于用
clip-path
切割掉多余局部
最初
好了,本文到此结束,心愿对你有帮忙 :),想 Get 到最有意思的 CSS 资讯,千万不要错过我的公众号 — iCSS 前端趣闻 ????
更多精彩 CSS 技术文章汇总在我的 Github — iCSS,继续更新,欢送点个 star 订阅珍藏。
如果还有什么疑难或者倡议,能够多多交换,原创文章,文笔无限,满腹经纶,文中若有不正之处,万望告知。