前端知识整理
前端知识整理
代码千万行,安全第一行;前端不规范,运营两行泪
*HTML
HTML 语义化
-
少使用无意义的 <div>、<span> 标签;
-
在 <label> 标签中设置 for 属性和对应的 <input> 关联起来;
-
设置 <img> 标签的 alt 属性,给 <a> 标签设置 title 属性,利于 SEO;
-
在页面的标题部分使用 <h1>~<h6> 标签,不需要给它们加多余的样式;
-
与表单、有序列表、无序列表相关的标签不要单独使用。
较长的的HTML文件,请在板块之间加入注释,使得结构更清晰
*CSS
css中的块级元素与行级元素
先从概念上来看:
块级元素
特点:1.每个块级元素都是独自占一行,其后的元素也只能另起一行,并不能两个元素共用一行。
2.元素的高度、宽度、行高和顶底边距都是可以设置的。
3.元素的宽度如果不设置的话,默认为父元素的宽度。
常见的块级元素:<div>、<p>、<h1>...<h6>、<ol>、<ul>、<dl>、<table>、<address>、<blockquote> 、<form>
行级元素
特点:1.可以和其他元素处于一行,不用必须另起一行。
2.元素的高度、宽度及顶部和底部边距不可设置。
3.元素的宽度就是它包含的文字、图片的宽度,不可改变。
常见的块级元素:heda meat title lable span br a style em b i strong
行内块元素常见的有: img input td
行级元素与块级元素的转换
如果想将块级元素与行级元素相互转换,该怎么办呢?
可以在css样式中用display:inline将块级元素设为行级元素
同样,也可以用display:block将行级元素设为块级元素
行级-块级元素
如果又想设置高度、宽度、行高以及顶和底边距,又想元素处于一行,该怎么办呢?
此时就可以用display:inline-block将元素设置为行级-块级元素。(IE8不支持)
flex布局
display: flex | inline-flex;
其子元素便有了伸缩性,即使在子元素的宽高不确定的情况下,也能通过设置相关 css 属性来决定子元素的对齐方式、所占比例和空间分布。如上浏览器的支持程度,我们可以把此元素使用在移动端很方便。
flex的弹性布局有如下优势:
1.独立的高度控制与对齐。
2.独立的元素顺序。
3.指定元素之间的关系。
4.灵活的尺寸与对齐方式。
一些概念
在开始学习Flex 布局前,我们先来熟悉下有关 Flex 布局的几个概念,这些概念可以帮助对后文的理解。
-
Flex 布局是一整个模块,其中父元素称为 flex container,意为容器;子元素称为 flex item,意为项目;
-
Flex 布局中有两条看不见的轴线:主轴(main axis)和交叉轴(cross axis)。默认的主轴是平行的,交叉轴是垂直于主轴的;
-
主轴的开始位置叫 main start,结束位置叫 main end;交叉轴的开始位置叫 cross start,结束位置叫 cross end;
-
子元素在主轴方向上的大小称为 main size,在交叉轴方向上的大小称为 cross size。
flex-direction
和 flex-wrap
的属性值可以分别改变两个轴的方向和它们的开始位置、起始位置,这就让布局更加灵活多变了。容器属性
display 属性用来将父元素定义为 Flex 布局的容器,设置 display 值为 display: flex;
容器对外表现为块级元素;display: inline-flex;
容器对外表现为行内元素,对内两者表现是一样的。
<div class="container"></div>
.container { display: flex | inline-flex; }
-
flex-direction
-
flex-wrap
-
flex-flow
-
justify-content
-
align-items
-
align-content
flex-direction
flex-direction 定义了主轴的方向,即项目的排列方向。
<div class="container"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> </div>
.container {
flex-direction: row | row-reverse | column | column-reverse;
}
-
row(默认值):主轴在水平方向,起点在左侧,也就是我们常见的从左到右;
-
row-reverse:主轴在水平方向,起点在右侧;
-
column:主轴在垂直方向,起点在上沿;
-
column-reverse: 主轴在垂直方向,起点在下沿。
(flex-direction 为 row)
(flex-direction 为 row-reverse)
(flex-direction 为 column)
(flex-direction 为 column-reverse)
flex-wrap
默认情况下,项目是排成一行显示的,flex-wrap 用来定义当一行放不下时,项目如何换行。
.container {
flex-wrap: nowrap | wrap | wrap-reverse;
}
-
nowrap(默认):不换行;
-
wrap:换行,第一行在上面;
-
wrap-reverse:换行,第一行在下面。
(默认情况,flex-wrap 为 nowrap,不换行,即使设置了项目的宽度,项目也会根据屏幕的大小被压缩)
(flex-wrap 为 wrap)
(flex-wrap 为 wrap-reverse)
将 flex-wrap 设置为 wrap-reverse 可以看做是调换了交叉轴的开始位置(cross start)和结束位置(cross end)。
flex-flow
flex-flow 是 flex-direction 和 flex-wrap 的简写,默认值是 row no-wrap。
.container {
flex-flow: <flex-direction> || <flex-wrap>;
}
justify-content
.container {
justify-content: flex-start | flex-end | center | space-between | space-around;
}
-
flex-start(默认):与主轴的起点对齐;
-
flex-end:与主轴的终点对齐;
-
center:项目居中;
-
space-between:两端对齐,项目之间的距离都相等;
-
space-around:每个项目的两侧间隔相等,所以项目与项目之间的间隔是项目与边框之间间隔的两倍。
![](https://img2018.cnblogs.com/blog/1318853/201903/1318853-20190306162814015-703200830.png)
![](https://img2018.cnblogs.com/blog/1318853/201903/1318853-20190306163008799-1509942443.png)
![](https://img2018.cnblogs.com/blog/1318853/201903/1318853-20190306163020235-319853374.png)
![](https://img2018.cnblogs.com/blog/1318853/201903/1318853-20190306163031199-1949333611.png)
![](https://img2018.cnblogs.com/blog/1318853/201903/1318853-20190306163041332-1053856625.png)
align-items
align-items 定义了项目在交叉轴上如何对齐。
.container {
align-items: flex-start | flex-end | center | baseline | stretch;
}
-
flex-start:与交叉轴的起点对齐;
-
flex-end:与交叉轴的终点对齐;
-
center:居中对齐;
-
baseline:项目第一行文字的基线对齐;
-
stretch(默认值):如果项目未设置高度或者为 auto,项目将占满整个容器的高度。
假设交叉轴是从上到下的垂直方向,下面给出了不同属性值的效果图。
(align-items 为 flex-start)
(align-items 为 flex-end)
(align-items 为 center)
(align-items 为 baseline)
(align-items 为 stretch)
align-content
align-content 定义了多根轴线的对齐方式,若此时主轴在水平方向,交叉轴在垂直方向,align-content 就可以理解为多行在垂直方向的对齐方式。项目排列只有一行时,该属性不起作用。
.container {
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
-
flex-start:与交叉轴的起点对齐;
-
flex-end: 与交叉轴的终点对齐;
-
center:居中对齐;
-
space-bteween:与交叉轴两端对齐,轴线之间的距离相等;
-
space-around:每根轴线两侧的间隔都相等,所以轴线与轴线之间的间隔是轴线与边框之间间隔的两倍;
- stretch(默认值):如果项目未设置高度或者为 auto,项目将占满整个容器的高度。
(align-content 为 flex-start)
(align-contet 为 flex-end)
(align-content 为 center)
(align-content 为 space-between)
(align-content 为 space-around)
(align-content 为 stretch)
项目属性
对项目设置属性,可以更灵活地控制 Flex 布局。以下六种属性可以设置在项目上:
-
order
-
flex-grow
-
flex-shrink
-
flex-basis
-
flex
- align-self
order
order 定义了项目的排列顺序,默认值为 0,数值越小,排列越靠前。
.item { order: <integer>; }
(给第三个项目设置了 order: -1; 后,该项目排到了最前面)
flex-grow
flex-grow 定义了项目的放大比例,默认为 0,也就是即使存在剩余空间,也不会放大。
如果所有项目的 flex-grow 都为 1,则所有项目平分剩余空间;如果其中某个项目的 flex-grow 为 2,其余项目的 flex-grow 为 1,则前者占据的剩余空间比其他项目多一倍。
.item { flex-grow: <number>; }
(所有项目的 flex-grow 都为 1,平分剩余空间)
(flex-grow 属性值越大,所占剩余空间越大)
flex-shrink
flex-shrink 定义了项目的缩小比例,默认为 1,即当空间不足时,项目会自动缩小。
如果所有项目的 flex-shrink 都为 1,当空间不足时,所有项目都将等比缩小;如果其中一个项目的 flex-shrink 为 0,其余都为 1,当空间不足时,flex-shrink 为 0 的不缩小。
负值对该属性无效。
.item { flex-shrink: <number>; }
(空间不足时,默认等比缩小)
(flex-shrink 为 0 的不缩小)
flex-basis
flex-basis 定义了在分配多余的空间之前,项目占据的主轴空间,默认值为 auto,即项目原来的大小。浏览器会根据这个属性来计算主轴是否有多余的空间。
flex-basis 的设置跟 width 或 height 一样,可以是像素,也可以是百分比。设置了 flex-basis 之后,它的优先级比 width 或 height 高。
.item { flex-basis: <length> | auto; }
(不同的 flex-basis 值效果展示)
flex
flex 属性是 flex-grow、flex-shrink、flex-basis 的缩写,默认值是 0 1 auto,后两个属性可选。
该属性有两个快捷值:auto(1 1 auto)和 none(0 0 auto)。auto 代表在需要的时候可以拉伸也可以收缩,none 表示既不能拉伸也不能收缩。
.item { flex: auto | none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ] }
align-self
align-self 用来定义单个项目与其他项目不一样的对齐方式,可以覆盖 align-items 属性。默认属性值是 auto,即继承父元素的 align-items 属性值。当没有父元素时,它的表现等同于 stretch。
align-self 的六个可能属性值,除了 auto 之外,其他的表现和 align-items 一样。
.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
(第三个项目的对齐方式与其他不同)
浏览器兼容性及其他
设置为 Flex 布局后,子元素的 float、clear、vertical-align 属性都将失效。
因为历史原因,W3C 对 flex 做了多次更新,也就导致了各浏览器支持度参差不齐。到目前为止,Flex 布局有一下几种写法:
display: box; /* 2009 version 老语法 */
display: flexbox; /* 2011 version 过渡语法 */
display: flex | inline-flex; /* 2012 version 新语法 */
从 Can I Use 上可以看出目前 Flex 布局对浏览器的支持情况。从中我们可以总结出新语法目前的支持情况:
-
Chrome 29+
-
Firefox 28+
-
Safari 9+
-
iOS Safari 9+
-
Android 4.4+
-
IE Mobile 11+
更低的版本需要加上前缀进行支持,不同版本所在时期不同也会导致属性值不同,这里有一个推荐的兼容性写法:
.page-wrap {
display: -webkit-box; /* 老语法 iOS 6-, Safari 3.1-6 */
display: -moz-box; /* 老语法 Firefox 19- (buggy but mostly works) */
display: -ms-flexbox; /* 过渡语法 IE 10 */
display: -webkit-flex; /* 新语法 Chrome */
display: flex; /* 新语法, Spec - Opera 12.1, Firefox 20+ */
}
CSS 响应式布局示例
什么是响应式布局
在日常生活中,我们可以使用电脑,手机,平板来浏览网页。这些不同的媒介的屏幕大小是不一样的,那么我们如何保证自己设计的网页在任何大小的屏幕上都能有一个完美的布局呢,这里就要用到我们这一节要讲的响应式布局的知识啦。所谓响应式布局,就是页面的布局能够随着屏幕大小的变化而变化,从而实现在任何大小的屏幕上都能以最完美的布局来展示我们的内容。本文将以示例的形式讲解如何利用原生的 CSS 来实现页面的响应式布局,知识点都非常基础但同时也非常重要,适合新手学习。
示例一:响应式图片
(图片大小随显示区域的变化而变化)
从上图中我们可以看出,图片在随着显示区域的变小而变小,这是怎么实现的呢,我们先来看一下相应的 HTML 和 CSS 代码:
//HTML代码 <body> <img src="http://www.chenxin.art/imgs/xingkong.jpg" alt="drawing" /> </body> //CSS代码 img { width: 1200px; max-width: 100%; }
width: 1200px;
规定了图片的宽度。这里我们只规定了宽度而没有规定高度是因为,对于 img
标签而言,如果我们只规定高度和宽度中的一个的话,没有规定的那一个会根据图片本身的比例进行自适应,也就是说可以保证图片的比例不变。
max-width: 100%
才是实现响应式的关键。这句代码的意思是,图片的最大宽度不能超过 100%
。这个 100%
是相对于其父元素来说的。在本例中, img
标签的父元素是 body
标签,所以它的意思其实是 img
的宽度不能超过 body
的宽度,而body
的宽度实际上就是浏览器窗口可见区域的宽度啦。这个时候我们可以分两种情况来讨论:
- 当浏览器的宽度大于或等于
1200px
时,因为图片的宽度为1200px
,满足“图片的宽度不能大于其父元素的宽度”这一限制条件,所以图片保持宽度1200px
不变。 - 当浏览器的宽度小于
1200px
时,此时不满足“图片的宽度不能大于其父元素的宽度”这一限制条件,所以图片会缩小到满足条件为止,最后的结果就是图片的宽度会等于浏览器的宽度。这就是为什么图片会随着窗口的变窄而变小了。
类似的 CSS 属性还有 min-width
、max-height
、min-height
,原理都是一样的。
示例二:首屏内容始终填充整个窗口
(淡绿色的首屏始终填满了整个窗口,稍稍拉动下拉条,就会进入白色的第二屏)
在上图中我们可以看到,谈绿色的首屏始终填满了整个窗口,我们稍稍拉动下拉条,就会进入白色的第二屏。这种技术经常被展示产品的网站所采用:产品的概念图放在首屏,详细的产品描述放在首屏之后,这样的首屏看起来干净简洁,重点突出。这种首屏内容填满整个窗口的技术是怎么实现的呢,我们来看代码:
//HTML代码 <div class="intro"> <h1>语雀-前端九部</h1> </div> //CSS代码 .intro { background: #e0ebe8; text-align: center; height: 55vh; padding-top: 45vh; }
这其中就用到了 css3
的新增单位 vh
。vh
是一个表示浏览器视窗高度的单位,所谓视窗,就是浏览器用来真正显示内容的区域,不包括工具栏等。 1vh
表示视窗高度的百分之一,100vh
表示整个视窗的高度。注意,我们这里虽然是使用了百分号的机制,但是书写的时候不用写百分号,只用写数字就好了。在上段代码中,height
和 padding-top
加起来正好是100vh
,所以首屏内容恰好占据整个视窗的大小。
的新增单位还有vw
、vmin
、vmax
。大家可以通过这篇文章了解一下。
示例三:媒体查询(@media)
(利用媒体查询在特定情况下改变标签样式)
在上图中我们可以看到,带有“语雀”字样的圆形图标在窗口缩窄到一定程度之后改变了其样式,由圆形变为了长方形。这里就使用到了所谓的媒体查询方法。媒体查询简单用法如下:
@media (max-width: 480px) {
background-color: lightgreen;;
}
媒体查询的标识符是 @media
。上面这段代码的含义是:如果视窗的宽度小于 480px
时,将背景色变为淡绿色。下面我们再来看一下实现上图效果的代码:
//HTML代码 <div> <a href="#">语雀</a> <a href="#">语雀</a> <a href="#">语雀</a> <a href="#">语雀</a> <a href="#">语雀</a> </div> //CSS代码 div { text-align: center; padding-top: 20vh; } a { display: inline-block; margin: 0 35px 45px 35px; border-radius: 50%; width: 100px; height: 100px; line-height: 100px; background: #e0ebe8; color: #008080; } @media (max-width: 367px) { a { border-radius: 0; height: 20px; padding: 10px; line-height: normal; } }
当视窗宽度小于 367px
时,写在 @media
内部的样式会被启用。比如@media
中,a
标签被设置了的 border-radius:0
,这个时候 border-radius: 0
就会覆盖之前的 border-radius: 50%
,a
标签就从圆形变成了长方形。@media
中的某个样式,如果在这之前已经被设置了,那么就会覆盖之前的值,如果之前没有被设置过,就会添加进去。所谓“存在即覆盖,不存在则添加”。
关于媒体查询的用法还有很多,我们这里只是介绍了其中的一种,关于更多媒体查询的用法大家可以参考这个网站。
*Webpack
什么是Webpack
WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并将其转换和打包为合适的格式供浏览器使用。
为什要使用WebPack
现今的很多网页其实可以看做是功能丰富的应用,它们拥有着复杂的JavaScript代码和一大堆依赖包。为了简化开发的复杂度,前端社区涌现出了很多好的实践方法
- 模块化,让我们可以把复杂的程序细化为小的文件;
- 类似于TypeScript这种在JavaScript基础上拓展的开发语言:使我们能够实现目前版本的JavaScript不能直接使用的特性,并且之后还能转换为JavaScript文件使浏览器可以识别;
- Scss,less等CSS预处理器
- ...
这些改进确实大大的提高了我们的开发效率,但是利用它们开发的文件往往需要进行额外的处理才能让浏览器识别,而手动处理又是非常繁琐的,这就为WebPack类的工具的出现提供了需求。
Webpack的工作方式是:把你的项目当做一个整体,通过一个给定的主文件(如:index.js),Webpack将从这个文件开始找到你的项目的所有依赖文件,使用loaders处理它们,最后打包为一个(或多个)浏览器可识别的JavaScript文件。
*代码规范
css规范
1.使用CSS缩写属性
CSS有些属性是可以缩写的,比如padding,margin,font等等,这样精简代码同时又能提高用户的阅读体验。
2.去掉小数点前的“0”
.box{
margin-top: .5px;
}
3.不要随意使用!important 样式,这样会给后续维护代码的人员造成困扰
3.简写命名
很多用户都喜欢简写类名,但前提是要让人看懂你的命名才能简写哦!
4.连字符CSS选择器命名规范
1).长名称或词组可以使用中横线来为选择器命名。
2).不建议使用“_”下划线来命名CSS选择器,为什么呢?
输入的时候少按一个shift键; 浏览器兼容问题 (比如使用_tips的选择器命名,在IE6是无效的) 能良好区分JavaScript变量命名(JS变量命名是用“_”)
5.不要随意使用id
id在JS是唯一的,不能多次使用,而使用class类选择器却可以重复使用,另外id的优先级优先与class,所以id应该按需使用,而不能滥用。
6.为选择器添加状态前缀
有时候可以给选择器添加一个表示状态的前缀,让语义更明了
7.CSS命名规范(规则)
常用的CSS命名规则
头:header
内容:content/container
尾:footer
导航:nav
侧栏:sidebar
栏目:column
页面外围控制整体佈局宽度:wrapper
左右中:left right center
登录条:loginbar
标志:logo
广告:banner
页面主体:main
热点:hot
新闻:news
下载:download
子导航:subnav
菜单:menu
子菜单:submenu
搜索:search
友情链接:friendlink
页脚:footer
版权:copyright
滚动:scroll
内容:content
标签:tags
文章列表:list
提示信息:msg
小技巧:tips
栏目标题:title
加入:joinus
指南:guide
服务:service
注册:regsiter
状态:status
投票:vote
合作伙伴:partner
注释的写法:
/* Header */
内容区
/* End Header */
id的命名:
1)页面结构
容器: container
页头:header
内容:content/container
页面主体:main
页尾:footer
导航:nav
侧栏:sidebar
栏目:column
页面外围控制整体佈局宽度:wrapper
左右中:left right center
(2)导航
导航:nav
主导航:mainnav
子导航:subnav
顶导航:topnav
边导航:sidebar
左导航:leftsidebar
右导航:rightsidebar
菜单:menu
子菜单:submenu
标题: title
摘要: summary
(3)功能
标志:logo
广告:banner
登陆:login
登录条:loginbar
注册:register
搜索:search
功能区:shop
标题:title
加入:joinus
状态:status
按钮:btn
滚动:scroll
标籤页:tab
文章列表:list
提示信息:msg
当前的: current
小技巧:tips
图标: icon
注释:note
指南:guild
服务:service
热点:hot
新闻:news
下载:download
投票:vote
合作伙伴:partner
友情链接:link
版权:copyright
注意事项:
1.一律小写;
2.尽量用英文;
3.不加中槓和下划线;
4.尽量不缩写,除非一看就明白的单词
CSS样式表文件命名
主要的 master.css
模块 module.css
基本共用 base.css
布局、版面 layout.css
主题 themes.css
专栏 columns.css
文字 font.css
表单 forms.css
补丁 mend.css
打印 print.css
js规范
空格与运算符
通常运算符 ( = + - * / ) 前后需要添加空格
代码缩进
通常使用 4 个空格符号来缩进代码块:
不推荐使用 TAB 键来缩进,因为不同编辑器 TAB 键的解析不一样。
语句规则
简单语句的通用规则:
- 一条语句通常以分号作为结束符。
var values = ["Volvo", "Saab", "Fiat"]; var person = { firstName: "John", lastName: "Doe", age: 50, eyeColor: "blue" };
-
复杂语句的通用规则:
- 将左花括号放在第一行的结尾。
- 左花括号前添加一空格。
- 将右花括号独立放在一行。
- 不要以分号结束一个复杂的声明。
function toCelsius(fahrenheit) { return (5 / 9) * (fahrenheit - 32); }
短的对象代码可以直接写成一行:
var person = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"};
命名规则
一般很多代码语言的命名规则都是类似的,例如:
- 变量和函数为小驼峰法标识, 即除第一个单词之外,其他单词首字母大写( lowerCamelCase)
- 全局变量为大写 (UPPERCASE )
- 常量 (如 PI) 为大写 (UPPERCASE )
使用小写文件名