如何不使用 overflow: hidden 实现 overflow: hidden

一个很有意思的题目。如何不使用 overflow: hidden 实现 overflow: hidden

CSS 中 overflow 定义当一个元素的内容太大而无法适应块级格式化上下文时候该做什么。而 overflow: hidden 则会将超出容器范围内的内容剪裁。

控制 overflow: hidden 的方向

这源自一个实际的需求,在某个需求当中,要求容器内的内容,在竖直方向上超出容器会被裁剪,而在水平方向上超出容器,则不会被裁剪。类似这样:


1c670be34f0bbb8928031c48ab8d63f7.gif


有意思,第一个想到的解法当然是在上述黄色背景元素本身之外再套用一层父元素,然后父元素才是实际设置 overflow: hidden 的元素,父元素的范围就是实际才是控制是否裁剪的范围。类似这样:


d4c990c75a8c262c65861b95f484ee6a.gif


实际的父元素才是设置了 overflow: hidden 的元素。

当然,如果实际情况就是这么简单,也没什么问题。

但是如果元素处于一个复杂的布局流内,那么可能就没有那么多的空间,让我们再去包裹一层父容器了:


926affa851e6faa6fb0fadfe481abad2.png


类似上图的情况,还是中间黄色元素,要求只有竖直方向超出裁剪。此时,包裹父元素不再那么容易施展。所以,我们需要另辟蹊径。

利用 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 支持负坐标的特点,将裁剪的起点定到远离坐标能画成一个大矩形的形状。示意图:

01961d1bfdc46f46d9eaae9ace5062cd.png


这样,我们能够在正常布局流中,当前容器大小范围内,画出任意希望 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 的裁剪方式

那么。通过上面的一个小例子,我们知道了 overflowclip-path 可以裁剪区域。那么除了这两个,CSS 中还有没有可以进行区域裁剪的元素呢?

有,还有一个有意思的元素,就是 -- contain

contain 属性允许我们指定特定的 DOM 元素和它的子元素,让它们能够独立于整个 DOM 树结构之外。目的是能够让浏览器有能力只对部分元素进行重绘、重排,而不必每次都针对整个页面。

这里不具体去介绍它的每个属性,感兴趣的可以翻看下这篇文章 -- CSS新特性contain,控制页面的重绘与重排

contain: paint 进行内容裁剪

详细说说 contain: paint,设定了 contain: paint 的元素即是开启了布局限制,也就是说,此元素的子元素不会在此元素的边界之外被展示。

contain: paint 属性产生的目的,即是为加快页面的渲染,在非必要区域,不渲染元素。因此,如果元素不在屏幕上或以其他方式设定为不可见,则其后代不可见不被渲染。
.g-container {
 contain: paint;
} 

看看示例:


91ceec54e0cadeeeb628bebecb2a1ff7.gif


CodePen Demo -- contain: paint Demo

contain: paint 的副作用

