1、防止高度坍塌
问题描述:父元素不写高度时,子元素写了浮动后,父元素会发生高度塌陷(造成父元素高度为 0)
问题解决
1.1 给父元素添加声明overflow:hidden
优点:代码少、简单
缺点: 不能和position定位配合使用,超出的尺寸会被隐藏
- 其实display:table也行
- 因为BFC
1.2 在浮动元素下方添加空div,并给元素声明 clear:both
保险起见,再加height:0。清除个别块元素可能自带的height:16px;
缺点:需要添加多余的空标签并添加属性
1.3 万能方式:
1.4 父元素添加浮动
缺点: 可能产生新的浮动问题
- 因为BFC
- 其实,父元素定义display:table也行
2、BFC
2.1 BFC定义
- BFC(Block formatting context)直译为"块级格式化上下文"。它是一个独立的渲染区域,只有块级元素参与, 它规定了内部的块级元素如何布局,并且与这个区域外部毫不相干。外部元素也不会影响这个渲染区域内的元素。
- 简单说:BFC就是页面上的一个隔离的独立渲染区域,区域里面的子元素不会影响到外面的元素。外面的元素也不会影响到区域里面的子元素。
- Box,盒子, 是 CSS 布局的对象和基本单位, 直观点说,就是一个页面是由很多个盒子区域组成。元素的类型和 display 属性,决定了这个盒子区域的类型。
- 不同类型的盒子区域内的子元素, 会以不同的 Formatting Context(一个决定如何渲染文档的容器)方式渲染。
- 块级元素盒子,display 属性为 block, list-item, table 的元素,会生成 块级元素渲染区域。并且以BFC( block fomatting context)方式渲染;
- 行级元素盒子,display 属性为 inline, inline-table 的元素,会生成 行级元素渲染区域。并且以IFC( inline formatting context)方式渲染;
- 所以,CSS中最常见的渲染方式有两大类:BFC和IFC
2.2 BFC的布局规则
- 默认,内部的块元素会在垂直方向,一个接一个地放置。每个块元素独占一行
- 块元素垂直方向的总距离由margin决定。属于同一个BFC的两个相邻块元素在垂直方向上的margin会发生重叠/合并。但水平方向的margin不会
- 左侧BFC渲染区域的margin,必须与右侧BFC渲染区域的margin相衔接,不能出现重叠
- BFC渲染区域不会与float浮动定义的元素区域重叠。
- BFC就是页面上的一个隔离的独立渲染区域,渲染区域里面的子元素不会影响到外面的元素。反之外面的元素也不会影响到渲染区域里边的子元素。
- 计算父元素BFC渲染区域的高度时,内部浮动元素的高度,都必须算在内。
2.3 如何创建BFC
- float的值不是none
- position的值不是static或者relative。
- display的值是inline-block、table-cell、flex、table-caption或者inline-flex
- overflow的值不是visible
2.4 可以解决哪些问题?
避免垂直方向margin合并
问题: 垂直方向上,两个元素上下margin相遇,两元素的间的距离并不等于两个margin的和。而是等于最大的margin。小的margin会被大的margin吞并。
解决:
- 用一个外围块元素包裹下方元素
- 设置新外层元素overflow:hidden
- 变成一个BFC方式的渲染区域
结果:下方元素的margin-top受到新外层元素BFC渲染区域的阻隔,不会影响外部上方的元素的margin-bottom了。同理,外部上方元素的margin-bottom,因为在BFC渲染区域之外,所以,也无法影响其内部元素的margin-top了。
避免垂直方向margin溢出
问题:子元素设置margin-top,会超出父元素上边的范围,变成父元素的margin-top。而实际上,子元素与父元素之间,依然是没有margin-top的——效果不是想要的。
解决:
设置新外层元素overflow:hidden
变成一个BFC方式的渲染区域
结果:子元素的margin-top受到外层父元素BFC渲染区域的阻隔,不会影响父元素以外的区域了。子元素的margin-top,才真正成为子元素与父元素上边的间距
其实还可以
- 为父元素添加上边框,颜色设置为透明
- 用父元素的padding-top代替第一个子元素的margin-top
- 在父元素内第一个子元素之前添加一个空的
- 用平级BFC渲染区域阻隔下方元素的margin-top
- 父元素::before{ content:“”; display:table; }
- 用平级BFC渲染区域阻隔下方元素的margin-top
- 自适应两栏布局
- 左固定,右自适应
- .left{ float:left; width:固定宽 }
- .right{overflow:hidden; …}
- 变成BFC渲染区域,就不会与float:left的左侧元素发生重叠了
- 防止高度坍塌
3、弹性布局
- 网页内容要可以随显示设备的大小而动态调整布局
- float属性,的确可以实现根据显示设备大小,自动换行显示。但是,浮动定位float提供的可控制的属性太少了,以至于难于随心所欲的控制布局。
- 比如:多个元素浮动在一行中时,无法保证屏幕变小时,一行中的每个元素都自动等比例缩小。而是每个元素依然保持固定的宽度。就会导致,原本处在一行的元素,被挤压换行。
- 弹性布局就很好的解决了多种设备下自适应和灵活定制布局的目的
- 弹性布局主要定义父元素中子元素的布局方式,让布局能适用多种情况提供最大灵活性
- 概念:
- 容器
- 父元素
- 项目
- 多个子元素
- 主轴
- 子元素排列方向上的轴
- 默认从左向右
- 交叉轴
- 与主轴方向垂直的轴
- 默认从上到下
- 父元素上设置的属性
- display:flex
- 父元素变成弹性布局渲染区域
- flex-direction
- 指定容器主轴的排列方向
- row
- 默认从左向右
- row-reverse
- 从右向左
- column
- 从上到下
- column-reverse
- 从下到上
- flex-wrap
- 当主轴排列不下所有元素时,是否自动换行
- 默认nowrap
- 父元素空间不够,也不换行!所有子元素项目自动等比缩小。
- wrap
- 当内容放不下时,自动换行,不缩小
- flex-flow
- flex-direction + flow-wrap的简写形式
- 语法: flex-flow: flex-direction flex-wrap
- justify-content
- 定义项目在主轴上的对齐方式
- 取值
- flex-start
- 以主轴起点对齐
- 默认左对齐,从左向右排列
- flex-end
- 以主轴终点对齐
- 默认右对齐,从右向左排列
- center
- 在主轴上居中对齐
- space-between,表示两端对齐
- 第一个元素紧贴最左边,最后元素紧贴最右边。中间多个元素在剩余空间中等间距排列
- space-around,表示每个项目两端间距相同
- 所有元素均分空白间距,包括第一个元素左边间距和最后一个元素右边间距,均是等距离分布
- align-items
- 定义所有子元素在交叉轴上的对齐方式
- 取值
- flex-start,表示让项目以交叉轴的起点方向对齐
- 默认置顶对齐
- flex-end,表示让项目以交叉轴的终点方向对齐
- 默认置底对齐
- center,表示让项目以交叉轴的中线居中对齐
- 垂直方向居中对齐
- baseline,表示让项目以交叉轴的基线对齐
- 以内容文字的基线对齐
- stretch,表示如果项目未设置尺寸,就让项目在交叉轴上占满所有空间
- 所有子元素项,垂直方向拉伸,默认沾满高度
- 每个子元素项目可单独设置的属性
- order
- 专门定义项目在主轴上的排列顺序
- 其值为整数数字,无需单位。
- 值越小,越靠近起点;值越大,越靠近结尾,默认值都是0。
- flex-grow
- 专门定义项目的放大比例
- 如果容器有足够的空间,项目可以放大
- 其值为整数数字,无需单位。
- 默认情况,项目不放大。
- 默认值都是0
- 取值越大,占据剩余的空间越多。
- 取值都一样,则占据空间始终一样大
- flex-shrink
- 专门定义项目的缩小比例
- 如果容器空间不足时,项目可以缩小。
- 缩小的比例取决于flex-shrink的值。
- 其默认值为1,表示空间不足时,则等比缩小。
- 可改为0,表示不缩小。
- align-self
- 专门单独定义某一个项目在交叉轴上的对齐方式
- 与align-items属性对比
- align-items定义在父容器上约束所有项目的统一对齐方式
- align-self定义在项目上,只约束当前所在的一个项目。
- 其取值和align-items完全一样。只是多了一个auto值,表示继承父元素的align-items效果。
4、水平居中和垂直居中的总结
- 水平居中
- 前提
- 父元素必须是块级盒子容器
- 不可自由嵌套的元素就是里面只能放内联元素的,它们包括有:标题标记的
、
、
、
、
、
、;段落标记的
;分隔线
- 和一个特别的元素 (它只存在于列表元素 的子一级)。
- 父元素宽度必须已经被设定好
- 场景1: 子元素是块级元素且宽度没有设定
- 不存在水平居中一说,因为子元素是块级元素没有设定宽度,那么它会充满整个父级元素的宽度,即在水平位置上宽度和父元素一致
- 场景2:子元素是行内元素,子元素宽度是由其内容撑开的
- 这种情况下解决方案是给父元素设定text-align:center;
- 场景3:子元素是块级元素且宽度已经设定
- 给子元素添加margin:0 auto;
- 通过计算指定父元素的padding-left或padding-right
- 给父元素和子元素都设定了box-sizing:border-box
- (父宽-子宽)/2
- 计算得到子元素的margin-left或margin-right
- 给父元素和子元素都设定了box-sizing:border-box
- (父宽-子宽)/2
- 通过子元素相对父元素绝对定位
- 父相子绝
- 子:left:50%; margin-left: -子宽一半
- 子: left:50%; transform:translateX(-50%)
- 弹性布局
- 父
- display:flex;
flex-direction: row;
justify-content:center;
- 垂直居中
- 前提:
- 父元素是盒子容器
- 场景1:子元素是行内元素,高度是由其内容撑开的
- 单行
- 设定父元素的line-height为其高度来使得子元素垂直居中
- 多行
- 通过给父元素设定display:inline/inline-block/table-cell;vertical-align:middle来解决
- 场景2:子元素是块级元素但是子元素高度没有设定
- 解法1:通过给父元素设定display:inline/inline-block/table-cell; vertical-align:middle来解决
- 解法2:flexbox
- 父元素
- display: flex;
flex-direction: column;
justify-content: center;
- 场景3:子元素是块级元素且高度已经设定
- 解法1:计算子元素的margin-top或margin-bottom
- 给父元素和子元素都设定了box-sizing:border-box
- (父高-子高)/2
- 解法2:计算父元素的padding-top或padding-bottom
- 给父元素和子元素都设定了box-sizing:border-box
- (父高-子高)/2
- 解法3:利用绝对定位,让子元素相对于父元素绝对定位
- 父相子绝
- 子元素宽已知
- 子:top:50%; margin-top: -子高一半
- 子元素宽未知
- 子: top:50%; transform:translateY(-50%)
- 解法4:利用flexbox
- 父元素
- display: flex;
flex-direction: column;
justify-content: center;
- 总结:垂直和水平方向同时居中
- 父相子绝
- 已知子元素宽高
- top:50%; left:50%; margin-left:-子宽一半; margin-top:-子高一半
- 未知子元素宽高
- top:50%; left:50%; transform:translate(-50%, -50%)
- 弹性布局
- .son{
display: flex;
justify-content: center;
align-items: center;
}
5、简述 rpx、px、em、rem、%、vh、vw的区别
- 设备物理像素
- pt
- 屏幕宽/分辨率,其中每一小份就是1pt
- css像素
- px
- pc机大屏幕显示器,1px约等于0.76个物理像素
- 手机小屏幕
- 以iPhone6为标准,物理像素750,分辨率375
- 1px=2pt
- 所以,px也是一个相对单位
- px是为了平衡一个元素在PC上显示的大小与在手机上显示的大小尽量一致而制定的。
- 但是,因为手机屏幕大小不一,差异较大,所以,反而不希望一个元素在所有手机上显示一样大。而是希望能够自动等比缩放。所以,移动端不要用px
- 通常PC端大屏浏览器的网页,使用px单位较多
- 移动端少用,因为px的长度相对固定,无法根据大小不一的移动端设备自适应改变大小
- rem
- 以网页根元素元素上设置的默认字体大小为1rem
- 默认1rem=16px
- 用的多
- 好处
- 可以实现响应式布局了!
- 响应式布局指的是元素大小能根据屏幕大小随时变化。
- 因为 所有以rem为单位的位置、大小都跟着根元素字体大小而变化。
- 所以只要在屏幕大小变化的时候改变根元素font-size就行了。
- em
- 父元素的字体大小为1em
- 用的不多
- rpx
- 小程序专用
- 以iPhone6为标准,物理像素750,分辨率375
- 无论屏幕大小,都将屏幕分成750份,每份就是1rpx。
- 1rpx=0.5px=1pt
- 优点
- 通过 rpx 设置元素和字体的大小,小程序在不同尺寸的屏幕下,可以实现自动适配
- vw/vh
- CSS3 特性 vh 和 vw:
- vh ,无论视口高度多少,都将视口高均分为100份,每1小份就是1vh,所以,也是相对单位,可随视口大小变化而自动变化。
- vw ,无论视口宽度多少,都将视口宽均分为100份,每1小份就是1vw,所以,也是相对单位,可随视口大小变化而自动变化。
- 所以vw和vh,本质就是%
- 这里是视口指的是浏览器内部的可视区域大小
- %
- 通常认为子元素的百分比完全相对于直接父元素,但是,不总是相对于父元素的对应属性值
- 子元素的 top 和 bottom 如果设置百分比,则相对于直接非 static 定位(默认定位)的父元素的高度
- 子元素的 left 和 right 如果设置百分比,则相对于直接非 static 定位(默认定位的)父元素的宽度
- 但是,绝对定位时,就不一定参照父元素的宽和高了。而是参照最近的定位元素的包含padding的宽和高
- 因为%不总是相对于父元素的宽高或屏幕大小,所以,有坑,开发少用。
6、响应式布局的方式,几种,媒体查询原理
- <meta name=”viewport”content=”width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0”>中每个属性的含义
- viewport
- 视口
- 显示设备内部,真正实际可用于显示网页的区域大小
- width
- 视口宽
- device-width
- 等于物理设备宽
- user-scalable
- 是否允许用户手工缩放网页
- initial-scale=1.0
- 加载页面时,页面的缩放比例是1,表示不缩放,原网页大小展示
- maximum-scale=1.0,minimum-scale=1.0
- 允许用户缩放网页的最大缩放比例和最小缩放比例
- 都是1,表示不允许用户使用过程中,中途缩放网页
- 5种响应式布局方式
- flex布局
- 优点: 代码简单,布局方便
- 缺点
- 如果中间有内容,缩到最小就不会在小了
- 且左右侧的宽度变小了
- 父相子绝
- 优点
- 结合使用media可以实现响应式布局
- 缺点
- 代码写法复杂,布局较繁琐
- 如果不使用media平分屏幕,宽度小于600的情况下,右侧会覆盖左侧
- grid布局
- Flex布局是轴线布局,只能指定"项目"针对轴线的位置,可以看作是一维布局,
- Grid 布局则是将容器划分成“行"和“列”,产生单元格,然后指定"项目所在”的单元格,可以看作是二维布局
- Grid布局远比 Flex布局强大。(不过存在兼容性问题)
- 知识点比较多, 学习成本相对较高, 目前兼容性不如flex布局!
- 如何
- 容器属性
- grid-template-columns
grid-template-rows
- 规定共有几行,几列,每行,每列宽多少?
- grid-template-columns:100px 100px 100px; // 显示为三列每一列宽度100px
- grid-template-columns:repeat(3,100px); //同上
- 也可以固定格大小,然后优先占满整个宽度
- grid-template-columns: repeat(auto-fill,100px);
- .auto-fill,有时,单元格的大小是固定的,但是容器的大小不确定,这个属性就会自动填充
- 也可以按份数规定列宽
- fr,比例关系,fraction ,意为"片段”,表示某一行或列在总宽度和总高度中占的份数
- grid-template-columns:repeat(4,1fr); // 宽度平均分成四等份
- grid-template-columns:1fr 2fr 3fr; // 列宽这样是分成6份各占 1 2 3 份 效果如下图
- 还可以设置最小和最大的大小范围:
- grid-template-columns: 1fr minmax(150px,1fr); // 第一个参数最小值,第二个最大值,表示第二列最小150px,最大1fr。
- 还可以请浏览器自己决定长度
- auto,表示由浏览器自己决定长度
- grid-template-columns: 100px auto 100px;
- 还可以定义网格线
- 网格线.可以用方括号定义网格线名称,方便以后给盒子定位使用
- grid-template-columns: [c1] 100px [c2] 100px [c3] 100px [c4];
- column-gap和row-gap
- 定义格与格之间的间距
- 如果column-gap和row-gap间距一致,可简写为: gap:xxx
- grid-auto-flow
- 划分网格以后,容器的子元素会按照顺序,自动放置在每一个网格。默认的放置顺序是"先行后列".即先填满第一行,再开始放入第二行(就是子元素的排放顺序)
- grid-auto-flow: row
- 先行后列
- grid-auto-flow: column
- 先列后行
- justify-items(水平方向)/ align-items(垂直方向)
- 设置单元格内容的水平和垂直的对齐方式
- 值为:
- start | end | center | stretch
- 同时设置两个属性: 简写
- place-items : start end; 这是两个属性的简写
- justify-content (水平方向)/ align-content(垂直方向)
- 设置整个内容区域(所有的项目的总和)的水平和垂直的对齐方式
- 取值: start | end | center | stretch | space-around | space-between | space-evenly;
- 项目属性
- grid-column-start / grid-column-end grid-row-start / grid-row-end
- 一句话解释,用来指定item的具体位置,根据在哪根网格线
- grid-column-start:1;
grid-column-end:3;
- 表示从第一个网格线,跨到第三个网格线之前,也就是横跨1、2两列
- grid-column: span 2;
grid-column-end:3; - 简写: grid-column: 1 / 3;
- grid-column-start:1;
grid-column-end:3;
grid-row-start:1;
grid-row-end:3;
- 跨两行,跨两列的方形区域
- 简写: grid-area: 1 / 1 / 3 / 3
- justify-self / align-self
- 当前单元格内容的水平和垂直对齐方向
- place-self
- 同时设置一个单元格内容的水平和垂直方向对齐方式
- float布局
- 容易被挤压换行
- 使用rem作单位,等比缩放
- 首先,给根元素html设置一个字体大小
然后,其他尺寸单位全部用 rem
然后,监听屏幕的大小
然后,根据屏幕的大小按比例改变根节点字体的大小 - 因为 rem 的特性,其他的尺寸都是根据根节点字体的大小设定的,所以,根节点字体大小一变,其他所有尺寸都会按比例变大、或小。
- 大部分浏览器的字体有个最小值:12px。也就是缩小到 12px 后,字体不会继续缩小。
- 媒体查询
- 通过媒体查询来设置样式(Media Queries)是响应式设计的核心。
- 它根据条件告诉浏览器如何为指定视图宽度渲染页面
- 媒体类型
- print(打印机)
screen(所有屏幕设备的统称:各种电脑屏幕、各种手机屏幕、各种平板屏幕,主要使用的就是这个)
all(所有媒体设备,默认值)
speech(应用于屏幕阅读器等发声设备)
- style
- 在 style 标签中通过 media属性 可以设置样式使用的媒体设备。
- 多设备支持(,分隔)
- 可以用 逗号分隔 同时支持多个媒体设备。
- @import url(screen.css) screen,print;
- @media screen,print {…}
- 设备方向(orientation 属性)
- 使用 orientation 属性可以定义设备的方向
- orientation: landscape
- 横屏,宽度>高度
- orientation: portrait
- 竖屏,高度>宽度
- 查询条件
- 可以使用不同条件限制使用的样式,条件表达式需要放在扩号中
- 比如
- 横屏显示
宽度不能超过600px
- @media screen and (orientation: landscape) and (max-width: 600px) {
body {
background: #8e44ad;
}
h1 {
font-size: 3em;
color: white;
}
}
- 横屏显示或宽度不超过600px
- @media screen and (orientation: landscape),
screen and (max-width: 600px) {
body {
background: #8e44ad;
}
h1 {
font-size: 3em;
color: white;
}
}
- 既不是横屏,宽度又不小于600时,才使用
- @media not screen and (orientation: landscape) and (max-width:600px) {
body {
background: #8e44ad;
}
h1 {
font-size: 3em;
color: white;
}
} - not必须写在开头,表示后续条件都不满足,才能应用
- 引入顺序
- @import url(big.css) only screen and (min-width:1200px);
@import url(medium.css) only screen and (min-width:900px);
- 永远后一个
- 因为后一个范围包含前一个范围,而且后一个样式会覆盖前一个的样式
- 设备的划分情况:
- 小于768的为超小屏幕(手机)
768~992之间的为小屏设备(平板)
992~1200的中等屏幕(桌面显示器)
大于1200的宽屏设备(大桌面显示器)
- 父容器版心的尺寸划分
- 超小屏幕(手机,小于 768px):设置宽度为 100%
- 小屏幕(平板,大于等于 768px):设置宽度为 750px
- 中等屏幕(桌面显示器,大于等于 992px):宽度设置为 970px
- 大屏幕(大桌面显示器,大于等于 1200px):宽度设置为 1170px
- 响应式字体
- rem是相对于根元素的,不要忘记重置根元素字体大小:
html{font-size:100%;}
完成后,你可以定义响应式字体:
@media (min-width:640px){body{font-size:1rem;}}
@media (min-width:960px){body{font-size:1.2rem;}}
@media (min-width:1200px){body{font-size:1.5rem;}} - 一个响应式的字体应关联它的父容器的宽度,这样才能适应客户端屏幕。
7、sass的常用功能
- 变量
- $font-stack: Helvetica, sans-serif;
$primary-color: #333;
body {
font: 100% $font-stack;
color: $primary-color;
}
- 嵌套
- nav {
ul {
margin: 0;
padding: 0;
list-style: none;
}
li { display: inline-block; }
a {
display: block;
padding: 6px 12px;
text-decoration: none;
}
}
- 引用父级选择器"&"
- a {
font-weight: bold;
text-decoration: none;
&:hover { text-decoration: underline; }
body.firefox & { font-weight: normal; }
} - 无论CSS规则嵌套的深度怎样,关键字"&"都会使用父级选择器级联替换全部其出现的位置:
- /===== SCSS =====/
#main {
color: black;
a {
font-weight: bold;
&:hover { color: red; }
}
}
/===== CSS =====/
#main {
color: black; }
#main a {
font-weight: bold; }
#main a:hover {
color: red;
}
#main {
color: black;
&-sidebar { border: 1px solid; }
}
/===== CSS =====/
#main {
color: black; }
#main-sidebar {
border: 1px solid;
}
.demo {
// 命令空间后带有冒号:
font: {
family: fantasy;
size: 30em;
weight: bold;
}
}
/===== CSS =====/
.demo {
font-family: fantasy;
font-size: 30em;
font-weight: bold; }
- 引入
- // _reset.scss
html, body, ul, ol {
margin: 0;
padding: 0;
}
// base.scss
@import ‘reset’;
body {
font: 100% Helvetica, sans-serif;
background-color: #efefef;
}
- 混合
- 混合(Mixin)用来分组那些需要在页面中复用的CSS声明,开发人员可以通过向Mixin传递变量参数来让代码更加灵活,
- 该特性在添加浏览器兼容性前缀的时候非常有用,
- SASS目前使用@mixin name指令来进行混合操作。
- @mixin border-radius($radius) {
border-radius: $radius;
-ms-border-radius: $radius;
-moz-border-radius: $radius;
-webkit-border-radius: $radius;
}
.box {
@include border-radius(10px);
}
- 继承
- // 这段代码不会被输出到最终生成的CSS文件,因为它没有被任何代码所继承。
%other-styles {
display: flex;
flex-wrap: wrap;
}
// 下面代码会正常输出到生成的CSS文件,因为它被其接下来的代码所继承。
%message-common {
border: 1px solid #ccc;
padding: 10px;
color: #333;
}
.message {
@extend %message-common;
}
.success {
@extend %message-common;
border-color: green;
}
.error {
@extend %message-common;
border-color: red;
}
.warning {
@extend %message-common;
border-color: yellow;
}
- 算术运算符
- .container { width: 100%; }
article[role=“main”] {
float: left;
width: 600px / 960px * 100%;
}
aside[role=“complementary”] {
float: right;
width: 300px / 960px * 100%;
}
8、利用css构建三角形(正三角,倒三角,左/右三角)
- 上三角
- #triangle-up {
width: 0;
height: 0;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 100px solid red;
}
- 下三角
- #triangle-down {
width: 0;
height: 0;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-top: 100px solid red;
}
- 左三角
- #triangle-left {
width: 0;
height: 0;
border-top: 50px solid transparent;
border-right: 100px solid red;
border-bottom: 50px solid transparent;
}
- 右三角
- #triangle-right {
width: 0;
height: 0;
border-top: 50px solid transparent;
border-left: 100px solid red;
border-bottom: 50px solid transparent;
}
- 左上三角
- #triangle-topleft {
width: 0;
height: 0;
border-top: 100px solid red;
border-right: 100px solid transparent;
}
- 右上三角
- #triangle-topright {
width: 0;
height: 0;
border-top: 100px solid red;
border-left: 100px solid transparent;
}
- 左下三角
- #triangle-bottomleft {
width: 0;
height: 0;
border-bottom: 100px solid red;
border-right: 100px solid transparent;
}
- 右下三角
- #triangle-bottomright {
width: 0;
height: 0;
border-bottom: 100px solid red;
border-left: 100px solid transparent;
}
9、缩放
- 如何实现<12px的字
- display:inline-block; /scale只能缩放行内块或块元素/
-webkit-transform: scale(0.5); /定义2D缩放/
-webkit-transform-origin:left top; /定义缩放源点为左上角/
- 0.5px的线如何实现
- 问题:
- .hr.half-px {
height: 0.5px;
}
- 不同设备,不同浏览器差异较大
- 解决:
- .hr.scale-half {
height: 1px;
transform: scaleY(0.5);
transform-origin: 50% 100%; /为了防止线模糊/
}
- 更好的解决: svg
- .hr.svg {
background: none;
height: 1px;
background: url(“data:image/svg+xml;utf-8, ”);
} - 其中: svg图片是
- 使用svg的line元素画线,stroke表示描边颜色,默认描边宽度stroke-width=“1”,由于svg的描边等属性的1px是物理像素的1px,相当于高清屏的0.5px,另外还可以使用svg的rect等元素进行绘制。
background: url(“data:image/svg+xml;utf-8,
”);
background: url(“data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxMDAlJyBoZWlnaHQ9JzFweCc+PGxpbmUgeDE9JzAnIHkxPScwJyB4Mj0nMTAwJScgeTI9JzAnIHN0cm9rZT0nIzAwMCc+PC9saW5lPjwvc3ZnPg==”);
}