携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情
之前学习记录的,比较杂乱无章,将就看下吧。
工作后在看之前写的这些笔记,感觉真是一种成长。
居中问题(十分重要)
开局就是老生常谈的居中问题,水平居中,垂直居中方法的各自实现方法 , 每个居中都有几种实现方式,于是写了个小demo,属于是简单的不得了了,草履虫都能看得懂。
水平居中核心:
- 给父元素设置block,让它成为块级元素,在text-align: center(常用与文字水平居中)
- 看有无宽度,需要谁居中,给其设置 margin: 0 auto;(auto:自适应调整边距)
- 子元素使用绝对定位,在左移50%在transform移回去;(难搞的居中用这个)
- 父元素使用flex布局,在使用justify-content: center; (项目常用)
垂直居中核心:
- 单行:父子元素等高,给子元素设置line-height;多行:父级设置display: table-cell;vertical-align:middle
- 子绝父相,在top移动,transform移动回来
- flex定位,给父级添加display: flex; align-items: center
水平垂直居中核心:
- 父子有宽高,并设置子绝父相后,在给子元素四周设为0,magin:auto
- 父有宽高,子绝父相后,给上左设置50%,在transform负一半
- 给父级设置宽度100%,和高度,在flex定位
下面demo使用起来也比较简单,想看那个居中,就注释掉当前的样式,打开对应的样式。如想看水平居中第二种方法的实现,就关闭当前状态,打开有关2.2的注释即可。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
* {
padding: 0;
margin: 0;
}
#shuipin {
width: 100%;
height: 100px;
background-color: #00A4FF;
/* 1. */
display: block;
text-align: center;
/* 2.2 */
/* text-align: center; */
/* 4. */
/* display: flex;
justify-content: center; */
}
#zhong{
/* 2.1有宽度直接:margin: 0 auto; */
/* width: 80px;
margin: 0 auto; */
/* 2.2 */
/* display: inline; */
/* 3. */
/* position: absolute;
left: 50%;
transform: translateX(-50%); */
}
/* --------------------------------------------------------- */
#chuizhi {
width: 100%;
height: 100px;
background-color:#e74c3c ;
/* 1.2多行垂直 */
/* display: table-cell;
vertical-align:middle; */
/* 2. */
/* position: relative; */
/* 3. */
display: flex; align-items: center;
}
#chuizhi #zhong{
/* 1.单行垂直 */
/* line-height: 100px; */
/* 2. */
/* position: absolute;
top: 50%;
transform: translateY(-50%); */
}
/* ---------------------------------------------- */
#shuichui{
width: 100%;
height: 100px;
background-color:#2ecc71;
/* 1. */
position: relative;
/* 2. */
/* position: relative; */
/* 3. */
/* display: flex;
justify-content: center;
align-items: center; */
}
#shuichui #zhong{
/* 1. */
width: 68px;
height: 24px;
border: 1px solid #EDEEF0;
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
/* 2. */
/* position: absolute;
border: 1px solid #EDEEF0;
left: 50%;
top: 50%;
transform: translateX(-50%) translateY(-50%); */
}
</style>
</head>
<body>
<!-- 水平居中-->
<div id="shuipin">
<div id="zhong">
水平居中
</div>
</div>
<!-- 垂直居中 -->
<div id="chuizhi">
<div id="zhong">
垂直居中
</div>
</div>
<!-- 水垂居中-->
<div id="shuichui">
<div id="zhong">
水平垂直居中
</div>
</div>
</body>
</html>
多行文本显示省略号
这在简介种经常用到,就是超过设定的文本宽度,超过的文本部分就用...代替。
overflow:hidden;
display:-webkit-box; 将盒子转换为弹性盒子
-webkit-line-clamp:2; 设置显示多少行
text-overflow:ellipsis; 文本以省略号显示
CSS的选择器和优先级
啥是css的选择器? 简单来说就是div里面的元素,你怎么拿到这些元素,拿到这些元素的方法就是选择器。就像id,我可以通过div的id来操控这里面的样式,那么这id就是选择器。
常见的选择器有:id ,class ,标签,伪元素,伪类选择器等 他们的优先级顺序为:!important>内联样式> 内部样式 > 外部样式 > 浏览器用户自定义样式 > 浏览器默认样式,同一个元素会被后面相同选择器属性覆盖。
这里顺带提一下常见的块行元素
块级元素:div、h、from、table、p、ul,li
行内元素:span,img、a、input、select、button
在提一手 ~ + > 这些通配符选择器,算是进阶写法吧
- ~ :A~B表示选择A标签后的所有B标签,但是A和B标签必须有相同的父元素(要同级,所有B)
- + :A+B表示选择紧A后面的第一个B元素,且A和B必须拥有相同的父元素(要同级,一个B)
- > :A>B指选择A元素里面的所有B元素,但要B元素是A元素的第一代(父子级,所有B)
重绘和重排
对应的可以理解为:炒菜的中途加菜,在加些调料和全部倒掉重炒一份。
在前端的概念是浏览器需要重新构造渲染树,这个过程称之为重排,会刷新页面;受到影响的部分在屏幕上重新绘制叫重绘,不会刷新页面。
重排的可能有:添加或者删除比较多的DOM元素,窗口大小发生了改变,页面初始化。
减少重绘和重排的方法:不在布局信息改变时做DOM查询, 使用csstext,className一次性改变属性,使用fragment 。
隐藏元素
用display:none和visibilty:hidden,他俩都可以隐藏,但用法不一样:
- visibility:hidden,不会改变页面布局,不会触发该元素已经绑定的事件
- display: none, 会改变页面布局,相当于页面中把该元素删除掉(项目中常用这方法来对组件或按钮进行显隐操作)。
flex
很重要的一种布局,内容有点多,先看MDN的说法吧:flex, 主要记的属性有:全部
- flex-direction:决定主轴的方向
- row 主轴为水平方向,起点在左端
- row-reverse:设置主轴为水平方向,起点在右端
- column:设置主轴为垂直方向,起点在上沿
- column-reverse: 设置主轴为垂直方向,起点在下沿
- flex-wrap:换行的几种情况
- norap(默认值):不换行
- wrap:换行,第一行在上方
- wrap-reverse:换行,第一行在下方
- flex-flow:是flex-direction和flex-wrap的简写, 默认值为row nowrap。
- justify-content: 我理解为水平居中对齐
- flex-start(默认值):左对齐
- flex-end:右对齐
- center:居中
- space-betweet: 两端对齐,成员之间的间隔全都相等
- space-around: 每个成员两侧的间隔相等。
- align-items:我理解为垂直对齐
- flex-start:交叉轴的起点对齐
- flex-end:交叉轴的终点对齐
- center: 交叉轴的中点对齐
- baseline: 成员的第一行文字的基线对齐
- stretch(默认值):如果成员未设置高度或设为auto,将占满整个容器的高度
- align-content :交叉轴上对齐
- order: 设置
order:0,决定子元素的排列顺序,越小越排前,可以说负数 - flex:1 (0, 1, auto )
- 有三个属性:
- flex-grow:属性定义成员的放大比例,默认为0,如果存在剩余空间,不放大
- flex-shrink:属性定义了项目的缩小比例,默认为1,如果空间不足,该项目将缩小
- flex-basis:定义了在分配多余空间之前,项目占据的主轴空间,默认值为 auto, 即项目本身的大小(重要), 如果设置为 auto, 那么这盒子就会按照自己内容的多少来等比例的放大和缩小,如果随便设置一个带有长度单位的数字,那他就会等比例放大或缩小
- flex: 1; === flex: 1 1 auto
- 有三个属性:
所以,这也解释了为什么flex设置为1,就能平分空间且水平居中了,实际就改了flex-grow的值,其余两项均为默认。