contain: paint 的本意是用于提升页面的渲染,裁剪到容器之外的元素不进行渲染。但是使用它会产生一些副作用:

  1. 它会生成一个自己的新的堆叠上下文(It becomes a stacking context),也就是说,它会改变它的子元素的 absolute 定位和 fixed 定位的基准;
  2. 它会成为新的格式化上下文(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

当然,它们之间还是有一些差异:

  1. overflow: hiddencontain: paint 会创建一个 BFC,而clip-path不会,它只是单纯的裁剪
  2. 兼容性间的差异

所以也就是说,CSS 不仅仅只有 overflow: hidden 实现 overflow: hidden,很多情况,可以灵活使用。

牛刀小试

再来个有意思的环节,在 一行 CSS 代码的魅力 中,提到了 CSS Battle

这个网站是核心玩法就是:官方给出一张图形,在给定的 400 x 300 的画布上,能够用越短的代码实现它,分数就越高。

上次讲了一题通过一行 CSS 代码实现,今天,我们再来看看第二题


df4b17774bfebca7867d053c56338715.png


怎么用最短的代码实现它呢?想想今天说的 clip-path

首先,我们利用这一一段代码,生成这样一个图形:

<style>
body {
 margin: 0 50px;
 background: #62374e;
 border: 50px dashed #fdc57b;
} 


093c66e5f0b5b2b47ce03f3f74c68ceb.png


然后,利用 clip-path,把上下两部分裁掉即可。

<style>
body {
 margin: 0 50px;
 background: #62374e;
 border: 50px dashed #fdc57b;
 + clip-path: polygon(0 50px, 100% 50px, 100% 250px, 0 250px);
} 


9bb2da9d57ca270a0a073f36e5f29dc6.png


这样就完美实现啦。当然,现在字符数有点多,有 158 个字符这么多。其实对于裁剪矩形区域,clip-path 有更便捷的语法,上述 clip-path:polygon(0 50px, 100% 50px, 100% 250px, 0 250px) 可以替换成 clip-path:inset(50px 0),减少了 20 个字符。

当然,再暴力一点,我们也可以一行实现:

<bodybgcolor=62374e style=margin:0+50;border:dashed+50px#fdc57b;clip-path:inset(50px+0> 
当然,这里可能用了一些这个网站才允许的语法,不过核心实现还是在于用 clip-path 切割掉多余部分

最后

好了,本文到此结束,希望对你有帮助 :)

原文链接: 如何不使用 overflow: hidden 实现 overflow: hidden
作者: ChokCoco

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: overflow: hidden 是 CSS 中的一个属性,用于指定当内容超出容器的范围时,是否显示溢出的内容。如果使用 overflow: hidden,则内容会被隐藏。这可以用于创建不显示滚动条的块级容器。 ### 回答2: overflow: hidden是CSS中的一个属性,用于控制一个元素的内容溢出时的处理方式。当元素内容超出了其指定的尺寸范围时,可以通过设置overflow: hidden来隐藏溢出的内容。 具体来说,overflow: hidden属性使得超出元素尺寸范围的内容被裁剪隐藏,不会显示在页面上。这种情况下,虽然内容仍然存在,但对用户来说是不可见的。 使用overflow: hidden属性可以实现一些效果,比如防止文本内容溢出容器、隐藏导航栏中的下拉菜单等。当一个容器元素的内容超出了其指定的尺寸范围时,可以将溢出的部分通过设置overflow: hidden进行隐藏,从而避免页面布局混乱。 需要注意的是,overflow: hidden属性只对具有设置高度或宽度的容器元素起效。如果没有设置容器元素的高度或宽度,那么无法触发溢出隐藏的效果。 总之,overflow: hidden是CSS的一个属性,通过设置它可以使得超出容器尺寸范围的内容被隐藏,为页面布局和展示效果提供了一种解决方案。 ### 回答3: overflow: hidden是一个CSS属性,用于控制容器中内容溢出时的处理方式。当容器的内容超出容器的大小时,可以使用该属性来决定内容的显示方式。 该属性的作用是,当内容超出容器的大小时,将超出部分隐藏起来。这意味着,内容会被截断,并且超出容器的部分不会显示出来。因此,容器的大小决定了内容的可见区域。 当容器的宽度或高度不够显示所有内容时,会自动出现滚动条以便滚动查看内容。但是,使用overflow: hidden后,超出容器的内容将被隐藏,无法通过滚动条查看。 这个属性在设计响应式网页时非常有用。当在移动设备上显示具有较大尺寸的内容时,可以使用overflow: hidden来控制内容的显示,以避免内容溢出导致页面错乱。同时,也可以在制作图片展示或幻灯片等需要固定区域大小的效果时使用该属性。 总之,overflow: hidden用于控制容器中内容溢出时的显示方式,将超出容器的内容隐藏起来,并且不会显示滚动条。这是一种常用的CSS属性,特别适用于移动设备和响应式网页设计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cj瑾瑜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值