用纯CSS创建一个三角形的原理是什么?
实际上border它不是由矩形,它是由三角形组合而成的
.triangle {
width: 50px;
height: 50px;
border: 50px solid;
border-color: #f7c1c3 #f3c5b1 #bdbbde #8a8bd1;
}
<!-- 三角形 -->
<div class="triangle"></div>
可以看到它四边实际不是矩形
当我们将其height、width设置为0时
.triangle {
width: 0;
height: 0;
border: 50px solid;
border-color: #f7c1c3 #f3c5b1 #bdbbde #8a8bd1;
}
实现三角形,只需要将其中三个边的颜色设置为transparent
布局和包含块
可见官网文档
一个元素的尺寸和位置经常受其包含块(containing block)的影响。
大多数情况下,包含块就是这个元素最近的祖先块元素的内容区,但也不是总是这样。
许多开发者认为一个元素的包含块就是他的父元素的内容区。但事实并非如此。
当浏览器展示一个文档的时候,对于每一个元素都产生一个盒子。每个盒子都被划分为四个区域:内容区、内边距区、边框区、外边距区
包含块的影响:
元素的尺寸和位置,常常会受到它的包含块所影响。
对于一些属性,例如width、height、padding、margin、绝对定位元素的偏移值(比如 position 被设置为 absolute 或 fixed),当我们对其赋予百分比值时,这些值的计算值,就是通过元素的包含块计算得来。
确定包含块:
依赖于这个元素的position属性:
- 如果position为static、relative、sticky,它的包含块可能是它最近的祖先块元素(比如说inline-block, block 或 list-item元素)的内容区的边缘组成
- position:absolute,包含块就是它最近的position值为fixed、absolute、relative或stick(static不是)的祖先元素的内边距区的边缘组成
- 如果 position 属性是 fixed,在连续媒体的情况下(continuous media)包含块是 viewport ,在分页媒体(paged media)下的情况下包含块是分页区域(page area)。
- 如果 position 属性是 absolute 或 fixed,包含块也可能是由满足以下条件的最近父级元素的内边距区的边缘组成的:
transform 或 perspective 的值不是 none
will-change 的值是 transform 或 perspective
filter 的值不是 none 或 will-change 的值是 filter(只在 Firefox 下生效).
contain 的值是 paint (例如: contain: paint;)
根据包含块计算百分值:
如上所述,如果某些属性被赋予一个百分值的话,它的计算值是由这个元素的包含块计算而来的。这些属性包括盒模型属性和偏移属性:
- 要计算 height top 及 bottom 中的百分值,是通过包含块的 height 的值。如果包含块的 height 值会根据它的内容变化,而且包含块的 position 属性的值被赋予 relative 或 static ,那么,这些值的计算值为 auto。
- 要计算 width, left, right, padding, margin 这些属性由包含块的 width 属性的值来计算它的百分值。
例子:
接下来的示例,都使用如下 HTML 代码:
<body>
<section>
<p>This is a paragraph!</p>
</section>
</body>
下面的示例,只有 CSS 不同。
Example 1:
这个示例中,P 标签设置为静态(static)定位,所以它的包含块为
body {
background: beige;
}
section {
display: block;
width: 400px;
height: 160px;
background: lightgray;
}
p {
width: 50%; /* == 400px * .5 = 200px */
height: 25%; /* == 160px * .25 = 40px */
margin: 5%; /* == 400px * .05 = 20px */
padding: 5%; /* == 400px * .05 = 20px */
background: cyan;
}
Example 2:
在这个示例中,P 标签的包含块为 元素,因为
body {
background: beige;
}
section {
display: inline;
background: lightgray;
}
p {
width: 50%; /* == half the body's width */
height: 200px; /* Note: a percentage would be 0 */
background: cyan;
}
Example 3:
这个示例中,P 元素的包含块是
body {
background: beige;
}
section {
position: absolute;
left: 30px;
top: 30px;
width: 400px;
height: 160px;
padding: 30px 20px;
background: lightgray;
}
p {
position: absolute;
width: 50%; /* == (400px + 20px + 20px) * .5 = 220px */
height: 25%; /* == (160px + 30px + 30px) * .25 = 55px */
margin: 5%; /* == (400px + 20px + 20px) * .05 = 22px */
padding: 5%; /* == (400px + 20px + 20px) * .05 = 22px */
background: cyan;
}
Example 4:
这个示例中,P 元素的 position 为 fixed,所以它的包含块就是初始包含块(在屏幕上,也就是 viewport)。这样的话,P 元素的尺寸大小,将会随着浏览器窗框大小的变化,而变化。
body {
background: beige;
}
section {
width: 400px;
height: 480px;
margin: 30px;
padding: 15px;
background: lightgray;
}
p {
position: fixed;
width: 50%; /* == (50vw - (width of vertical scrollbar)) */
height: 50%; /* == (50vh - (height of horizontal scrollbar)) */
margin: 5%; /* == (5vw - (width of vertical scrollbar)) */
padding: 5%; /* == (5vw - (width of vertical scrollbar)) */
background: cyan;
}
Example 5:
这个示例中,P 元素的 position 为 absolute,所以它的包含块是
body {
background: beige;
}
section {
transform: rotate(0deg);
width: 400px;
height: 160px;
background: lightgray;
}
p {
position: absolute;
left: 80px;
top: 30px;
width: 50%; /* == 200px */
height: 25%; /* == 40px */
margin: 5%; /* == 20px */
padding: 5%; /* == 20px */
background: cyan;
}
flexbox弹性布局
详情可查看该博客
水平垂直居中
水平垂直分为内联元素和块级元素的居中。
最简单是的flex布局,但要注意浏览器兼容性问题
**内联元素:**使用text-align: center;和line-height解决;text-align的用法解释:设置块级元素内文本(准确的说是内联元素)的水平对齐方式。因此要设置在父级元素上
块级元素:
- 宽高固定(只能水平居中):使用margin:0 auto可解决
- 使用固定定位(水平垂直):left:50%; top;50%,将子元素定位到父元素1/2宽高的位置
宽高固定:margin-left:-1/2 margin-top:-1/2自身宽高 将子元素向左移动自身宽高度的一半
当宽高不固定:transform:translateX(-50%);transform:translateY(-50%) - flexbox布局:
接下来的实例都用该html代码:
<div class="parent">
<div class="children"></div>
</div>
/* 使用固定定位 */
.parent {
width: 200px;
height: 200px;
background-color: tomato;
position: relative;
}
.children {
width: 100px;
height: 100px;
left: 50%;
top: 50%;
//也可以设置margin-left和margin-top,但是要自己计算
transform: translateX(-50%) translateY(-50%);
background-color: pink;
position: absolute;
}
flex布局的垂直居中:
.parent {
width: 100px;
height: 100px;
background-color: tomato;
display: flex;
justify-content: center;
align-items: center;
}
.children {
width: 50px;
height: 50px;
background-color: pink;
}
盒子模型
有两种盒子,分为W3C标准盒子模型和怪异盒子(IE盒子模型)
标准模式下:
一个块的宽度=width+padding+border+margin
W3C模型中:
CSS中的宽(width)=内容(content)的宽
CSS中的高(height)=内容(content)的高
怪异盒:
一个块的宽度=width+margin
其中width包含content、padding、border
怪异盒中:
CSS中的宽(width)=内容(content)的宽+(border+padding)*2
CSS中的高(height)=内容(content)的高+(border+padding)*2
采用css3的box-sizing可以切换盒模型标准
box-sizing:content-box||border-box||inherit
box-sizing:content-box; 将采用标准模式的盒子模型标准(默认)
box-sizing:border-box; 将采用怪异模式的盒子模型标准
box-sizing:inherit; 规定应从父元素继承 box-sizing 属性的值。
样式与选择器
1.初始化css样式
因为浏览器的兼容性问题,不同浏览器对有些标签的默认值不同,如果没有对css初始化往往会造成浏览器页面显示差异。
2.css预处理器
用的最多的:Less、Scss、Stylus
CSS预处理器为CSS增加一些编程的特性,无需考虑浏览器的兼容性问题,例如你可以在CSS中使用变量、简单的逻辑程序、函数等等在编程语言中的一些基本特性,可以让你的CSS更加简洁、适应性更强、可读性更佳,更易于代码的维护等诸多好处。
3.css优先级算法计算
优先级关系:!important > style > id > class、属性、伪类 > 元素、伪元素
- !important声明的样式优先级最高,如果冲突再进行计算。
- 如果优先级相同,则选择最后出现的样式。
- 继承得到的样式的优先级最低。
权重计算:
4. css选择器
CSS选择符:id选择器(#myid)、类选择器(.myclassname)、标签选择器(div, h1, p)、相邻选择器(h1 + p)、子选择器(ul > li)、后代选择器(li a)、通配符选择器(*)、属性选择器(a[rel=“external”])、伪类选择器(a:hover, li:nth-child)
5.可以继承的css属性
- 可继承的属性:visibility、color、cursor、zoom、direction(特殊:< a >标签的字体颜色不能被继承)
- 字体全部都可以继承:font、font-style、font-variant、font-weight、font-size、font-family、font-stretch
- 文本除了vertical-align,其它都可继承:text-align、text-justify、text-indent、line-height、word-wrap等等
- 文本装饰:text-underline-position、text-shadow
- li相关:list-style、list-style-image、list-style-position、list-style-type
- 不可继承的样式:定位、布局、尺寸、内边距、外边距、背景、边框相关等等
6.伪元素和伪类
伪元素: (创建对象,添加一个元素对象,这个元素对象不会占用dom元素节点)用于创建一些不在文档树中的元素,并为其添加样式。实际上,伪元素就是选取某些元素前面或后面这种普通选择器无法完成的工作。控制的内容和元素是相同的,但它本身是基于元素的抽象,并不存在于文档结构中。比如说,我们可以通过:before来在一个元素前增加一些文本,并为这些文本添加样式。
伪类: (基于Dom,不创建任何元素,添加了一个类对元素进行修饰)用于当已有元素处于的某个状态时,为其添加对应的样式,这个状态是根据用户行为而动态变化的。比如说,当用户悬停在指定的元素时,我们可以通过:hover来描述这个元素的状态。虽然它和普通的css类相似,可以为已有的元素添加样式,但是它只有处于dom树无法描述的状态下才能为元素添加样式,所以将其称为伪类。
7.浏览器是怎么样解析css选择器的
浏览器在碰到HTML中指向CSS文件的链接时,会获取并解析CSS文件。CSS文件会被浏览器转为CSS对象模型。不仅是外部CSS,内部style元素或行内style属性中的CSS也会被解析并添加到这个对象模型中。这个对象模型是一个树形结构,包含页面中样式的层次结构。
每个CSS选择符都会匹配一个DOM节点,然后浏览器会基于层叠、继承和特殊性来计算每个DOM节点的最终样式。
CSS3
CSS3新增伪类有那些?
- p:first-of-type 选择属于其父元素的第一个出现的p
- p:last-of-type 选择属于其父元素最后一个出现的p
- p:only-of-type 选择属于其父元素唯一的p元素
- p:only-child 选择属于其父元素的唯一子元素(没有任何兄弟元素的p元素)
- p:nth-child(2) 选择属于其父元素的第二个子元素
- :enabled :disabled 表单控件的禁用状态。
- :checked 单选框或复选框被选中。
CSS3有哪些新特性
下面列出容易记的几个
- 媒体查询(@media (min-width:600px))
- 嵌入web字体(@font-face)
- 过渡(transition)与动画(animation)
- 【阴影】box-shadow
- 【边框】创建圆角(border-radius)、边框图片(border-image)
- 【背景】背景图片尺寸(background-size)、背景图片定位(background-origin)、背景裁剪(background-clip)、多重背景(background-image:url(1.jpg),url(2.jpg);)
- 【文字】允许长单词换行(word-wrap:break-word)、文字阴影(text-shadow)
- 【颜色】rgba和透明度opacity
- 【渐变】线性渐变(gradient)
- 【布局】flex、grid、多栏布局
- 【盒模型】box-sizing
BFC
详细内容可以查看该博客
对BFC规范(块级格式化上下文:block formatting context)的理解?
BFC指的是块级格式化上下文,简单的来说,BFC就是创建一个div盒子或者给已存在的盒子激活BFC,盒子内部的元素布局不影响盒子外部的元素。也就是所谓的相互隔绝,互不影响。
常见的创建BFC方式:
float:none以外的属性值。如:left 、 right
overflow:visible以外的属性值。如:hidden、auto 、 scroll
position属性值为:absolute、fixed(只有这两个可以)
dispaly属性值为:inline-block、 flex、 inline-flex、 table-cell、 table-caption 反正block不行就是了
BFC应用:
解决margin重叠
解决使用float时浮动元素和非浮动元素重叠(也是一种清除浮动的方法啦)
解决使用float时容器高度塌陷
网页中应该使用奇数还是偶数字体?
偶数:
- 相对来说偶数字号比较容易和页面中其他部分的字号构成一个比例关系。
- 低版本的浏览器ie6会把奇数字体强制转化为偶数,即15px渲染为16px。
常见的兼容性问题
- 不同浏览器的标签默认的margin和padding不一样。
*{margin:0;padding:0;} - 表单元素行高不一致
- 给表单元素添加 vertical-align:middle
- Chrome 中文界面下默认会将小于 12px 的文本强制按照 12px 显示
针对谷歌浏览器内核,加webkit前缀,用transform:scale()这个属性进行缩放。经测试,发现对内联元素无效 - 图片添加超链接,在IE10及以下版本中会有蓝色的边框:img{border}
display与visibility
display有哪些值?说明他们的作用?
none:隐藏对象。与visibility属性的hidden值不同,其不为被隐藏的对象保留其物理空间。
inline:指定对象为内联元素。
inline-block:指定对象为内联块元素。
block:指定对象为块级元素。
flex:指定对象为弹性盒。
区别:
一、display:none
- 不会为隐藏的元素保留空间
- 该元素以及其所有的后代都会继承该属性,并且给后代设置非none没用
- 在回流和重绘中,元素隐藏后脱离文档流,会引起回流(优化:建议用visibility:hidden替换display:none)
二、visibility:hidden;
4. 只是将对象隐藏起来,它在文档中的位置还是保留
5. 子元素会继承,但是子元素重新设置值,可以显示
6. 隐藏后还占用空间,只会引起重绘,不会导致回流
inline、block、inline-block区别
inline特点:
- 内联元素会在水平排列,直到一行排不下才会换行。
- 内联元素设置高、宽、margin、padding的上下无效(竖直无效)
- 内联元素设置line-height、margin左右、padding左右有效(水平有效)
- 内联元素的宽高被内容撑开
常见的元素: span、img、a、lable、input、abbr(缩写)、em(强调)、big、cite(引用)、i(斜体)、q(短引用)、textarea、select、small、sub、sup,strong、u(下划线)、button(默认display:inline-block))
block特点:
- 独占一行,默认情况下其宽度==父元素宽度
- 可以设置width、height,margin、padding但仍然独占一行
常见的block: div、p、h1…h6、ol、ul、dl、table、address、blockquote、form
inline-block 特点:
- 可以看成是结合了inline和block两者,可以设置width、height,margin、padding,也不会独占一行
- 显示间隙? 同行显示的inline-block元素中间会有间隙(换行符、空格间隙问题)
- 如何解决8?在下一个问题
常见的inline-block: img、input
为什么inline-block之间有空间间隙
浏览器的默认行为是把inline-block元素间的空白间隙(空格换行tab)渲染成一个空格
例如也就是
- 换行后会产生换行字符,而它会变成一个空格,当然空格就占用一个字符的宽度。
方法一:既然是因为 - 换行导致的,那就可以将
- 代码全部写在一排(但是可读性不高)。
方法二:既然是空格占一个字符的宽度,那我们索性就将-
内的字符尺寸直接设为0, ul{font-size:0px;}。
方法三:消除ul中的间隔 ul{letter-spacing: -5px;},恢复li中的间隔 ul li{letter-spacing: normal;}。
方法四:使用浮动。
-
内的字符尺寸直接设为0, ul{font-size:0px;}。
-
<style> .box { //加在父元素身上 letter-spacing: -5px; } img { width: 200px; height: 200px; letter-spacing: normal; } </style> </head> <body> <div class="box"> <img src="xxx" alt="" srcset="" /> <img src="xxx" alt="" srcset="" /> <img src="xxx" alt="" srcset="" /> </div> </body>
浮动
-
浮动盒子会脱离文文档流,不会再占用空间。
-
非浮动元素几乎当浮动盒子根本不存在一样该怎么布局怎么布局不会被影响
-
非浮动元素中的文本内容会记住浮动元素的大小,并在排布时避开它,为其留出响应的空间
如何清楚浮动:
清除浮动的两大方式:
div2浮动后div1高度塌陷了
解决方法:- 在浮动元素后创建一个块级元素,这个块级元素会clear:both清除浮动
<style type="text/css"> .div1 { width: 200px; border: 1px solid black; background-color: pink; } .div2 { width: 50px; height: 50px; background-color: rgb(243, 243, 85); float: left; } .clear { clear: both; } </style> </head> <body> <div class="div1"> <div class="div2">div2</div> <div class="clear"></div> </div> </body>
- 创建一个伪类元素(相当于方法1,只是使用伪类来创建块级元素并清除浮动)
/* 创建一个伪元素,作为已选中元素的最后一个子元素 */ .div1::after { content: ""; display: block; clear: both; }
- 开启BFC
overflow与text-overflow
overflow:
visible:对溢出内容不做处理,内容可能会超出容器。 hidden:隐藏溢出容器的内容且不出现滚动条。
scroll:隐藏溢出容器的内容,溢出的内容将以卷动滚动条的方式呈现。
auto:当内容没有溢出容器时不出现滚动条,当内容溢出容器时出现滚动条,按需出现滚动条。此为body对象和textarea的默认值。text-overflow:
clip: 当内联内容溢出块容器时,将溢出部分裁切掉。 ellipsis:
当内联内容溢出块容器时,将溢出部分替换为(…)。css优化
主要从文件大小和减少回流和重绘两方面
这篇博客写得挺仔细的 -