通常地,一个块盒的内容都被限制在该盒的content
边内。某些状况下,一个盒可能会溢出,意味着它的部份内容或者所有内容位于该盒外部,例如:javascript
一行没法拆分,致使行盒比块盒宽css
一个块级盒对其包含块来讲太宽了。当一个元素的width
属性具备一个能让生成盒从包含块的边内溢出的值时,可能会发生这种状况html
一个元素的高度超出了为其包含块显式指定的高度(即,包含块的高度由height
属性决定,而不是由内容高度)java
一个后代盒是绝对定位的,部份内容在该盒外部。这种盒并不必定会根据其祖先的overflow
属性裁剪。特殊的,它们不会被介于自身和包含块之间的任意祖先的overflow
裁剪css3
一个后代盒具备负margin
,致使它的部份内容被定为在该盒外部segmentfault
text-indent
属性让一个行盒挂在该块盒的left
或者right
边上浏览器
出现溢出时,overflow
属性指定了一个盒是否应该被裁剪到其padding
边内,以及是否须要提供一种滚动机制来访问全部被裁剪掉的内容ide
overflow各类属性值的表现wordpress
在本例中,overflow:visible
默认,对溢出不做处理;overflow:hidden
对溢出部分进行隐藏;overflow:scroll
对右边以及下边作出滚动条处理,无论元素是否溢出;overflow:auto
对溢出部分作滚动条处理;overflow:inherit
应该从父元素继承overflow
属性的值函数
css3中增长了overflow-x
以及overflow-y
分别表明水平方向和垂直方向的overflow
,这两个属性是相同值时,等同于overflow
的属性值;这两个值一个非overflow:visible
,一个为overflow:visible
时,overflow:visible
的属性值会变为overflow:auto
overflow起做用的前提:
非display:inline
水平
对应方位的尺寸限制.width/height/max-width/max-height/absolute拉伸
对于单元格td
等,还须要table
为table-layout:fixed
状态才行
对于ie7
浏览器来讲,使用overflow
会有一些bug:
滚动条样式不一样(这一条在win10中都同样)
宽度设定机制,对于子元素设置width:100%
,ie7会按照父元素宽度计算,也就是400px
,而子元素有垂直滚动条占据一部分空间,因此实际水平宽度不到400px
,所以水平滚动条会出现
解决方法是去掉width:100%
<div class="box"> <div class="content"> </div> </div> .box{ width: 400px; height: 100px; overflow: auto; } .content{ width: 100%; height: 200px; background-color: #beceeb; }
ie7浏览器下,文字越多,按钮两侧padding
留白就越大,这时,给按钮样式添加overflow:visiable
就能解决
overflow:auto/overflow:scroll
,html
标签,textarea
标签
子元素超出父元素限制
在浏览器中,默认滚动条均来自<html>
而不是<body>
缘由:新建一个空白html
,<body>
默认.5em margin
,若是滚动条来自<body>
,则应该有边距,而不是靠着浏览器边缘
IE7-浏览器默认: html{ overflow-y:scroll}
IE8+浏览器默认: html{overflow:auto}
因此咱们去除页面默认滚动条,只须要:
html{ overflow:hidden}
使用js获取滚动高度
Chrome浏览器是:document.body.scrollTop
其余浏览器: document.documentElement.scrollTop
为了兼容性建议使用: var st=document.documentElement.scrollTop||document.body.scrollTop
.box{ width: 400px; height: 100px; padding: 100px 0; overflow: auto; border: 1px solid #000; }
上面的代码在Chrome浏览器中会出现padding-bottom
,而在其它浏览器中都不会出现,这样就致使出现不同的scrollHeight
准确说法应该是滚动栏的宽度.下面方法能够简单得到:
.box{ width: 400px; overflow:scroll; } .in{ *zoom:1; } <div class="box"> <div class="in" id="in"> </div> </div> var a = console.log (400-document.getElementsById("in").clientWidth);
滚动条会占用容器尺寸,本来和谐的布局,滚动条出现后可能会错位或者出现水平滚动条,在实现这种布局时通常使用自适应布局或者预留合适宽度
.container{width:1150px;margin:0 auto}
这种使用水平居中的布局,由于滚动条会占用一部分空间,因此滚动的时候会跳动,向左偏移滚动条宽度
水平居中跳动问题的修复
1.html{overflow-y:scroll}
这个解决方案惟一缺点就是不美观,会出现滚动条
2..container{padding-left:calc(100vw-100%);}
100vw-浏览器宽度; 100%-可用内容宽度;这个解决方案须要IE9+支持
非overflow:visible
能够触发BFC
清除浮动影响
避免margin
穿透问题
两栏自适应布局
1.overflow
内部float
无影响,IE6是不支持的,因此才有了广为流传的清除浮动方法:
3.overflow与两栏自适应布局
还有一种广为流传的实现两栏自适应布局的方法,使用table-cell
在上面的例子中,一旦子元素设置为absolute
,父元素的overflow
属性会失效
绝对定位元素不老是被父级overflow属性裁剪,尤为当overflow在绝对定位元素及其包含块之间的时候
如何避免失效
overflow
元素自身为包含块
overflow
元素的子元素为包含块
任意合法transform
声明看成包含块
transform声明看成包含块
overflow
元素自身transform
overflow
子元素transform
这里面的边缘对齐定位,使用的就是父元素overflow:hidden
,子元素的
被隐藏,后面的图片设置position:absolute
使overflow
对于图片的做用失效,从而实现滚动条上下滚动的边缘定位效果
CSS3有个属性名为resize
,能够拉伸元素尺寸:
resize:both水平垂直两边拉
resize:horizontal只有水平方向拉伸
resize:vertical只有垂直方向拉伸
可是,此声明起做用的前提是元素不是overflow:visible
例1中,咱们给button
使用了一个overflow:hidden
以及resize:both
,button
能够水平垂直拉伸
例2是一个textarea
,由于它默认overflow:auto
,因此它默认就能拉伸
例3是咱们给段落一个overflow:hidden
以及text-overflow:ellipsis
,就会在最后显示...(省略号)
在这个例子中,经过<a>
的#mm3
(锚链)找到图片的id
(锚点)来定位
锚点定位的本质就是:改变容器的滚动高度
须要知足的条件:
容器可滚动
锚点元素在容器内
url地址中的锚链与锚点元素
可focus的锚点元素处于fcous态
快速定位
锚点定位与overflow选项卡技术
在这个例子中,咱们使用了锚点定位技术实现选项卡,并使用overflow:hidden
隐藏溢出的选项卡
这种用法有一个不足之处,就是当咱们在页面偏下位置时,当你切换选项卡的时候,它会定位到最外层的滚动条,体验很糟糕,因此通常用在单页场景
裁剪区域(clipping region)定义了一个元素border box的哪一部分是可见的。默认状况下,元素不会被裁剪。然而,裁剪区域能够经过
clip
属性显式地设置
使用clip
裁剪必须是absolute
或者fixed
元素,本例中没有逗号分隔的是兼容IE6/7版本
rect(top,right,bottom,left);
中的top
,bottom
是相对于盒子上边框边界的偏移,left
,right
是相对于盒子左边框边界的偏移
clip
属性已经弃用,由于它的适用范围过小,只能用在绝对定位元素下,并且只能用于裁剪矩形,取而代之的是clip-path
clip-path
,包括了一条闭合的矢量路径,它能够是CSS中定义的基础形状,也能够是包含了clipPath标签的SVG元素。在闭合路径内的内容会显示,而路径外边的都会被剪掉著做权归做者全部。
clip-path语法:
clip-path: <clip-source> | [ <basic-shape> || <geometry-box> ] | none
where
<clip-source> = <url> <basic-shape> = <inset()> | <circle()> | <ellipse()> | <polygon()> <geometry-box> = <shape-box> | fill-box | stroke-box | view-box
where
<inset()> = inset( <length-percentage>{1,4} [ round <border-radius> ]? ) <circle()> = circle( [ <shape-radius> ]? [ at <position> ]? ) <ellipse()> = ellipse( [ <shape-radius>{2} ]? [ at <position> ]? ) <polygon()> = polygon( <fill-rule>? , [ <length-percentage> <length-percentage> ]# ) <shape-box> = <box> | margin-box
where
<length-percentage> = <length> | <percentage> <shape-radius> = <length-percentage> | closest-side | farthest-side <position> = [[ left | center | right | top | bottom | <length-percentage> ] | [ left | center | right | <length-percentage> ] [ top | center | bottom | <length-percentage> ] | [ center | [ left | right ] <length-percentage>? ] && [ center | [ top | bottom ] <length-percentage>? ]] <fill-rule> = nonzero | evenodd <box> = border-box | padding-box | content-box = border-box | padding-box | content-box
上面的语法表示的是:
clip-source
会是一个剪切元素路径到一个SVG<clip-path>
元素,这个元素能够是内部的或者外部的
basic-shape
符合CSS Shapes specification定义的基础形状函数
geometry-box
可选项.若是同<basic-shape>
一块儿声明,它将为基础形状提供相应的参考盒子.经过自定义,它将利用肯定的盒子边缘包括任何形状边角(好比说,被border-radius定义的剪切路径)
css-masking-1
clip-path css-tricks
clip-path MDN
Introducing the CSS clip-path Property
打破盒子模式的限制,使用Clip-Path建立响应式图形
visibility属性有两种用法:
取值为hidden
时隐藏元素,并将其所占空间用空白占位
取值为collapse
时隐藏表格的一行或一列