解决 border-radius 元素在应用了 transform 的子元素 时overflow:hidden 失效的问题
受大家启迪,于是最近深入研究了一下Css3中的一些属性。之中也是碰到了个不为我知的问题,在这里特此总结并与大家分享。
问题重现:在父元素上应用了 border-radius 的圆角属性、加上 overflow:hidden属性 、并且子元素填充整个父元素。于是看到的效果是:子元素超出父元素圆角的部分被隐藏掉,形成一个圆角头像容器的结构。代码如下:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>test</title>
<style>
html,body{
width: 100%;
height: 100%;
} #father {
width: 200px;
height: 200px;
overflow: hidden;
border-radius: 50%;
background-color: #ccc;
}
#child {
background-color: red;
width: 100%;
height: 100%;
-webkit-transition:all 0.5s ease;
transition:all 0.5s ease;
}
</style> </head>
<body> <div id="father">
<div id="child"></div>
</div> </body>
</html>
效果如下:
想着使用translate3d实现对半圆的动画效果,于是乎问题就显现了。
问题描述:对 #child 应用一个 transform 变化,使用 translate3d 对其进行横向偏移。会发现 #child 溢出了 #father 的圆角范围。 overfow:hidden 失效。
代码如下:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>test</title>
<style>
html,body{
width: 100%;
height: 100%;
} #father {
width: 200px;
height: 200px;
overflow: hidden;
border-radius: 50%;
background-color: #ccc;
}
#child {
background-color: red;
width: 100%;
height: 100%;
-webkit-transition:all 0.5s ease;
transition:all 0.5s ease;
} /*使用 translate3d 让子元素沿x正轴偏移100px*/
#child.add-translate {
-webkit-transform:translate3d(100px,0,0);
transform:translate3d(100px,0,0);
}
</style> </head>
<body> <div id="father">
<div id="child" class="add-translate"></div>
</div> </body>
</html>
使用 translate3d 让子元素沿x正轴偏移100px
显示如下:
解决方案:
1:使用webkit-mask-image 覆盖圆角溢出部分。(文章后面会提供关于webkit-mask-image的相关介绍)
-webkit-mask-image 可以使用图片、Gradient 渐变或者 SVG mask 作为元素的 mask 遮罩。在 WebKit 的兼容性还算可以。
(图片来源于 CSS遮罩 – w3cplus )
回到刚才的问题。在这里使用一个纯黑色的 1px png 图像。应用 mask 遮罩解决该问题。在#father 上应用 add-mask-image类名后,#child触发 transform 动画后就不会出现溢出的问题了。代码如下:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>test</title>
<style>
html,body{
width: 100%;
height: 100%;
} #father {
width: 200px;
height: 200px;
overflow: hidden;
border-radius: 50%;
background-color: #ccc;
}
#child {
background-color: red;
width: 100%;
height: 100%;
-webkit-transition:all 0.5s ease;
transition:all 0.5s ease;
} /*使用 translate3d 让子元素沿x正轴偏移100px*/
#child.add-translate {
-webkit-transform:translate3d(100px,0,0);
transform:translate3d(100px,0,0);
} /*使用 -webkit-mask-image 遮罩*/
#father.add-mask-image{
-webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC);
}
</style> </head>
<body> <div id="father" class="add-mask-image">
<div id="child" class="add-translate"></div>
</div> </body>
</html>
使用 -webkit-mask-image 遮罩
效果如下:
该问题在Stackoverflow的讨论:
webkit-overflow-issue-on-border-radius-and-transform
how-to-make-css3-rounded-corners-hide-overflow-in-chrome-opera
有关-webkit-mask-image的简单介绍:
http://ued.ctrip.com/webkitcss/prop/mask-image.html
2:父元素加上 transform 属性。
子元素在使用了 transform 属性后致使它改变了原有的默认维度,而这时的父元素无任何改变,仍为2d维度(css默认都为2d维度)。因此导致了子元素使用translate3d属 性后出现溢出的情况。接下来只要在原有的父元素样式中加上 transform 属性将父元素改变维度即可。(可以使用translate3d 或 rotate 解决)
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>test</title>
<style>
html,body{
width: 100%;
height: 100%;
} #father {
width: 200px;
height: 200px;
overflow: hidden;
border-radius: 50%;
background-color: #ccc;
transform:translate3d(0,0,0);/*父元素使用transform:translate3d 属性*/
-webkit-transform:translate3d(0,0,0);
}
#child {
background-color: red;
width: 100%;
height: 100%;
-webkit-transition:all 0.5s ease;
transition:all 0.5s ease;
} /*使用 translate3d 让子元素沿x正轴偏移100px*/
#child.add-translate {
-webkit-transform:translate3d(100px,0,0);
transform:translate3d(100px,0,0);
}
</style> </head>
<body> <div id="father">
<div id="child" class="add-translate"></div>
</div> </body>
</html>
父元素增加 transform:translate3d 属性
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>test</title>
<style>
html,body{
width: 100%;
height: 100%;
} #father {
width: 200px;
height: 200px;
overflow: hidden;
border-radius: 50%;
background-color: #ccc;
-webkit-transform:rotate(0deg);/*父元素使用transform:rotate 属性*/
transform: rotate(0deg);
}
#child {
background-color: red;
width: 100%;
height: 100%;
-webkit-transition:all 0.5s ease;
transition:all 0.5s ease;
} /*使用 translate3d 让子元素沿x正轴偏移100px*/
#child.add-translate {
-webkit-transform:translate3d(100px,0,0);
transform:translate3d(100px,0,0);
}
</style> </head>
<body> <div id="father">
<div id="child" class="add-translate"></div>
</div> </body>
</html>
父元素增加 transform:rotote 属性
效果:同解决方案一中实现的效果如出一辙,在这里就不贴图了,有兴趣的朋友可以亲自证明一下。
transform的介绍:
三:补充内容(待注意)
1:关于感谢:
a:首先非常感谢大家对 Lying 的启迪。如有需要,留下你们的评论,随时提供服务。
b:感谢前文作者。Lying 在借鉴的原文章上增加了一些自个的见解。有时间咋们见个面呗
2:关于文章内容:
a:没有对浏览器做兼容测试。(搬砖中写的一篇文章)
b:Stackoverflow 上许多友人都说这是 google 的一个bug,因此在这里不能保证解决方案的第二条阐述的正确与否。但这条肯定是可以解决问题的 (chrome中亲测有效)
c:相信还会有其它的解决方案。(简单的看了 Stackoverflow 提供的一些方案,因此在这里没有列出,大家也可以查看文中提供的链接了解了解)
3:关于对Css 3 见解:
a:Css 3 的确是很值得学习的,今后 Lying 也会同大家一起一直保持着学习的积极性和善于分享的心。
解决 border-radius 元素在应用了 transform 的子元素 时overflow:hidden 失效的问题的更多相关文章
- CSS开发技巧(四):解决flex多行布局的行间距异常、子元素高度拉伸问题
在使用flex布局时,若出现换行,有两种较为特殊的现象是值得我们研究的: 子元素高度被拉伸,其实际高度大于它的内容高度. 各行子元素之间的行间距过大,甚至我们根本没有给子元素设置margin. 现在我 ...
- 父元素高度设置为min-height,子元素高度设置为100%,但实际上子元素高度你知道是多少吗?
前言 给父元素一个min-height,子元素设置height:100%. 代码 <!DOCTYPE html> <html> <head> <title&g ...
- border-radius元素overflow:hidden失效问题
父元素使用border-radius和overflow:hidden做成圆形,子元素如果使用了transform属性,则父元素的overflow:hidden会失效. 解决方法: 父元素使用 -wei ...
- 微信小程序 CSS border-radius元素 overflow:hidden失效问题 iPhone ios 苹果兼容问题 伪类元素
同事找我解决一个问题 说安卓圆角没问题 苹果上失效了 我一看 其实就是没做兼容上图给你们看看 有没有看出来 其实就是父级设置圆角属性失效 父元素使用border-radius和overflow:hid ...
- css ie7中overflow:hidden失效问题及解决方法
css兼容ie7: 做页面的时候用负边距居中的时候在IE7下面,父节点中的overflow:hiden失效的问题,查阅了一些资料,总结一下解决方法. 问题原因: 当父元素的直接子元素或者下级子元素的样 ...
- ie6-7 overflow:hidden失效问题的解决方法
即使父元素设置了overflow:hidden.解决这个bug很简单,在父元素中使用position:relative; zoom: 1;触发haslayout 即可解决该BUG.
- 改变父元素的透明度,不影响子元素的透明度—css
1.如果我们给父元素添加opacity:0.4后,子元素的red颜色也变成了0.4的透明度, 例子如下: <!DOCTYPE html> <html> <head> ...
- div高度自适应(父元素未知,所有高度跟随子元素最大的高度)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- CSS子元素居中(父元素宽高已知,子元素未知)
<style> .container{width:400px; height:400px; position:relative;} .center{position:absolute; l ...
随机推荐
- SQLite中的PRAGMA语句攻略
原文地址:http://iihero.iteye.com/blog/1189633 PRAGMA语句是SQLITE数据的SQL扩展,是它独有的特性,主要用于修改SQLITE库或者内数据查询的操作.它采 ...
- HTML5 Cheat sheet PNG帮助手册(标签、事件、兼容)
HTML5 Cheat sheet PNG帮助手册(标签.事件.兼容) 1.HTML5标签 2.HTML5事件 3.HTML5兼容 最新HTML5手册资料请参考:http://www.inmotion ...
- Ajax风格的一款网页Loading效果
现在比较流行的一款Ajax风格的网页Loading,多见于一些大量使用Ajax技术的网站中,页面加载时会自动显示提示信息,带载入动画效果,网页加载完自动消失,是一款正在具有Loading功能的网页进度 ...
- HDOJ 1085 Holding Bin-Laden Captive! (母函数)
Holding Bin-Laden Captive! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- hdu 4725
The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- 40页PPT告诉你真正的"互联网+"
点这里 40页PPT告诉你真正的"互联网+" 2015-04-06 网站分析公会 超过50万名互联网从业人士关注 互联网运营领域最具影响力自媒体 本文根据和君赵大伟关于互联网思维大 ...
- Android线程消息通信(一)
Android在Java标准线程模型的基础上,提供了消息驱动机制,用于多线程之间的通信.基于消息驱动机制的线程通信模型陈伟线程消息通信.在标准线程模型中,线程执行完毕后便退出,而Android扩展了线 ...
- poj 3522(最小生成树应用)
题目链接:http://poj.org/problem?id=3522思路:题目要求最小生成树中最大边与最小边的最小差值,由于数据不是很大,我们可以枚举最小生成树的最小边,然后kruskal求最小生成 ...
- RHadoop计算平台搭建
原创文章,转载请注明: 转载自www.cnblogs.com/tovin/p/3824554.html 本文基于CentOS6.4系统介绍基于RHadoop平台的搭建,Hadoop的搭建可以参考ht ...
- lintcode:单词切分
单词切分 给出一个字符串s和一个词典,判断字符串s是否可以被空格切分成一个或多个出现在字典中的单词. 样例 s = "lintcode" dict = ["lint&qu ...