主要为读书笔记,也有一些技巧。喜欢点个赞哟,谢谢。css
分离css和html的关注点:html负责标签,css负责样式html
关注html语义化,便于阅读,便于爬虫(seo)前端
// 清除浮动函数
.cf:before, .cf:after { content: " "; display: table; }
.cf:after { clear: both; }
.cf { *zoom: 1; }
复制代码
渐进加强:浏览器遇到没法识别的属性时候会自动丢掉css3
<input type="email" />
,若是浏览器不支持email类型,则自动回退到默认值textbackground: #000; background: rgba(0,0,0,1)
,若是浏览器不支持rgba,则会自动丢弃rgba样式私有属性:先私有后标准git
webkit-box-shadow: 0px 5px 15px #EFEFEF;
box-shadow: 0px 5px 15px #EFEFEF;
复制代码
@supports(display: grid){
若是支持grid,则下述css讲做用。
}
复制代码
link引用CSS,会并行下载;@import引入,会依次下载github
div{}
#app{}
.banner{}
*{}
p > span{}
,li + li{}
p span{}
html,body{}
input[type="radio"]{}
div::after{clear: both}
a:hover{}
补充说明下,选择器的妙用:web
nth-child(-n + 3)
只选中前3个元素,更多案例required、focus、valid、invalid、checked、target、placeholder、read-only
<p style="color: red;"></p> >>> style/link
p{color: red;} <<< p{color: yellow;}
.app .banner{color: red} <<< .banner{color: yellow !important;}
// 有继承性的属性
一、font字体,color、font-size等。
二、文本系列属性:text-indent、text-align、line-height、word-spacing、letter-spacing、text-transform、direction、color等。
三、表格属性:caption-side、border-spacing、border-collapse。
四、列表属性:list-style等。
五、全部元素可继承:visibility、cursor等。
// 无继承性的属性
一、display、width、padding、margin、float、position、max-height、overflow、z-index等等。
二、文本属性:vertical-align、text-decoration、text-shadow、white-space等。
三、背景属性:background等
四、轮廓样式:outline等。
五、清除浮动:clear等。
六、内容:content等。
复制代码
文档流、盒模型,控制着元素的排布。算法
以下面demo,定义了padding: 20px; width:33.3%
,默认状况下会发生换行,若是设置box-sizing:border-box;
,则width = border + padding + 内容的宽度
浏览器
元素在排布时,margin会发生叠加现象,具体说来:兄弟外边距叠加,父子外边距叠加。sass
外边距叠加有利于文本排版,可是有时候咱们不想要这个效果,怎么办呢?
不发生外边距叠加的条件:浮动元素不与其余元素叠加,bfc不与子元素叠加,inline-block不与任何元素叠加
浮动元素会脱离文档流,为兼容ie9及如下浏览器,业务中常常须要使用浮动布局方案。
浮动效果,块元素和行内元素效果以下:
清除浮动是很是常见的需求,最佳清除浮动代码:
.cf:before, .cf:after { content: " "; display: table; }
.cf:after { clear: both; }
.cf { *zoom: 1; }
复制代码
若某元素position:absolute; left: 50px;
,他的定位基准是谁?若某元素width:100%
,它的计算基准元素是谁?
这里引出了一个重要概念---包含块。包含块也会影响元素的布局,它决定了如何解释各类属性(如何计算值,及定位依据)?
transform: translate(10px, 0)
参照元素自身Border-boxposition: relative
定位元素,其left/top参照自身,其他以父元素Content-box为基准position: absolute
定位元素,以父元素Padding-box为基准左侧图片的高度未知,你有办法让右侧p标签与img同高吗?(禁用flex、grid、table)查看demo
<div class="box">
<img class="left" src="xxx.jpg"/>
<p class="right">hello world!</p>
</div>
复制代码
层叠上下文是三维概念,设想元素在垂直屏幕的Z轴上。
如何建立层叠上下文?
根元素(html)、z-index不为auto的绝对/相对定位、z-index不为auto的flex子元素、opacity小于1的元素、transform不为nonde的元素、filter不为nonde的元素、will-change元素
等等
在层叠上下文中,其元素依据z-index的值进行排布,排布的规则以下:
层叠上下文能够包含在其余层叠上下文中,以下面的demo,C元素在B的层叠上下文中排布,B元素同A、D元素依据层叠顺序进行排布。
更详细的层叠上下文和层叠顺序推荐阅读:深刻理解CSS中的层叠上下文和层叠顺序
格式上下文也是很是重要的概念,影响着元素布局的效果。
根元素(html)、浮动元素、absolute/fixed
定位元素、inline-block
元素、overflow不为visible
元素、flex的直接子元素、grid的直接子元素、table-cell/table-caption/table-row/..
等
BFC有以下特性:
BFC规则的应用很是多,下面是基于BFC规则实现的浮动两栏布局:
仅包含内联级别元素时会建立一个IFC(lineBox),IFC的高度基于line-height和vertical-align进行计算(不受pading/margin影响),其宽度由浮动状况和它的包含块决定,当宽度很大时会发生跨行(拆散为多个ifc)
基于IFC规则实现的幽灵元素居中:
.user::before
的定义是ifc的高度等于300px,经过设定vertical-align:middle
使得居中对齐。另外,请关注span {width: 190px;}
,若是未设定宽度是什么效果?为何会这样?
<div class="user">
<span>hello world! hello world! hello world! hello world! hello world! hello world! hello world! hello world! hello world! hello world! hello world!</span>
</div>
.user{
position: relative;
height: 300px;
width: 300px;
border: 1px solid #000;
text-align: center;
}
.user::before {
content: " ";
display: inline-block;
height: 100%;
width: 0;
vertical-align: middle;
}
span{
display: inline-block;
vertical-align: middle;
width: 190px;
}
复制代码
若是未给span设定宽度,span元素将没法居中!猜想缘由以下:1.文本建立了一个ifc,若span未设置宽度,则其宽度由文本内容的宽度决定;2.未设定190px属性,则宽度占满父元素的300px,发生换行显示。
IFC的对齐方式有时候可能比较难以理解,推荐文章:christopheraue.net/design/vert…
设置display:gird
的元素将会生成网格容器,让布局从一维变成二维。
设置display:flex
的元素将会生成自适应容器,容器的每个子元素都是一个伸缩项目。在FFC中,对子元素设置vertical-align、float
是无效的,容器元素同时设置column
也是无效的。
经常使用的文本排版属性:
color、font-family、font-size、line-height、vertical-align、font-weight、font-style、text-transform、word-spacing、letter-spacing
文本排版的技巧:
max-width: 36em; margin: 0 auto;
p+p{text-indent: 1.25em}
text-align,left/right/center/justify/start/end
hyphens:auto
columns
指定列数单词不换行超出demo,设定了宽度怎么文字还超出了?
自定义字体在图标上应用至关普遍,经常使用的图标字体网站iconfont。
自定义字体的最佳兼容方案:
@font-face {
font-family: 'MyWebFont';
src: url('webfont.eot'); /* IE9 Compat Modes */
src: url('webfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('webfont.woff') format('woff'), /* Modern Browsers */
url('webfont.ttf') format('truetype'), /* Safari, Android, iOS */
url('webfont.svg#svgFontName') format('svg'); /* Legacy iOS */
}
复制代码
若是某天UI要求文本使用非默认字体,你可能须要有必定的心理准备。字体文件通常都至关的大,下载很是耗时,常见的解决方案:
使用text-shadow
能够设置很是漂亮的阴影效果,经过逗号能够同时设置多道阴影,以下面demo:
更加牛逼的艺术字体,直接看别人的教程吧:practice.typekit.com/lesson/usin…
针对CSS没法实现的效果,可使用JS实现:
#000、rgb(0,0,0)、rgba(0,0,0,0.5)、hsl()
repeat、no-repeat、space、round
,新增background-repeat-x
url(...)、linear-gradient(45deg, #cfdfee, #4164aa)
,支持路径图片,支持base64图片、支持渐变local、scroll、fixed
,背景图片在视口内固定或者随着区块滚动
contain、cover
,背景图片尺寸background使用技巧:
background-image和img有什么区别?如何选取?
background支持多图背景
渐变纹理图片,lea.verou.me/css3pattern…
border技巧:
水平布局和垂直布局是最多见的需求,实现方案很是多,咱们一块儿探讨下
举一个常见例子,如今须要实现用户样式,左侧是用户图片,右侧是用户姓名,要求垂直居中显示,现给定以下代码:
<div class="user">
<img class="user-avatar" src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1567271267460&di=8e74e290191f83e701da4561dc99d2f7&imgtype=0&src=http%3A%2F%2Fimg.zcool.cn%2Fcommunity%2F01acc45607d5826ac7251df87e05b8.jpg%401280w_1l_2o_100sh.png" width="50"/>
<p class="user-name">xiaoming</p>
</div>
复制代码
.user{
clear: both
}
.user-avatar{
float: left
}
.user-name{
float: left;
margin-top: 12px;
}
复制代码
.user{
}
.user-avatar{
display: inline-block;
vertical-align: middle;
}
.user-name{
display: inline-block;
}
复制代码
.user{
display: table;
}
.user-avatar{
display: table-cell;
}
.user-name{
display: table-cell;
vertical-align: middle;
}
复制代码
.user{
display: flex;
align-items: center;
}
复制代码
.user{
display: grid;
grid-template-columns: 50px 50px;
}
复制代码
在上述方案中,inline-block布局须要注意元素之间的间隙,能够在父元素设置font-size:0
进行消除。table布局很容易实现元素居中效果,以下面demo:
待补充案例
能够控制:元素尺寸(基于自身和有效剩余空间);布局方向;对其方式,顺序
兼容至ie10,可是须要考虑私有属性(打包工具autoprefix自动补充前缀)
主轴和交叉轴。margin-auto的妙用
flex-basis/base-grow/base-shrink,basis定义空间从而计算剩余空间量,grow定义对于剩余空间的分配比例(剩余空间按比例分配)。而shrink定义缩小规则(计算缩小尺寸公式:((500 × 1) / ((800 × 1) + (500 × 1))) * 300 = 115.4 )。
缩写形式:flex: 1 0 0%;, grow-shrink-basis
flex一样支持多行布局
flex有bug?github.com/philipwalto…
待补充
经常使用于响应式设计,如知名库Bootstrap
先构思,避免陷入麻烦。模块化和组件化开发,布局页面?
总体布局思路:栅格布局?grid布局?
固定布局、流体布局、弹性布局:
建立栅格的2种方式:col-1of4: 25%; 或者 row-quartet > * {25%}
页面总体布局和组件分离(布局和内容分离)
水槽宽度计算,能够设定百分比或者一个固定值。margin百分比相对于父元素宽度计算,em相对父元素字体计算
row容器使用margin:0 -1%,负边距 消除 容器子元素左右2个变速的边距。
使用padding计算排水沟,效果更简单。
225,使用inline-block和flex加强布局?
传统方法基本都是从左到右进行布局,如何进行2d维度布局,grid
业务中使用表单很是多,咱们可能常常须要自定义表单控件,如radio/checkbox等等
经常使用表单表单样式清除代码:appearance: none; outline:none;border:none;
浏览器还没有提供自定义修改checkbox的属性,下面是配合label实现的demo:
input[type="checkbox"]{
position: absolute;
overflow: hidden;
width: 1px;
height: 1px;
clip: rect(0 0 0 0);
}
input[type="checkbox"] + label{}
input[type="checkbox"]:checked + label{}
input[type="checkbox"]:focus + label{}
input[type="checkbox"]:focus:checked + label{}
复制代码
自定义radio实现原理同上,故在此不单独说明。
优秀的自定义checkbox案例:tympanus.net/Development…
select样式很难修改,传统方案是使用div+span模拟实现,可是移动设备必须使用原生select标签!
若是想要自定义select,能够看看下面的两种实现:
transform支持2d和3d变化。transform会建立新的layer,配合css动画,性能卓越(but会消耗compose性能)
transition定义过分动画,即属性变化动画
在设置高度动画时,height必须设置Number。若是高度是动态的,则推荐使用max-height
属性设置动画,下面为动态高度动画:
animation定义帧动画,经过关键帧能够实现很是复杂的动画
理解还不够深入,此处就不粘贴了。可是很是值得一看!
transfrom: translateZ(0);
会建立新的Layer,避免重绘重排重绘是性能的基础,能够在这个网站查询哪些属性会影响重排重绘,网站:csstriggers.com/
推荐阅读这篇文章,做者讲述的更加全面深入:H5动画60fps之路
响应式设计并不只局限于改变布局,经过媒体查询能够至关精确地对页面进行重构,如:小屏幕扩大选择区,元素的显示隐藏,改变字体大小和行距等,从而提升阅读体验
@media all (max-width: 320x)
)早期苹果为了手机可以显示pc页面,引入视口概念。视口影响着页面的显示效果,可使用viewport对视口进行控制,width=device-width设定布局视口等于理想视口。
若是设定以下:<meta name="viewport" content="width=device-width, initial-scale=1.0">
,则可视视图为320
若是设定以下:<meta name="viewport" content="initial-scale=2.0">
,则可视视图为160,出现横向滚动条,字体被放大2倍
@media all and (min-width:800px) and (orientation:landscape) {}
@media not (all and ())
// 逻辑操做符:and or not only(only主要兼容旧浏览器!最好带上!!!)
// width/height 视口宽高
// device-width 屏幕宽高
// orientation 横向竖向
// aspect-ratio 视口宽高比
// device-aspect-ratio 平补的宽高比
// color 每种颜色?
// resolution 打印机分辨率
// 视口:布局视口(页面原有大小)/可视视口(手机上的可视视口,即屏幕宽度)/理想视口(使用可视视口布局?),在手机端能够缩放网页/滑动位置;
// <meta name="viewport" content="device-width" />开启手机理想视口。手机的布局视口依赖网页设定?仍是手机本身设定?
复制代码
根据设备大小加载不一样尺寸的图片,经常使用的实现方式:
根据设备大小,设置字体的尺寸,经常使用的实现方式
em相对父元素,rem相对根元素(html),vw相对视口单位,若不考虑兼容性则推荐使用font-size:5vw
。
max-width
,避免超出PostCSS 这个术语能够指代两件事:一是 PostCSS 核心工具,二是基于 PostCSS 建立的插件系统。PostCSS 核心工具并不能直接用于处理样式,只有配合它的插件,才能完成相关的编译工做。
<link href="assets/css/global.css" rel="stylesheet" type="text/css"/>
<link href="assets/css/index.css" rel="stylesheet" type="text/css"/>
<link href="assets/css/skin.css" rel="stylesheet" type="text/css"/>
复制代码
1. Eric Meyer’s “Reset CSS” 2.0
2. Normalize.css
复制代码
补充说明:
根据属性的重要性按顺序书写,先写定位布局属性,后写盒模型等自身属性,最后是文本类及修饰类属性
若是属性间存在关联性,则不要隔开写,如:
height: 18px;
line-height: 18px;
复制代码
BEM的命名规则: 块名__元素--修饰符
BEM的抽象理解:
BEM的优点:
.sidebar conent-title__reversed
)h2{color: white !important;}
,则上面的demo最终显示什么?)BEM定义类名的原则:
rol、col
关注布局,media-block
关注组件样式:BEM是一个优秀的模块化方案,可是可能存在一些问题:
list-marginTop30 form-marginTop30
所以没必要拘泥于BEM方案,技术最终服务于产品。
若是你正在开发企业后台,对于样式没要求很是精准,推荐使用函数式css方案,它可以有效的减小css代码重复量!
函数式CSS开源库有不少,笔者在业务中基于tachyons进行了修改,打造本身的函数式css库,如定义width的几种方式:
/*
针对宽度,定制经常使用的css类名
.w-120 width: 120px
.w20 width: 20%
.w--auto width: auto
*/
.w-80{width: 80px;}
.w20{ width: 20%; }
.w--auto{ width: auto; }
.w--third { width: 33.333333%; }
复制代码
table-layout属性定义了用于布局表格单元格、行和列的算法。
table{
table-layout: fixed;
}
复制代码
tableLayot-fixed:超出显示省略号DEMO
蝉原则,使用质数做为循环周期来增长“天然随机性”的策略(模拟天然的随机效果)。如质数五、7的最小公倍数为35。
// 随机背景条纹
.stripes {
background-color: #026873;
background-image: linear-gradient(90deg, rgba(255,255,255,.07) 50%, transparent 50%),
linear-gradient(90deg, rgba(255,255,255,.13) 50%, transparent 50%),
linear-gradient(90deg, transparent 50%, rgba(255,255,255,.17) 50%),
linear-gradient(90deg, transparent 50%, rgba(255,255,255,.19) 50%);
background-size: 13px, 29px, 37px, 53px;
}
// 随机圆角效果,最小公倍数-质数相乘2310
.list:nth-child(2n + 1) {}
.list:nth-child(3n + 2) {}
.list:nth-child(5n + 3) {}
.list:nth-child(7n + 4) {}
.list:nth-child(11n + 5) {}
// 随机动画效果
animation: 1s spin, .7s radius, 1.1s color, 1.3s width;
复制代码
随机背景条纹效果图:
蝉原则案例:随机颜色方块DEMO
若是业务要求开发web播放器,必须保证播放器按等比例进行缩放,如何实现?
利用pading百分比技术便可轻松实现。
学习Vue源码系列:【Ts重构Vue】00-Ts重构Vue前言