赞
踩
产品经理:拿到需求——》整理需求——》编写需求文档——》设计出原型图
UI设计师:根据原型图设计出高保真的psd设计原稿
开发人员:前端、后端、测试人员,架构设计、任务分配等。一般都会同时进行开发
运维人员:网络搭建,服务器环境配置,项目的上线…
浏览器:谷歌(推荐)、火狐firefox、edge(前身IE)
笔记工具:typora
是一款markdown的一个编辑器
markdown:https://markdown.com.cn/
借助typora提供的快捷键来进行编写
像素大厨:pxcook
开发工具:vscode(推荐)、hbuilder、webstorm、sublime
vscode推荐的插件:
代码编辑器,小巧,自定义插件,性能好
Chinese (Simplified)
:汉化vs code
HTML CSS Support
:在HTML中支持css提示
Image preview
:在代码中将引入的图片显示它的缩略图
open in browser
:在浏览器中打开网页,可以是默认浏览器,也可以是其他浏览器
VS Color Picker
:颜色选择器
Code Spell Checker
:代词拼写检查
Auto Rename Tag
:自动修改对应的标签名
Live Server
:将vscode作为服务器打开页面
按下!感叹号 (英文)+ tab键: 生成<!DOCTYPE html>
HTML就是一种创建网页的标准语言,你通过浏览器访问的所有主流网页,包括:百度、淘宝、京东、腾讯、凡云网校都是基于HTML创建的
超文本:不仅仅是文本,还包括了,超链接、图片、音视频等其他资源
标记
:就是组成网页的标签(代码),html代码就是以标签的形式存在的,HTML标签通常也称为html元素
标签的基本语法:<标签名>内容</标签名>
| <标签名 />
例子:
<a href="https://www.fanyunedu.com">欢迎来到凡云网校</a>
语言:人与计算机之间的沟通语言,计算机语言
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<a href="https://www.fanyunedu.com">欢迎来到凡云网校</a>
</body>
</html>
<!doctype html>
:声明我们当前html文档以什么方式去解析:以html5的方式呈现我们看见的网页
<!DOCTYPE html>
<!doctype HTML>
<html>
:网页的根标签,每个网页都有这个标签,有且只有一个
<head>
:网页的头部,主要是用来配置网页的信息
title:网页的标题
meta:用于配置网页的元(meta)信息:
如<meta charset="UTF-8">
设置网页的字符编码为utf-8
<meta name="description" content="《王者荣耀》是腾讯天美工作室" />
<meta name="keywords" content="王者荣耀,王者荣耀下载,王者荣耀电脑版" />
<body>
:用于包裹网页的主题内容
<!--
注释的内容
-->
<div>
内容(可以是文字,也可以是其他的标签)
</div>
<a href="http://www.baidu.com" target="_self">百度一下</a>
<img src="./image/banner.jpg" alt="" title="">
src:链接图片资源的路径
可以是网络路径
就是以http或https开头的就是网络路径
也可以是本地路径
绝对路径:以file或盘符开头的路径就是绝对路径
相对路径:从当前文件夹出发来查找资源
alt:图片加载失败时显示的提示性文字
title:鼠标悬停在标签上的提示性文字
<h1>这是一个标题</h1>
<h2>这是一个标题</h2>
<h3>这是一个标题</h3>
<h4>这是一个标题</h4>
<h5>这是一个标题</h5>
<h6>这是一个标题</h6>
<p>
《王者荣耀》全部背景故事发生于架空世界“王者大陆”中。相关人物、地理、事件均为艺术创作,并非正史。
</p>
<span>这是王者荣耀首页</span>
<input type="text" placeholder = "热门搜索:干花搜索">
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
...
</ul>
li:代表无序类表里的每一项
<ol>
<li>1</li>
<li>2</li>
<li>3</li>
...
</ol>
ul、ol、li都是块级元素
自定义列表
<dl>
<dt>学生</dt>
<dd>学生列表</dd>
<dd>新增学生</dd>
<dt>教师</dt>
<dd>教师列表</dd>
<dd>新增教师</dd>
</dl>
ul,ol,li{
list-style:none;
margin:0;
padding:0
}
表单元素通常都用来前端后端的数据交互
表单其实是一片允许用户输入数据的一个区域
通过form来定义一个表单区域(所有元素标签在form区域内才有效)
在form标签里面必须有一个submit标签!!!!!!!!!!!!!!!
<form action="提交地址" method="提交表单元素的方式">
</form>
method:
form用来包裹一些表单元素的:文本框、密码框、单选框、多选款(复选框)、下拉菜单、按钮
<input type="text" name="文本框的名字" value="文本框的默认值" placeholder="文本框的提示语句">
<input type="password" name="文本框的名字" value="文本框的默认值" placeholder="文本框的提示语句">
<input type="radio" name="给单选框分类" value="要提交给后端的具体值" checked>
name:类名需要相同
checked:默认选中这个选框
<input type="checkbox" name="多选框的名字" value="要提交给后端的具体值" checked>
checked:默认选中这个选框
<select name="下拉菜单的名字">
<option value="要提交给后端的具体值1" selected>选项1</option>
<option value="要提交给后端的具体值2">选项2</option>
<option value="要提交给后端的具体值3">选项3</option>
<option value="要提交给后端的具体值4">选项4</option>
</select>
selected:默认选中的选项
姓名 | 年龄 | 性别 |
---|---|---|
张三 | 18 | 男 |
李四 | 20 | 女 |
王五 | 22 | 男 |
<table> <thead> <tr> <th>姓名</th> <th>年龄</th> <th>性别</th> </tr> </thead> <tbody> <tr> <td>张三</td> <td>18</td> <td>男</td> </tr> <tr> <td>李四</td> <td>20</td> <td>女</td> </tr> <tr> <td>王五</td> <td>22</td> <td>女</td> </tr> </tbody> </table>
/* 表格专用样式:合并单元格的边框,去除表格默认多余边框 */
border-collapse: collapse;
在td上有两个属性可以合并单元格
行级元素中还有一些特殊的标签:行内块元素,例如img、input
行内块元素 又可以同行显示,又可以支持修改宽高
display: block;
display: inline-block;
display: inline;
<标签名 style="样式名1:样式值1;样式名2:样式值2;...."></标签名>
<head>
<style>
选择器{
样式名1:样式值1;
样式名2:样式值2;
...
}
</style>
</head>
<head>
<link rel="stylesheet" href="css文件的路径">
</head>
以下是css文件里的语法:
选择器{
样式名1:样式值1;
样式名2:样式值2;
...
}
内嵌样式表 > 内部样式表 ≈ 外部样式表(内部和外部采用就近原则)
<style>
#id名{
想要给对应标签设置的样式
}
</style>
<div id="id名"></div>
<style>
.class名1{
想要给对应标签设置的样式
}
.class名2{
想要给对应标签设置的样式
}
</style>
<div class="class名1 class名2"></div>
标签名{
想要给对应标签设置的样式
}
选择器 | 描述 |
---|---|
:link | 向未被访问的超链接添加样式 |
:visited | 向访问过的超链接添加样式 |
:hover | 向鼠标悬停的标签添加样式 |
:active | 向被激活的标签添加样式 |
:focus | 向获取到焦点的标签添加样式 |
后代选择器:找到所有满足条件的后代,选择器之间通过空格隔开
父选择器 后代选择器{
针对当前父选择器里的后代来设置,不会影响其他标签里的样式
}
.box li{
}
父子选择器(子元素选择器):找到满足条件的儿子标签,之间通过 > 隔开
父选择器 > 儿子选择器{
要作用给儿子选择器的样式
}
兄弟选择器:找到满足条件的(后续)兄弟选择器,之间通过 + 隔开
选择器a + 选择器b{
作用给a后续的兄弟b的样式
}
选择器分组:找到所有指定的标签,中间通过逗号,隔开
div,h1,p,body,ul,li{
这里的样式就会作用给上述所有标签
}
<style> .two{ /* 隐藏元素 */ display: none; } .web:hover .two{ display: block; } </style> <body> <ul> <li class="web">学前端 <ul class="two"> <li>HTML</li> <li>CSS</li> <li>JS</li> </ul> </li> <li class="web">学java <ul class="two"> <li>HTML</li> <li>CSS</li> <li>JS</li> </ul> </li> <li class="web">学测试 <ul class="two"> <li>HTML</li> <li>CSS</li> <li>JS</li> </ul> </li> </ul> </body>
选择器 | 例子 | 例子描述 |
---|---|---|
[属性名] | [class] | 选择带有 class 属性的所有元素。 |
[属性名=属性值] | [class=box] | 选择带有 class=“box” 属性的所有元素。精准匹配 |
[属性名~=属性值] | [class~=box] | 选择带有包含 “box” 一词的 class 属性的所有元素。必须为单独的完整单词 |
[属性名|=属性值] | [class|=box] | 选择带有以 “box” 开头的 class 属性的所有元素。必须为完整单词或加连字符 |
[属性名^=属性值] | [class^=box] | 选择其 class 属性值以 “box” 开头的所有元素。不必为完整单词 |
[属性名$=属性值] | [class$=box] | 选择其 class 属性值以 “box” 结尾的所有元素。不必为完整单词 |
[属性名*=属性值] | [class*=box] | 选择其 class 属性值包含 “box” 的所有元素。不必为完整单词,模糊匹配 |
* {
/*list-style:none*/
/*padding:0 */
css样式
}
注意:它们都需要搭配content来使用
.box::after{ /* 固定搭配 */ content: "1"; display: inline-block; width: 20px; height: 20px; /* 倒圆角 */ border-radius: 50%; background-color: red; color: #fff; font-weight: bold; /* 绝对定位 */ position: absolute; top: -10px; right: -10px; } .box::before{ /* 固定搭配 */ content: ""; }
注意:如果需要给微元素设置宽高,那么需要把标签类型修改为块级元素inline-block、block
p:first-child{
color: red;
}
p:last-child{
color: blue;
}
nth-child(数字):找到当前结构正数对应数字的标签,并且这个标签就是指定的标签
nth-last-child(数字):找到当前结构倒数对应数字的标签,并且这个标签就是指定的标签
p:nth-child(2){
color: purple;
}
p:nth-last-child(2){
color: purple;
}
p:nth-of-type(2){
color: tomato;
}
p:nth-last-of-type(2){
color: green;
}
偶数:even / 2n
奇数:odd / 2n-1
隔两个选一个 / 3n
选中前面的x个 / -n + x
注意:加法运算,不满足10进1的标准
从左往右依次比较,只要发现某一个0比其他的大,那么它的权重就更高
100个class都没有1个id权重高
将权重提高到最高,内嵌都没有!important高
#demo{
color: blue;
}
.demo1.demo2.demo3.demo4.demo5.demo6.demo7.demo8.demo9.demo10.demo11{
color: red !important; 这个的权重更高
}
不建议大量使用!important,破坏css的权重结构。
width: 宽度
height: 高度
border: 边框的粗细 边框的样式 边框的颜色
/* 设置文字字号大小 */
font-size: 30px;
/* 设置字体的类型 */
font-family: "微软雅黑";
/* 设置字体的粗细 */
font-weight: bold;
/* 设置字体风格。italic代表斜体字 */
font-style: italic;
/* 设置文本的对齐方式,只对文本和行级元素有效 */ text-align: center; text-align: left; /* 设置文本的整体效果 */ /* 下划线 */ text-decoration: underline; /* 上划线 */ text-decoration: overline; /* 贯穿线 */ text-decoration: line-through; /* 清除a标签默认的下划线 */ text-decoration: none; /* 设置文本的颜色 */ color: #ff00ff; /* 设置行高 使用技巧:设置的字体行高等于父盒子的高度,实现文本垂直居中(只对一行的文本有效) */ line-height: 300px;
/* 修改输入框里的提示文字 */
.user-box input::placeholder{
/* color: red; */
font-size:14px;
}
/* 背景颜色 */
background-color: pink;
background-image: url(./image/logo.png);
/* 取消背景的重复铺设 */
background-repeat: no-repeat;
/* 设置背景图的定位 */
background-position: 50% 50%;
/* 设置背景图的大小 */
/* background-size: 100px 100px; */
background-size: contain;
概念
盒模型相关的css属性
概念:所有html元素都可以看做是一些大大小小的盒子,这些盒子组合起来就能形成整个布局
content:内容
padding:内边距
border:边框
margin:外边距
margin-bottom: 50px;
margin-top: 50px;
margin-left: 30px;
margin-right: 100px;
/* margin复合属性 一个值: 上下左右 */
margin:50px;
/* margin复合属性 2个值: 上下 左右 */
margin:50px 100px
/* margin复合属性 3个值: 上 左右 下 */
margin: 30px 100px 50px;
/* margin复合属性 4个值: 上 右 下 左 顺时针结构*/
margin: 20px 30px 50px 80px;
作用:盒子与盒子之间的距离,盒子与盒子可以是兄弟关系,也可以是父子关系
注意:margin会撑大盒模型的占位大小
盒子水平居中:margin:0 auto
注意:垂直方向的auto是没有效果的
盒子实现垂直居中:
margin: 0 auto;
/* margin-top: 200px; */
/* 可以利用calc()的函数来实现计算,css3提供的计算方法 */
margin-top: calc((666px - 79px) / 2);
margin为负值
margin-top:-100px
overflow:hidden
解决,原理是触发了一个bfc区域.out{
width: 500px;
height: 300px;
background-color: pink;
/* 固定办法,解决margin的传递性,触发了一个bfc区域 */
overflow: hidden;
}
.in{
width: 200px;
height: 200px;
background-color: tomato;
margin-top: 50px;
}
padding-top: 50px;
padding-left: 50px;
padding-right: 50px;
padding-bottom: 50px;
padding: 50px;
padding: 50px 100px;
padding: 50px 100px 80px;
padding: 50px 100px 80px 30px;
宽度:width (content)+ padding * 2 + border * 2 + margin * 2
宽度:width(包含content + padding * 2 + border * 2)+ margin * 2
补充:页面中绝大部分都是标准盒模型,还有一小部分默认采用的是怪异盒模型
浮动元素会和其他浮动元素同行显示
左浮动:依次靠左排列;右浮动:会依次靠右排列,右浮动要注意代码结构顺序
父元素宽度不足以容纳下浮动元素时,浮动元素会自动换行
行级元素浮动之后会转换成块级元素,支持宽高的设置
浮动元素会脱离文档流
浮动元素之下不能有文字存在,会被挤开
float: left | right | none(默认值,不浮动)
后续的非浮动元素会被浮动元素遮住——浮动元素脱离了文档流
clear:both
.box{
width: 100px;
height: 100px;
background-color: pink;
/* 左浮动 */
float: left;
/* float: right; */
}
.ot{
width: 200px;
height: 200px;
background-color: blue;
/* 清除浮动带来的影响 */
clear: both;
}
子元素浮动之后,没有设置高度的父盒子的高度会塌陷,
解决1:overflow:hidden
触发bfc,让里面的浮动元素高度参与计算
解决2:在父盒子最后面创建一个空div,取一个class=clearfix,再给这个盒子设置清除浮动属性
.clearfix{
clear: both;
}
.clearfix::after{
content: "";
display: block;
clear: both;
}
后续只需要在 受影响的父元素的class里添加 clearfix名就行了
官网:https://fontawesome.dashgame.com/
一套绝佳的图标字体库和CSS框架
引入:下载静态文件解压,通过link标签引入css文件
注意:
@font-face{
font-family: 'myFont';
src: url(./fonts/徐静蕾字体.ttf),url(./fonts/徐静蕾字体.woff);
}
div{
font-family: 'myFont';
}
传统的布局方式:浮动、margin、vertical-align、padding…技术来完成页面
弹性布局:css3提出的一个新的布局概念,以弹性容器
为核心来进行页面设计,可以快捷、响应式的完成页面布局。
设置弹性容器需要给父盒子设置display:flex
的属性
弹性容器的特点:
弹性容器里的子元素会同行显示
弹性容器里的子元素默认不会换行
弹性容器里的子元素会被修改为块级元素,并且同行显示,
如果子元素没有设置宽高,宽度由内容决定,高度默认沾满整个弹性容器
弹性容器只对直接子元素有效果,对孙子元素没有效果
弹性容器对兄弟元素没有影响,弹性容器在兄弟眼里就是一个普通的块级元素
弹性容器(flex container):设置了display:flex属性的标签
弹性项目(flex item):弹性容器里的每一个子元素
主轴侧轴(main axis / cross axis):决定了方向,可以通过代码把主轴和侧轴进行交换
起点和终点(main start / main end ):决定元素的排列方向
flex-wrap
:设置弹性项目是否换行分配富余空间的css属性
justify-content
:处理主轴上的富余空间center
:让所有弹性项目居中space-between
:将富裕空间放在每一个弹性项目之间,左右两边的项目是贴在容器边上的align-items
:处理弹性项目所在的那一行的富余空间
center
:让所有弹性项目居中align-content
:处理弹性项目在整个容器里侧轴的富余空间(只针对多行元素)
flex-start:将富余空间放在所有弹性项目之后(默认值)
flex-end:将富余空间放在所有弹性项目之前(默认值)
center:让所有弹性项目居中
space-between
: 将富裕空间放在每一个弹性项目之间,左右两边的项目是贴在容器边上的
space-around: 将富裕空间放在每一个项目的两侧,会出现两边窄,中间宽的效果
flex-start:将富余空间放在所有弹性项目之后(默认值)
flex-end:将富余空间放在所有弹性项目之前(默认值)
center:让所有弹性项目居中
.item2{
/* order: 3; */
}
.item3{
/* order 数字越大,顺序越靠后,默认值就是0 */
/* order: 2; */
}
.item4{
/* order: 0; */
order: -1;
}
.item1{
/* order: 1; */
}
概念:用来设置每一个弹性项目的增长量,这个增长量是富裕空间给的。
语法:
flex-grow:数字
数字越大,这个弹性项目所分配的空间占比越多,
每一个弹性项目所分配得到的空间:弹性空间
计算公式:
富余空间 = 弹性容器的大小 - 所有弹性项目宽度的总和
弹性空间 = 富余空间 / 弹性因子的总和 * 对应的弹性因子
弹性项目的最后宽度 = 弹性空间 + 弹性项目原本的宽度
flex-grow默认值为0
概念:当弹性容器宽度不够时,去设置每一个弹性项目的收缩量
语法:
flex-shrink:数字
flex-shrink默认值为1
数字越大,收缩的越多
每一个弹性项目的收缩的空间(收缩空间)
计算公式:
总收缩空间 = 弹性项目的宽度总和 - 弹性容器的宽度
每个弹性项目的收缩空间 = 总收缩空间 / 收缩因子 * 对于弹性项目的收缩因子
弹性项目的最后宽度 = 弹性项目原本的宽度 - 收缩空间
优先级:flex-basis > width
语法:
flex-basis: 500px
默认值:0 1 auto
flex:1
: 代表flex-grow:1、flex-shrink:1、flex-basis:0%(auto)postion:static
特点:
会在当前位置脱离文档流
如果设置了偏移量,会参考整个文档(document)进行定位偏移
会固定显示在文档区域,不会随着滚动条而滚动
语法:
position:fixed;
/* 偏移量*/
/*left:0;
top:0;*/
right:0;
bottom:0
偏移量:
left:距离文档左边为多少距离
right:右边
top:上边
bottom:下边
注意:同时设施了top和bottom、right和left,left和top的优先级更高
应用场景:
头部固定、侧边栏固定…
使用技巧:盒子居中
.aside{
width: 120px;
height: 280px;
background-color: pink;
position: fixed;
/* margin: auto auto; 利用margin的特点实现左右上下自动分配*/
margin: auto;
left: 0;
right: 0;
top: 0;
bottom: 0;
}
特点:
语法:
position:absolute
/* left: 0;
right: 0px;*/
top: 0px;
bottom: 0;
偏移量:
left:距离最近的定位父级左边为多少距离(如果没有才参考文档)
right:右边
top:上边
bottom:下边
注意:同时设施了top和bottom、right和left,left和top的优先级更高
应用场景:二级菜单,元素重叠
使用技巧:盒子居中
.aside{
width: 120px;
height: 280px;
background-color: pink;
position: absolute;
/* margin: auto auto; 利用margin的特点实现左右上下自动分配*/
margin: auto;
left: 0;
right: 0;
top: 0;
bottom: 0;
}
绝对定位通常来说是搭配 相对定位
来使用的:子绝父相
特点:
语法:
position: relative;
/* left: 200px;
top: 200px; */
right: -50px;
bottom: -50px;
偏移量:
left:距离原本的位置向右移动
right:向左移动
top:向下移动
bottom:向上移动
注意:同时设施了top和bottom、right和left,left和top的优先级更高
应用场景:
定位的层级
z-index:数字
数字越大,显示层级越高
必须设置给有定位的元素(除了static)
官网:https://www.sass.hk/
VS Code中使用
安装easy sass插件
配置easy sass输出目录
新建名字以.scss为后缀的文件,在里面书写css代码
保存时,插件会自动将sass文件编译成css文件,并输出到指定位置
嵌套使用
.one {
> li{
&:first-child{
border: 1px solid red;
.two{
li{
&:first-child{
background-color: pink;
}
}
}
}
}
}
&:代表当前标签本身
变量:保存数据的容器
$变量名:数据;
选择器{
属性名:$变量名
}
border-radius:10px 4个角为10px
border-radius:50% 4个角刚好是边长一半
border-top-left-radius: 30px; 左上
border-top-right-radius: 50px; 右上
border-bottom-right-radius: 80px; 右下
border-bottom-left-radius: 100px; 左下
border-radius: 50px; 4个角为50px
border-radius: 100px 50px; 左上/右下 右上/左下
border-radius:20px 100px 50px; 左上 右上/左下 右下
border-radius:20px 100px 50px 80px; 左上 右上 右下 左下
border-radius: 10px 20px 30px 40px / 50px 60px 70px 80px; 8个值 以椭圆去切割
左上x 右上x 右下x 左下x / 左上y 右上y 右下y 左下y
box-shadow: x轴的偏移量 y轴的偏移量 模糊程度 阴影大小 颜色 inset(内阴影); 案例: .box{ width: 300px; height: 300px; background-color: pink; margin: 100px auto; /* box-shadow: 10px 10px 0px 0px blue; */ transition: box-shadow 0.6s; } .box:hover{ box-shadow: 0px 3px 5px 0px #888; } .box:active{ box-shadow: none; }
text-shadow:x轴的偏移量 y轴的偏移量 模糊程度 颜色
opacity:0.5 值:0-1之间
将当前盒子和盒子里所包含的所有元素都一起给透明了
color: rgba(128, 0, 128, 0.3); 值:0-1之间
background-color: rgba(255, 155, 205, 0.3);
指针对我指定的颜色来调整不透明度,不会影响到其他的元素
background-image: linear-gradient(渐变方向,颜色1,颜色2,...)
to bottom 180deg (默认值)
to top 0deg
to left 270deg (-90deg)
to right 90deg
to left top 315deg (-45deg)
to right top 45deg
to right bottom 135deg
to left bottom 225deg
background-image: linear-gradient(180deg,red ,green 10%,red 20%,green 30%);
可以是百分比也可以是px像素
重复铺设:
/* 重复铺设 */
background-image: repeating-linear-gradient(45deg,
rgba(255,0,0,0.3) 0px ,
rgba(255,0,0,0.3) 10px,
rgba(0,255,0,0.3) 10px,
rgba(0,255,0,0.3) 20px),
repeating-linear-gradient(135deg,
rgba(255,0,0,0.3) 0px ,
rgba(255,0,0,0.3) 10px,
rgba(0,255,0,0.3) 10px,
rgba(0,255,0,0.3) 20px);
可以通过逗号隔开,设置多个渐变重叠
background-image:
linear-gradient(rgba(255,0,0,0.1),rgba(255,0,0,0.1)),
url(./image/banner.jpg);
background-image: radial-gradient(形状 范围 at 位置,颜色1,颜色2,...);
background-image: repeating-radial-gradient(形状 范围 at 位置,颜色1,颜色2,...);
background: color url(图片路径) repeat x轴的位置 y轴的位置 / x轴的大小 y轴的大小
当元素从一种样式转变为另一种样式时,使之间的变化平滑过渡
一般情况都是搭配hover来使用的
transition:复合属性
/* 1.设置要过渡的属性 */
transition-property: width,height,background-color;
/* 2.过渡的总时间 */
transition-duration: 1s , 5s , 3s;
/* 3.过渡的速率 ease(默认值) 低速开始 中间加速 结尾低速*/
transition-timing-function: ease;
/* linear 匀速 */
transition-timing-function: linear
/* ease-in 以低速开始 */
transition-timing-function: ease-in
/* ease-out 以低速结束 */
transition-timing-function: ease-out;
/* ease-in-out 以低速开始 以低速结束 中间匀速*/
transition-timing-function: ease-in-out;
/*贝塞尔曲线*/
transition-timing-function: cubic-bezier(.39,-0.99,1,-0.06)
贝塞尔曲线:https://cubic-bezier.com/#.17,.67,.83,.67
/* 设置延迟时间 */
transition-delay:3s
transition: 过渡的属性1 过渡时间 过渡速率 延迟时间,过渡的属性2 过渡时间 过渡速率 延迟时间
transition: all 3s
all 尽量不要使用,开销比较大。
不是所有的属性都能过渡:
场景:二级菜单高度变化
分为了x轴和y轴
x轴:从左到右
y轴:从上到下
CSS3提供的控制元素变化的属性:transform
转换的效果不会影响到其他的元素
transform: translateX(300px);
transform: translateY(-100px);
transform: translate(300px,100px);
transform: rotate(360deg);
transform: rotateX(90deg);
transform: rotateY(135deg);
deg:代表角度
transform: scaleX(2);
transform: scaleY(0.5);
transform: scale(2);
缩放的值是以倍数计算的
transform: skewX(30deg);
transform: skewY(-45deg);
transform: skew(45deg,45deg);
transform-origin:x轴 y轴
英文:left top center right bottom
百分比:50% 50%
px像素:100px 100px
transform: translateX(300px) rotate(90deg) scale(2);
可以同时设置多个转换效果,旋转和拉伸会改变坐标轴的方向,注意书写顺序
css3有哪些新特性:
圆角
盒子阴影
文本阴影
不透明度 :opacity 、rgba
渐变背景 :线性渐变、径向渐变
背景属性:backgroud-size、background-clip(拓展)
结构选择器:first-child()…
伪元素新写法 :before ::before(css3) 为了和:hover之类的伪类选择器作区分
弹性盒子:flex
转换:2D转换、3D转换(拓展)
过渡:一般搭配hover使用
animation动画(拓展)
媒体查询
https://www.bootcss.com/
https://v4.bootcss.com/
利用 Bootstrap 构建快速、响应式的网站
Bootstrap 是全球最受欢迎的前端开源工具库
传统布局方式:
媒体查询
的技术,来适配各种屏幕大小和设备的情况,采用不同的css代码来编写样式。一套html采用 多套css代码来使用,让不同的屏幕尺寸,达到不同的效果。利用@media去适配不同大小的屏幕和设备
设备:
值 | 设备类型 |
---|---|
All | 所有设备,默认值 |
Print | 打印设备 |
Screen | 电脑显示器,彩色屏幕 |
Braille | 盲人用点字法触觉回馈设备 |
Embossed | 盲文打印机 |
Handhelp | 便携设备 |
Projection | 投影设备 |
Speech | 语音或者音频合成器 |
Tv | 电视类型设备 |
Try | 电传打印机或者终端 |
设备尺寸:
值 | 描述 | |
---|---|---|
width | 网页显示区域完全等于设备的宽度 | |
height | 网页显示区域完全等于设备的高度 | |
max-width | 网页显示区域小于等于设备宽度 | |
max-height | 网页显示区域小于等于设备高度 | |
min-width | 网页显示区域大于等于设备的宽度 | |
min-height | 网页显示区域大于等于设备的高度 | |
orientation | portrait (竖屏模式) | landscape (横屏模式) |
语法:
@media screen and (width:1200px){ /* 浏览器宽度等于1200像素时 会作用的样式 */ .box{ background-color: pink; } } @media screen and (max-width:1200px){ */ /* 浏览器宽度小于1200或等于1200像素时 会作用的样式 */ .box{ background-color: pink; } } @media screen and (min-width:1200px){ /* 浏览器宽度大于1200或等于1200像素时 会作用的样式 */ .box{ background-color: pink; } }
编程语言,浏览器就是JavaScript语言的解释器
让程序实现动态效果
1.在<title>后面,css代码前
<script type="text/javascript"> 编写的JavaScript代码</script>
导入:<script src="/static/my.js"></script>
2.在</body>前面的最尾部(推荐)
<script type="text/javascript"> 编写的JavaScript代码</script>
导入:<script src="/static/my.js"></script>
1.html: <!--注释内容 -->
2.css: /*注释内容*/ 只能放在style代码块
3.javascript: 只能放在script代码块
//注释内容
/*注释内容*/
var name="俞琦";
console.log(name)
//声明
var name=" 俞琦":
var name=String("俞琦");
//常见功能
var v1=name.lenth();
var v2=name[0]; name.charAt(3)
var v3=name.trim();去除空白
var v4=name.substring(0,2);前取后不取
<span id="txt">杭州欢迎您的到来</span> <script type="text/javascript"> function show(){ // 1.去html中找到某个标签并获取他的内容 (DOM) var tag = document.getElementById("txt"); var dataString =tag.innerText; console.log(dataString); // 2.动态起来,把文本中的第一个字符放在字符串的最后面 var firstChar =dataString[0]; var otherString =dataString.substring(1,dataString.lenth); var newText= otherString+firstChar; console.log(newText); // 3.在html标签中更新内容 tag.innerText=newText; } //js中的定时器,如:每1s执行一次show函数。 setInterval(show,1000); </script>
//定义 var v1=[11,22,33,44]; var v2=array([11,22,33]); //操作 增 v1[0]="俞琦"; v1.push("俞琦");在尾部追加 v1.unshift("俞琦");头部追加 v1.splice(索引,0,元素); v1.splice(1,0,"俞琦") [11,俞琦,22,33,44] 删 v1.pop() 尾部删除 v1.shift() 头部删除 v1.splice(索引位置,1) v1.splice(2,1) 索引为2的元素删除[11,22,44]; 循环 for(var item in v1){ //item=0/1/2/3 data=v1[item] }循环的是索引 for(var i=0;i<v1.length>;i++){ }
info={
"name":"俞琦",
"age":18
}
info={
name:"俞琦",
age:18
}
info["name"]="哈哈" 对应加引号的key
info.name="哈哈" 对应不加引号的key
循环
for(var key in info){
data=info[key]
}循环的是key
与c一致
function func(){
...
}
func()
DOM和BOM:内置模块
jQuery:第三方模块
1、js的基础概念(js的发展)和基础语法
2、ATM取款机的程序
3、家居网实战:DOM(对页面上html标签、属性、样式的操作)、js事件
4、表单的操作(验证、数据传递)
5、页面样式的修改
6、数据动态渲染
7、BOM(操作浏览器、跳转页面、历史记录、浏览器版本型号判断)
概念:人与计算机沟通的语言,包括了:机器语言、汇编语言、高级语言
常见的高级语言:C、C++、C#、java、php、python、go、javaScript…
一个完整的js的语法是由三部分组成:ECMA核心语法、BOM、DOM
ECMA核心语法:主要包含了输入、输出、变量、数据类型、控制结构、数组、函数等…
浏览器专属:
https://nodejs.org/en
服务器环境,可以单独运行js代码:
需要安装node.js:
运行:
cmd 找到对应的文件目录 node ./文件名.js
借助vscode里面的终端去允许 node ./文件名.js
借助插件运行,code runner 插件 在代码编辑区右键 run code
console.log('hello world')
<script></script>
标签,在这个标签里就可以编写js代码<body>
<!-- html代码 -->
<script>
console.log('hello world')
</script>
</body>
通过script标签在外部引用js文件
console.log('hello world2')
<body>
<!-- html代码 -->
<script src="./js/js基础.js"></script>
</body>
js的三种输出方式
document.write('hello "lol"')
注意:
1.文字内容需要引号来包裹,可以是单引号也可以是双引号。
1.如果引号需要互相嵌套使用,外层是单(双)引号,里面必须双(单)引号,否则相反。
运用:还可以在页面中输出一个标签
document.write('<a href="https://www.baidu.com">百度一下</a>')
console.log('hello world')
alert('hello')
process.stdout.write((i+"*"+j + "=" +i*j + " "))
prompt('提示性文字')
输出输入的内容到页面上
document.write(prompt('提示性文字'))
一个保存数据的容器,方便后续重复使用
var 变量名;
变量名 = 数据;
var 变量名 = 数据;
console.log(变量名)
document.write(变量名)
变量名 = 新的内容
可以包含字母、数字、_、美元符号$
不能以数字开头
名字对大小写敏感(username和userName 是不同的变量)
js的保留关键字不能用作变量名:for、var、if、class、name…
建议的命名方式:语义化命名
加 +
减 -
乘 *
除 /
余(取模) % :得到两数相除的余数
自增 ++
自减 –
=
:把右边的结果赋值给左边的变量+=
-=
*=
/=
%=
==
:判断两个内容是否相等,不考虑数据类型(5==‘5’ true)
===
:全等于,判断两个内容是否相等,要考虑数据类型(5===‘5’ false)
<
:判断前面的值是否小于后面的值
<=
:判断前面的值是否小于等于后面的值
>
:判断前面的值是否大于后面的值
>=
:判断前面的值是否大于等于后面的值
!=
:判断两个内容是否不等于,如果不等于返回true,等于false
!==
:不全等于,考虑数据类型
var a = 5 var b = '5' var c = 6 var d = 5 console.log( a == b ) //true console.log( a === b ) //false console.log( a < c ) //true console.log( a > c ) //false console.log( a <= c ) //true console.log( a >= c ) //false console.log(a != c) //true console.log(a !== d) //false console.log(a !== b) //true
&&
:与运算,并且的意思,既要满足前面的条件又要满足后面的条件,才会返回true,只要有一个条件不满足就会返回falsevar num = 5
console.log(num >= 5 && num == 5 && num <= 5 && num === 5) //true
console.log(num >= 5 && num === '5') //false
短路运算:
||
:或运算,或者的意思,只要满足条件中的任意一个即可,就会返回true,每个条件都不满足才会返回falseconsole.log( num > 5 || num == 5) //true
console.log( num > 5 || num < 5 ) //false
短路运算:
if(条件){
//满足条件要执行的代码
}
var age = 18;
if(age >= 18){
console.log('已成年,可以蹦迪了')
}
if(条件){
//满足条件要执行的代码
}else{
//不满足条件要执行的代码
}
var age = 16;
if(age >= 18){
console.log('已成年,可以蹦迪了')
}else{
console.log('未成年,回家吧')
}
// 6岁 上小学 12岁 上初中 15岁 上高中 18岁 蹦迪
var age = 20;
if(age >= 6 && age < 12){
console.log('上小学')
}else if(age >= 12 && age < 15 ){
console.log('上初中')
}else if(age >= 15 && age < 18){
console.log('上高中')
}else if(age >= 18){
console.log('蹦迪')
}else{
console.log('上幼儿园')
}
// 输入今天星期几数字 提示今天星期几 var num = prompt('提示今天星期几') console.log(num) switch(num){ case '1': console.log('今天星期1') break; case '2': console.log('今天星期2') break; case '3': console.log('今天星期3') break; case '4': console.log('今天星期4') break; case '5': console.log('今天星期5') break; case '6': console.log('今天星期6') break; case '7': console.log('今天星期7') break; default: console.log('输入有误,再见') break; }
该分支只能用于判断固定选项,如果条件是一个范围switch不适用
break:用于阻断代码继续向下执行
while(循环继续的条件){
当条件为true时,会执行的代码
}
var num = 1000
while(num > 0){
//满足上面条件会执行的代码
console.log(num) //输出1000 - 1 之间所有的数字
num = num - 1
}
和while的区别:会先执行一次do里面的代码
do{
会先执行一次的代码,满足条件会再次循环执行
}while(循环继续的条件)
var num = 5
do{
console.log(num)
num = num - 1
}while(num > 0)
// for('循环的初始条件';'决定是否循环的条件';'循环的次数操作'){
// //循环的主体代码
// console.log(1)
// }
for(var i = 1; i <= 5 ; i = i + 1){
//循环的主体代码
console.log(i,1)
}
break:跳出整个循环,循环不再继续向下执行
continue:跳出当前这一次循环的后续代码,但是会继续执行后续的循环
for(var i = 1 ; i <= 5 ; i++){
console.log(i) // 1 , 2 , 3
if(i == 3){
break; //不再继续循环下去
}
}
for(var i = 1 ; i <= 5 ; i++){
if(i == 3){
continue //跳出这一次的循环主体代码,然后会继续下一次循环
}
console.log(i) // 1, 2, 4, 5
}
1.求1-100所有数字的和
2.找出1-100之间的偶数和奇数
3.找出100-999以内的水仙花数,特点:水仙花数是一种特殊的三位数,它的特点就是,每个数位的立方和,等于它本身。
4.鸡兔同笼:一共有20个头,64只脚,请问有几只鸡,几只脚 【讲】
5.小球落体问题:小球从初始100m高的地方下落,每次从地面弹起的高度为下落高度的一半,求第十次弹起的高度和第十次落地的总路程【拓展】
6.找到1-100之间的所有质数 质数:只能被1和自身整除的数字【拓展】
7.控制台输出99乘法表【讲】
8.1 2 3 4 能组成哪些不重复的三位数,总共有多少个?【拓展】
function sum1_to_100(){ var num=1; var sum = 0; while (num<100){ sum += num; num ++; } return sum; } function find_odd_even(number){ var num = 1; odd= Array(); even = Array(); while (num<number){ if(num%2 === 0 ){ even[even.length] = num; }else{ odd[even.length] = num; } num++; } return {odd,even} } function water_flower(){ flower_array = Array(); for(var i=100;i<=999;i++){ var ge = i % 10; var shi = (parseInt(i / 10)) % 10; var bai = parseInt(i / 100) ; if( Math.pow(ge,3)+ Math.pow(shi,3)+ Math.pow(bai,3) === i){ flower_array[flower_array.length] = i; } } return flower_array; } function chicken_rabbit(){ var foot = 64; var chicken=0; while(true){ if (chicken*2 + (20-chicken)*4 === 64){ return chicken; }else{ chicken ++ ; } } } function ball(){ var height = 100; var sum = 0; for (var i=1;i<11;i++){ sum = sum + height + height/2 height /=2 } return {height,sum} } function prime_number(){ prime = Array() for(var i = 1;i<=100;i++){ flag = false; for (var j = 2;j<i;j++){ if (i%j === 0 ){ flag = true; } } if(!flag){ prime[prime.length] = i; } } return prime } function nine_plus_nine(){ for (var i= 1;i<10;i++){ for(var j = 1;j<=i;j++){ process.stdout.write((i+"*"+j + "=" +i*j + " ")) } console.log("\n") } } function no_repeat(){ var sum = 0 for (var i =1 ;i <5;i++){ for (var j =1 ;j <5;j++){ for (var k =1 ;k <5;k++){ if(i!=j && i !=k && j!=k){ sum ++; } } } } return sum; } console.log(ball())
所有用引号包裹的都是字符串类型
var str = 'hello'
var str = '123';
var str = "";
转义符:
var str = '我叫"提莫"';
var str = "我叫\"提莫\"";
var str = "我叫\\提莫\\";
var str = "我叫\\\\提莫\\\\";
换行符:
var str = "我叫\n提莫"
字符串拼接: +
var str1 = "hello";
var str2 = "world"
console.log(str1 + ' ' + str2)
注意:如果一个数字和字符串相加,会得到另一个字符串
var num = 10
var num = 10.1 //浮点数
var num = 1.23e5 // eX 10的X次方
console.log(0.3-0.2 == 0.2-0.1) //false
var num = -12345e1000 //-Infinity无穷小 Infinity无穷大
只有两个值 :true false
var boo = true
var boo = false
只有一个值 undefined,声明了一个变量,没有赋值会得到一个undefined
var str;
var str = undefined;
只有一个值,就是null ,一般表示为空
var str = null;
console.log(null == undefined) //true
console.log(null === undefined) //false
typeof "123" //string
typeof 123 //number
typeof true //number
typeof undefined //undefined
typeof null //object
var obj = {}
console.log(obj, typeof obj) //object
var arr = []
console.log(arr, typeof arr) //object
var func = function(){}
console.dir(func, typeof func) //function prototype——object
通过一些方法(函数),强制让数据类型变化
var str = num.toString()
// console.log(window)
// window.String()
var str = String(num)
console.log(str ,typeof str)
区别:
toString()
这个方不能转换null
和undefined
String()
可以转换任意类型为字符串
// var str = '10.1' 10.1 10 10.1
// var str = '10.1a' NaN 10 10.1
var str = 'a10.1' // NaN NaN NaN
console.log(Number(str));
console.log(parseInt(str));
console.log(parseFloat(str));
NaN:not a number
var num = 1 //true
var num = 0 //false
var str = 'abc' //true
var str = '' //false
var a = undefined //false
var a = null //false
var a = -0 //false
var a = false
var a = true
var boo = Boolean(num)
var boo = Boolean(str)
var boo = Boolean(a)
除了 0、-0、“”、undefined、false、null、NaN ,这7种转布尔值都是false; 除了这7种以外转成布尔值 都是 true。
通过运算符和其他的方式,隐式转换
// var num = 10
// var boo = true
// boo = boo + ""
var boo = null
boo = boo + ""
// console.log(typeof (num + "") ) //string
// console.log(typeof boo, boo) //string
console.log(typeof boo, boo) //string
+
号,拼接了一个空的字符串,那都会转成字符串类型// var str = '10a'
// var str = undefined
console.log(str - 0)
console.log(str * 1)
console.log(str / 1)
console.log( ~~str ) //具体转为多少不知道
console.log( +str )
console.log( parseInt(str) )
取反:!,任意类型要取反时 都会转成布尔值再去取反
var num = 0
!num // true
!!num // false
var str = ""
!str //true
!!str //false
数组,是一些有序数据的集合,即数组能保存多个数据,并且保持一定的顺序
var arr = new Array(数据1,数据2,数据3,...)
var arr = [数据1,数据2,数据3,...]
var arr = [1,'2',true,undefined,null,NaN,[1,2,3]]
console.log(arr.length) //7
console.log(arr[1]) // '2'
console.log(arr[arr.length-1][0]) // [1,2,3]--->1
查询数组中没有的数据时,会返回undefined
var arr = [1,'2',true,undefined,null,NaN,[1,2,3]]
arr[arr.length] = 'hello'
console.log(arr) //[1,'2',true,undefined,null,NaN,[1,2,3],'hello']
var arr = [1,'2',true,undefined,null,NaN,[1,2,3]]
arr[0] = 9
arr[arr.length-1] = 'ABC'
console.log(arr[0]) //9
console.log(arr[arr.length-1]) //'ABC'
var arr = [1,'2',true,undefined,null,NaN,[1,2,3]]
arr.length = arr.length - 1
arr.length--
--arr.length
delete arr[0] //删除对应下表的数据
console.log(arr[0]) //undefined
console.log(arr) //[空白,'2',true,undefined]
var arr = [3,4,7,9,0,1,2,5,6,8]
for(var i = 0; i < arr.length;i++){
//console.log(arr[i])
//的到为7的数字
if(arr[i] == 7){
console.log(i , arr[i]);
break;
}
}
var arr = [[1,2,3],[4,5],[6]]
var arr = [[1,2,3],[4,5],[6]]
for(var i = 0; i < arr.length ; i++){
// console.log(arr[i])
for(var j = 0; j < arr[i].length; j++){
console.log(arr[i][j])
}
}
每一个api就是一个函数(方法),是由程序内部提供的,每一个api就对应了一个功能:alert()、parseInt()、toString()…
方 法 | 语 法 | 说 明 | 改变原数组 | 返回值 | js版本 |
---|---|---|---|---|---|
push() | array.push(item1, item2, ..., itemX) | 向数组末尾添加新元素 | true | array.length | ECMAScript 1 |
unshift() | array.unshift(item1, item2, ..., itemX) | 向数组开头添加新元素 | true | array.length | ECMAScript 1 |
pop() | array.pop() | 删除数组的最后一个元素 | true | 删除的元素 | ECMAScript 1 |
shift() | array.shift() | 删除数组的第一个元素 | true | 删除的元素 | ECMAScript 1 |
splice() | array.splice(开始下标(包含), 删除元素的个数, 新增元素1, ....., 新增元素n) | 1.只有一个参数会将指定下标元素和之后的元素删除; 2.有两个参数时可以删除指定位置的元素 3.多个参数时可以修改任意位置的元素 | true | 删除的元素 | ECMAScript 1 |
案例:
var arr = ['提莫','亚索','德玛西亚','贾克斯','男枪'] //向数组的最后一位添加一个英雄名字 arr.push('女枪') //向数组的开头添加一个数据 arr.unshift('艾瑞莉娅') //push和unshift的返回值都是改变后的数组长度 //删除数组中最后一条数据 arr.pop() //删除数组中第一条数据 arr.shift() //pop和shift的返回都是被删除的具体数据 //1.删除、新增、修改数组中的数据 // arr.splice(2,2) // arr.splice(1) // arr.splice(2,2,'伊泽瑞尔','光辉') // arr.splice(2,0,'伊泽瑞尔','光辉') for(var i = 0 ;i<arr.length;i++){ if(arr[i] == '德玛西亚'){ arr.splice(i,1) } } // console.log(res) console.log(arr)
方 法 | 语 法 | 说 明 | 改变原数组 | 返回值 | js版本 |
---|---|---|---|---|---|
indexOf() | array.indexOf(item) | 查询元素在数组中第一次出现的下标 | false | index(下标)、没找到返回-1 | ECMAScript 5 |
lastIndexOf() | array.lastIndexOf(item) | 查询元素在数组中最后一次出现的下标 | false | index(下标) 、没找到返回-1 | ECMAScript 5 |
includes() | array.includes(element) | 查询元素在数组中是否存在 | false | true/false | ECMAScript 7 |
var arr = ['提莫','亚索','德玛西亚','贾克斯','男枪','德玛西亚']
var res1 = arr.indexOf('德玛西亚') // 2
var res = arr.indexOf('皇子') // -1
var res2 = arr.lastIndexOf('德玛西亚') // 5
var res = arr.includes('皇子') //false
方 法 | 语 法 | 说 明 | 改变原数组 | 返回值 | js版本 |
---|---|---|---|---|---|
reverse() | array.reverse() | 反转数组中元素的顺序 | true | 反转后的数组 | ECMAScript 1 |
sort() | array.sort() | array.sort(function(a, b){return a-b}) | array.sort(function(a, b){return b-a}) | 1.适用于全小写或全大写的字母排序 2. a - b 从小到大排序 3. b - a 从大到小排序 | true |
练习:
var arr = [12,33,28,99,45,50]
1.数组中找最大值和最小值; for循环
2.数组的倒叙输出; for循环
3.数组的拼接; var arr1 = [3,4,5] var arr2 = [7,8,9] newArr
4.找数组中重复的值; for循环
5.数组的排序; for循环 冒泡排序 选择排序
https://www.runoob.com/w3cnote/selection-sort.html
方 法 | 语 法 | 说 明 | 改变原数组 | 返回值 | js版本 |
---|---|---|---|---|---|
for循环 | for(var i = 0; i < array.length; i++) {console.log(arr[i]);} | / | |||
for of | for (var item of array) {console.log(item);} | 其中 item 是数组中的每一个元素,arr 是要遍历的数组名。 | false | / | ECMAScript 6 |
forEach() | array.forEach(function (item, index) {console.log(item,index);}) | 其中 item 是数组中的每一个元素名,index 是对应元素的下标。 | false | undefined | ECMAScript 5 |
map() | array.forEach(function (item, index) {console.log(item,index); return item}) | 其中 item 是数组中的每一个元素名,index 是对应元素的下标。返回一个长度一致的新数组 | false | new array | ECMAScript 5 |
filter() | array.filter(function (item, index) {console.log(item,index); return 筛选条件}) | 其中 item 是数组中的每一个元素名,index 是对应元素的下标。返回一个筛选过后的新数组 | false | new array | ECMAScript 5 |
every() | array.every(function (item, index) {console.log(item,index); return 判断条件}) | 其中 item 是数组中的每一个元素名,index 是对应元素的下标。根据判断条件返回真假,一假则假 | false | boolean | ECMAScript 5 |
some() | array.some(function (item, index) {console.log(item,index); return 判断条件}) | 其中 item 是数组中的每一个元素名,index 是对应元素的下标。根据判断条件返回真假,一真则真 | false | boolean | ECMAScript 5 |
find() | array.find(function(item, index){console.log(item,index); return 判断条件}}) | 其中 item 是数组中的每一个元素名,index 是对应元素的下标。根据判断条件返回第一个满足条件的item | false | 返回第一个满足条件的item,没有符合的返回 undefined | ECMAScript 6 |
reduce() | array.reduce(function(total, item, index), 初始值) | 其中 item 是数组中的每一个元素名,index 是对应元素的下标。total 为初始值或先前返回的值 | false | 遍历完最后一次的返回结果 | ECMAScript 5 |
方 法 | 语 法 | 说 明 | 改变原数组 | 返回值 | js版本 |
---|---|---|---|---|---|
concat() | array1.concat(array2, array3, ..., arrayX) | 方法用于拼接两个或多个数组。 | false | 合并后的新数组 | ECMAScript 1 |
slice() | array.slice(开始下标(包含), 结束下标(不包含)) | 根据对应下标(可以是负数),截取数组中的某一个部分 | false | 截取后的新数组 | ECMAScript 1 |
//1. 拼接数组 var arr1 = [1,2,3,4]; var arr2 = [5,6,7,8]; var arr3 = [9,0]; var newArr = arr1.concat(arr2,arr3,); //扩展运算符 浅拷贝 ES6新增 var newArr = [...arr1,...arr2,...arr3]; //2.数组的截取 var arr = [1,2,3,4,5,6,7,8,9] var newArr = arr.slice(0,3) var newArr2 = arr.slice(3,arr.length) console.log(newArr) console.log(newArr2)
方 法 | 语 法 | 说 明 | 改变原数组 | 返回值 | js版本 |
---|---|---|---|---|---|
join() | array.join(分隔符(默认逗号)) | 将数组里的元素按照指定字符拼接成一个字符串 | false | string | ECMAScript 1 |
//3.数组转字符串
// var str = arr.toString() //1,2,3,4,5
// var str = String(arr) //1,2,3,4,5
var str = arr.join('') //12345
console.log(str)
var arr = [1,2,3,4,5,6,7,8,9]
//var arr = 1234
// typeof arr //object
var res = Array.isArray(arr)
console.log(res) //true
作用:
function 函数名(){
}
函数名()
var 变量 = function(){
}
变量()
最顶部
,声明了这个函数,这个函数可以在当前作用域
的任意位置调用最顶部
,并且赋给这个变量为undefined
,这种情况在函数表达式之前去调用函数时就会报错,not a function
不是一个函数对数据进行传递,外部的数据可以传递个给函数内部。
作用:当创建一个函数后,希望里面的某些数据是动态变化的。这个时候就可以利用函数的参数来解决。
语法:
function 函数名(形参1,形参1,形参1,...){
console.log(形参1,形参1,形参1)
}
函数名(实参1,实参2,实参3,...)
注意:
1. 从语法上来讲,函数的参数数量可以不一致
1. 函数的参数可以是任意类型的数据
在函数外部使用函数内部的数据时,可以通过return
关键字将数据返回出来
var s = sum(2,5)
function sum(num1,num2){
var total = num1 + num2
return total
}
console.log(s)
注意:
function func(){
console.log(arguments)
}
arguments是一个类数组对象,你传进来的所有参数都会被这个arguments所接收。
当一个函数创建成功时,该函数就会把函数的内部和外部分为两个区域,就是分为了两个作用域:
函数外部:全局作用域,变量在任意位置都可以使用,包括另一个局部作用域里
函数内部:局部作用域(函数作用域),内部的变量只能在这个作用域内部使用
=>
取代了function
关键字箭头函数的声明:函数表达式的方式来声明
var func = (str) => {
console.log('hello ' + str)
}
var func = str => {
console.log('hello ' + str)
}
var func = str => console.log('hello ' + str)
var func = str => 'hello ' + str //省略掉了return
func() //'hello ' + str
var obj = {
func1:function(){
console.log(this)
},
func2:()=>{
console.log(this)
}
}
obj.func1() //obj这个对象
obj.func2() //obj的作用域——>全局对象
数组:储存简单数据的,只能通过遍历和下表查找,再复杂的数据操作就会比较麻烦。[ ]
对象:可以储存相对复杂的数据,{}
对象中每一条数据都有自己的名字,称为 键
,数据本身称为值
,在对象中保存的数据都是以键值对
的方式来保存的,对象中的数据时无序的。
//字面量法
var student = {
'name': 'kunkun',
'age': 18,
gender: 'man'
}
console.log(student)
//构造函数法
var obj = new Object()
obj.name = 'lisi'
console.log(obj)
var stu = {
键1:值1,
键2:值2,
键3:值3,
...
}
注意:
var student = {
'name': 'kunkun',
'age': 18,
gender: 'man',
hobby:['唱','跳','rap','ball'],
isTrue:true,
}
var student = { 'name': 'kunkun', 'age': 18, gender: 'man', hobby:['唱','跳','rap','ball'], isTrue:true, } //点运算 //访问对象数据 console.log(student.name) // console.log(student.age) //修改对象数据 student.age = 25 // console.log(student) //新增 student.id = 1 // console.log(student) //删除 delete student.isTrue console.log(student)
[]
去访问对象基础语法:
student['键名']
通常来说,如果访问的键名是一个变量来保存的,这时候才使用[]
var str = 'name'
student[str]
//通过变量去设置键名
var str2 = 'sex'
var student2 = {
'name': 'kunkun',
'age': 18,
[str2]: 'man',
hobby:['唱','跳','rap','ball'],
isTrue:true,
}
console.log(student2)
因为对象中可以保存任意数据类型,所以也可以是一个函数,我们就可以根据数据是不是函数来决定,数据的分类:
var student = { 'name': 'kunkun', 'age': 18, gender: 'man', hobby:['唱','跳','rap','ball'], isTrue:true, study:function(){ console.log('来凡云上网课') }, sleep:function(str){ console.log( str + '睡') } } student.study() student.sleep('上班')
for in
for(var key in student){
// console.log(key)
console.log(student[key])
}
Object.keys()
Object.keys(student).forEach(function(key){
console.log(key,student[key])
})
var stuName = 'kunkun'
var age = 18
var gender = 'man'
var student = {
stuName,
age,
gender,
hobby:['唱','跳','rap','ball'],
isTrue:true,
}
console.log(student)
var student = {
study(){
console.log('来凡云上网课')
},
sleep(str){
console.log( str + '睡')
}
}
student.study()
student.sleep('放学')
this是存在于函数中的动态指针,指代当前调用的对象,this的目的是在函数内部指代这个函数的运行环境
特殊:箭头函数没有this,如果非得在箭头函数中使用this,这个this指向所在父级的作用域上,就指向window
JS中万物皆对象。
window对象
。属性 | 描述 |
---|---|
length | 设置或返回数组元素的个数。 |
方法 | 描述 |
---|---|
concat() | 连接两个或更多的数组,并返回结果。 |
every() | 检测数值元素的每个元素是否都符合条件。 |
filter() | 检测数值元素,并返回符合条件所有元素的数组。 |
find() | 返回符合传入测试(函数)条件的数组元素。 |
findIndex() | 返回符合传入测试(函数)条件的数组元素索引。 |
forEach() | 数组每个元素都执行一次回调函数。 |
includes() | 判断一个数组是否包含一个指定的值。 |
indexOf() | 搜索数组中的元素,并返回它所在的位置。 |
isArray() | 判断对象是否为数组。 |
join() | 把数组的所有元素放入一个字符串。 |
keys() | 返回数组的可迭代对象,包含原始数组的键(key)。 |
map() | 通过指定函数处理数组的每个元素,并返回处理后的数组。 |
pop() | 删除数组的最后一个元素并返回删除的元素。 |
push() | 向数组的末尾添加一个或更多元素,并返回新的长度。 |
reduce() | 将数组元素计算为一个值(从左到右)。 |
reverse() | 反转数组的元素顺序。 |
shift() | 删除并返回数组的第一个元素。 |
slice() | 选取数组的一部分,并返回一个新数组。 |
some() | 检测数组元素中是否有元素符合指定条件。 |
sort() | 对数组的元素进行排序。 |
splice() | 从数组中添加或删除元素。 |
toString() | 把数组转换为字符串,并返回结果。 |
unshift() | 向数组的开头添加一个或更多元素,并返回新的长度。 |
javascript的核心内容:
在DOM中提供了很多属性
和方法
来操作html标签、style样式、标签上的属性等…
通过dom来操作html中的所有节点:增、删、查、改
在DOM中,节点包含了:html标签、标签上的属性、标签包裹的文本…node节点
属性名 | 说明 |
---|---|
body | 获取body标签节点 |
title | 获取title标签里的文本节点 |
URL | 获取URL地址 |
documentElement | 获取html标签节点 |
获取html标签节点的方法
方法名 | 语法 | 说明 | 返回值 |
---|---|---|---|
getElementById() | document.getElementById(id名) | 通过 id 获取元素 | 元素节点 |
getElementsByClassName() | document.getElementsByClassName(class名) | 通过 class 获取元素 | 数组(元素节点) |
getElementsByTagName() | document.getElementsByTagName(标签名) | 通过标签名获取元素 | 数组(元素节点) |
querySelector() | document.querySelector(css选择器) | 通过 CSS 选择器获取到第一个匹配的元素 | 元素节点 |
querySelectorAll() | document.querySelectorAll(css选择器) | 通过 CSS 选择器获取到所有匹配的元素 | 数组(元素节点) |
createElement() | document.createElement(标签名) | 创建html节点 | 元素节点 |
createTextNode() | document.createTextNode(标签名) | 创建文本节点 | 文本节点 |
write() | document.write(字符串) | 向页面输出内容,可以是一个html节点 | undefined |
属性名 | 说明 |
---|---|
parentElement | 获取父节点 |
firstElementChild | 获取第一个子节点 |
lastElementChild | 获取最后一个子节点 |
children | 获取所有的子节点 |
previousElementSibling | 获取前一个兄弟节点 |
nextElementSibling | 获取后一个兄弟节点 |
属性名 | 说明 |
---|---|
innerText | 获取、新增、修改、删除(修改为空)指定标签里的文本节点 |
innerHTML | 获取、新增、修改、删除(修改为空)指定标签里的标签及文本节点 |
value | 获取、新增、修改、删除(修改为空)指定表单元素里的value值 |
属性名 | 说明 |
---|---|
className | 获取、新增、修改、删除(修改为空)指定元素的class属性 |
style | 获取、新增、修改、删除(修改为空)指定元素的style样式属性 |
标签属性名 | 获取、新增、修改、删除(修改为空)指定元素的属性节点:href、src、title、id、type.... |
checked | 获取、修改 input选框 是否选中 |
属性名 | 说明 |
---|---|
clientWidth、clientHeight | 盒子元素的宽高——只包含内边距和内容区 |
offsetWidth 、offsetHeight | 盒子元素的宽高——包含内边距、内容区、边框 |
offsetLeft、offsetTop | 盒子距离整个html的左边和上边的间距 |
clientLeft、clientTop | 盒子边框的宽度 |
方法名 | 说明 |
---|---|
父节点.appendChild(子节点) | 向父节点的最后添加新节点 |
父节点.insertBefore(新节点,旧节点) | 向父节点中的某一个旧节点前添加新节点 |
父节点.removeChild(指定节点) | 从父节点中删除一个指定节点 |
方法名 | 语法 | 说明 |
---|---|---|
append() | 节点.append(子节点) | 往指定父节点的末尾 添加一个子节点 |
prepend() | 节点.prepend(子节点) | 往指定父节点的开头 添加一个子节点 |
before() | 节点.before(兄弟节点) | 往指定节点的前面添加一个兄弟节点 |
after() | 节点.after(兄弟节点) | 往指定节点的后面添加一个兄弟节点 |
remove() | 节点.remove() | 删除该节点 |
replaceWith() | 节点.replaceWith(新节点) | 用新节点替换指定的节点 |
方法 | 说明 |
---|---|
节点对象.getAttribute(属性名) | 获取元素的指定属性的值 |
节点对象.setAttribute(属性名,属性值) | 设置元素一个属性和属性值 |
节点对象.removeAttribute(属性名) | 移出元素上的一个指定属性 |
节点对象.hasAttribute(属性名) | 判断元素有没有该指定属性,返回布尔值 |
事件是指用户与页面之间交互做出的一系列反应,比如:点击元素、鼠标移入移出、滚轮滑动…
DOM中的事件,指的是给元素设置事件的监听。因为事件其实是一直存在的,只是后续没有监听和其他的操作。
其实添加事件监听的意思就是,监听用户做出的动作,然后对这个动作设置一些反应。
例如:
var btn = document.getElementById('btn')
btn.onclick = function(){
console.log('btn被点击了')
}
上述的function不需要手动去设置调用,当浏览器检测到用户点击了这个按钮时,就会触发这个函数,执行函数里的代码
—— 事件处理程序
<button id="btn" onclick="console.log('按钮被点击了')">按钮</button>
<button id="btn" onclick="clickBtn()">按钮</button>
function clickBtn(){
console.log('按钮被点击了')
}
缺点:html和js 代码没有分离,造成后期维护困难
var btn = document.getElementById('btn')
btn.onclick = function(){
console.log('按钮被点击了1')
}
优点:html、js代码分离;兼容好ie全系兼容
缺点:没有办法绑定多个相同事件的监听
var btn = document.getElementById('btn')
btn.addEventListener('click',function(){
console.log('按钮被点击了1')
})
btn.addEventListener('click',function(){
console.log('按钮被点击了2')
})
优点:可以绑定多个相同时间监听,触发多个事件函数
缺点:ie8以下不兼容
btn.onclick = null
var clickBtn = function(){
console.log('按钮被点击了2')
}
btn.addEventListener('click',clickBtn)
btn.removeEventListener('click',clickBtn)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <button id="sub">- </button> <input id="num_input" value="0"></input> <button id="add">+ </button> <script> var sub = document.getElementById('sub') var num_input = document.getElementById('num_input') var add = document.getElementById('add') // DOM0 // sub.onclick = function(){ // num_input.value = Number(num_input.value)-1 // } // add.onclick = function(){ // num_input.value = Number(num_input.value)+1 // } //DOM2 sub.addEventListener('click',function(){ num_input.value--}) add.addEventListener('click',function(){ num_input.value++}) </script> </body> </html>
事件类型 | 说明 |
---|---|
load | 当页面html标签全部加载完毕之后才去执行事件监听里面的代码 |
window.onload = function(){
console.log(123)
}
事件类型 | 说明 |
---|---|
click | 鼠标单击事件 |
dblclick | 鼠标双击事件 |
mousedown | 鼠标按下时 |
mouseup | 鼠标松开时 |
mouseenter | 鼠标移入 |
mouseleave | 鼠标移出 |
mousemove | 鼠标移动 |
事件类型 | 说明 |
---|---|
keydown | 键盘中某个键被按下了 |
keyup | 键盘中某个键被按松开了 |
keypress | 键盘中某个键被按住了,按住后会一直触发 |
事件类型 | 说明 |
---|---|
focus | 输入框获取到焦点的时候 |
blur | 输入框失去焦点时 |
change | 表单元素只要内容发生改变就可以触发事件 |
input | 输入框内容在输入时会触发 |
指的是事件的流向,分为了两种主要的事件流向:冒泡流、捕获流
事件会进行传递:从最具体的元素(div),一直向上进行冒泡传递,传递没有那么具体的元素(window),例如:
<!DOCTYPE html>
<html>
<head>
<title>事件流</title>
</head>
<body>
<div id="outer">
<div id="inner"></div>
</div>
</body>
</html>
从inner开始 ——》outer——》body——》html——》document——》window
从没有那么具体的元素(window),依次传递到具体的元素上(div)
DOM2event 规范提出,事件流包含了3个阶段:捕获、目标阶段、冒泡
事件捕获是最先发生,然后实际触发事件的元素才执行(目标阶段),最后此案时冒泡阶段
inner.addEventListener('click',function(){ console.log('inner被点击了') },true) outer.addEventListener('click',function(){ console.log('outer被点击了') },true) document.body.addEventListener('click',function(){ console.log('body被点击了') },true) document.documentElement.addEventListener('click',function(){ console.log('html被点击了') },true) document.addEventListener('click',function(){ console.log('doc被点击了') },true) window.addEventListener('click',function(){ console.log('win被点击了') },true)
true:代表目标执行在捕获阶段执行的。(捕获)
false:代表目标执行在冒泡阶段执行的。(冒泡)
inner.addEventListener('click',function(){
// console.log('inner被点击了')
// console.log(this) //inner节点对象
this.style.backgroundColor = 'blue'
})
属性名 | 说明 |
---|---|
pageX、pageY | 获取鼠标相对于页面的位置 |
clientX、clientY | 获取鼠标相对于视口的位置 |
offsetX、offsetY | 获取鼠标相对于实际触发事件元素(event.targer)的位置(不包含边框) |
keyCode | 获取键盘的对应的按键码 |
target | 获取用户操作的节点(实际触发事件的元素) |
方法 | 说明 |
---|---|
stopPropagation() | 阻止事件流的传播 |
preventDefault() | 阻止事件的默认行为 |
<a id="link" href="https://www.baidu.com">百度一下</a> <script> var link = document.getElementById('link') link.addEventListener('click',function(event){ //阻止事件的默认行为 event.preventDefault() console.log(link.href) }) </script> <div id="outer"> <div id="inner"></div> </div> <script> var inner = document.getElementById('inner'); var outer = document.getElementById('outer'); inner.onclick = function(event){ console.log('inner被点击了') // event.stopPropagation(); } outer.onclick = function(){ console.log('outer被点击了') } document.body.onclick = function(){ console.log('body被点击了') //阻止事件流的传播 event.stopPropagation(); } document.documentElement.onclick = function(){ console.log('html被点击了') } </script>
利用了事件冒泡的特点,将事件绑定委托给所有要触发事件的节点的父节点。将事件绑定在父节点上
<ul id="hobby"> <li> <button id="sing">我要唱歌</button> </li> <li> <button id="dance">我要跳舞</button> </li> <li> <button id="rap">我要rap</button> </li> <li> <button id="ball">我要篮球</button> </li> </ul> <script> //事件委托 var hobby = document.getElementById('hobby') hobby.addEventListener('click',function(event){ console.log(event.target.id,event.target.innerText) switch(event.target.id){ case 'sing': console.log(event.target.innerText) break } }) </script>
应用场景:
多个同样类型的元素
上时,就可以使用事件委托,委托给它们的父元素动态渲染的元素
上时,就可以使用事件委托,委托给它们的已存在的父元素我们一般用这则对象来定义一个规则,可以用来对 字符串进行查找、验证、替换等操作
js通常用正则来进行表单验证
var reg = /规则/修饰符
var reg = new RegExp('规则','修饰符')
在正则中:规则是必须有的,修饰符是可选的
案例:
var reg = /a/; //某一个字符串中必须包含小写字母a
test()
方法名 | 参数 | 说明 | 返回值 |
---|---|---|---|
test(字符串) | 字符串 | 判断字符串是否匹配正则表达式 | 布尔值 |
var reg = /a/; //某一个字符串中必须包含小写字母a
var str1 = 'hello world'
var str2 = 'halo world'
var res1 = reg.test(str1)
var res2 = reg.test(str2)
console.log(res1) //false
console.log(res2) //true
[]
包含中括号中的任意一个字符即可表达式 | 说明 |
---|---|
/[abc]/ | 包含a、b、c任意一个字母即可 |
/[0-9]/ | 包含任意数字 |
/[a-z]/ | 包含小写 a - z 之间的任意小写字母 |
/[A-Z]/ | 包含大写 A - Z 之间的任意大写字母 |
/[a-zA-Z]/ | 包含任意大小写字母 |
/[a-zA-Z0-9]/ | 包含任意一个大小写字母或数字 |
/[0-9][0-9][0-9][0-9][0-9]/ | 连续匹配5个数字 |
/[^abc]/ | 包含除了a、b、c 中以外的其他任意字符(取反) |
元字符 | 说明 |
---|---|
/\w/ | 包含数字、字母、下划线中的任意字符。等同于 /[0-9a-zA-Z_]/ 。 |
/\W/ | 包含除了数字、字母、下划线以外的其他任意字符。等同于 /[^0-9a-zA-Z_]/ 。 |
/\d/ | 包含任意数字。等同于/[0-9]/ 。 |
/\D/ | 包含除了数字以外的其他任意字符。等同于 /[^0-9]/ 。 |
/\s/ | 包含空白字符(空格)。 |
/\S/ | 包含除了空白字符以外的其他字符。 |
量词 | 说明 |
---|---|
/n+/ | 至少包含一个指定字符, n >= 1 |
/n*/ | 指定字符可有可无, n >= 0 |
/n?/ | 指定字符出现0次或1次 ,n=0 || n=1 |
/n{x}/ | 指定字符连续出现x次 ,n = x |
/n{x,}/ | 至少连续出现x次,n >= x |
/n{x,y}/ | 至少连续出现x次,最多y次 n >= x && n <= y |
当有了开始和结束符号的时候,我们的正则表达式才有了真正的意义
符号 | 说明 |
---|---|
^n | ^[0-9] |
n$ | 表示以指定字符为结尾 |
符号 | 说明 |
---|---|
. | 大体上可以将 . 看作是通配符(实际上不能匹配一些特殊符号,例如换行符 \n 、回车符、制表符等)。 |
` | ` |
() | 对规则进行分组 |
\ | 转义符d |
示例代码:
var regExp = /^(a|b)$/;
console.log(regExp.test('a'))
修饰符 | 说明 |
---|---|
i | 不区分大小写。 |
g | 对所有字符串进行匹配(而非在找到第一个匹配后停止)。 |
m | 多行匹配(即在到达一行文本末位时还会继续查找下一行)。 |
示例代码:
var regExp = /^[a-z]{6,10}$/i;
console.log(regExp.test('ABCDEFG')); // true
https://c.runoob.com/front-end/854/
https://any86.github.io/any-rule/
浏览器对象模型
属性名 | 说明 |
---|---|
innerWidth/innerHeight | 浏览器视口(文档)宽高 |
outerWidth/outerHeight | 整个浏览器外边框的宽高 |
screenLeft/screenTop | 浏览器距离屏幕左边和上边的间距 |
方法名 | 说明 |
---|---|
alert() | 打开一个警告弹框 |
prompt() | 打开一个可输入的弹框 |
open() | 跳转页面、默认就是打开新窗口、通过第二个参数可以控制打开方式 |
属性 | 说明 |
---|---|
href | 获取到浏览器地址栏里的路径,对这个href重新赋值可以达到跳转页面的效果 |
search | 获取url地址栏? 后面的数据的 |
方法 | 说明 |
---|---|
assign() | 跳转页面的方法,保留历史记录 |
replace() | 跳转页面的方法,不保留历史记录 |
reload() | 刷新页面 |
属性名 | 说明 |
---|---|
length | 获取当前浏览器窗口的历史记录条数 |
console.log(history.length);
方法名 | 说明 |
---|---|
forward() | 前进一步 |
back() | 后退一步 |
go(n) | 传入的数字来决定是前进还是后退并指定步数 |
history.go(2);前进2步
history.go(-1);后退一步
history.forward():前进一步
history.back();后退一步
属性 | 说明 |
---|---|
userAgent | 获取浏览器版本信息 |
像素
屏幕上的一个小方块,每个方块都有明确的位置和色彩值,每个小方块的位置和色彩值决定了屏幕呈现效果。
平时说的有多少像素就是指,有多少小方块。
物理像素
像素密度
逻辑像素(独立像素)
是一种物理测量单位,基于计算机控制的坐标系统和抽象像素(虚拟像素),由底层系统的程序使用,转换为物理像素应用。
保持密度独立性性很重要,因为如果没有此功能,UI设计的元素在低密度屏幕上看起来就会比较大。在高密度屏幕上看起来比较小。保证在不同设备上让用户看到的元素大小一样的
设备独立像素本质上就是一个比例关系
css像素就属于独立像素(逻辑像素)
理想视口
<meta name="viewport" content="width=device-width, initial-scale=1.0">
device-width
设备宽度,表示布局视口宽度等于视觉视口宽度。1.0
yes/no
vh与vw
rem 与 em
em也是相对单位,相对的是当前元素的文本尺寸font-size
,例如当前元素的font-size:16px,那么1em=16px;em 是相对于当前元素的font-size值进行转换的 不能自适应;em 更多的使用场景是,相对于当前元素大小进行放大缩小
rem相对于根元素文本尺寸font-size
,例如根元素的font-size:100px, 那么 1rem = 100px;
function adapter(){
let dol = document.documentElement //窗口元素
let _width = dol.clientWidth //屏幕宽度
dol.style.fontSize = _width / (375 / 100) + 'px' //375 就是设计图尺寸 100为初始字体尺寸
//_width * 100 / 750 + 'px'
}
window.onload = function(){
adapter()
}
window.onresize = function(){
adapter()
}
注意:本地引入使用iconfont方式引入图标需要保留iconfont.woff
和iconfont.woff2
文件
注意:如果设置了彩色图标,我们就不能控制字体图标颜色。就只能通过设置每个图标的颜色来改变。
我们可以修改图标引入名称,也可以修改图标颜色。
事件名称 | 触发条件 | 说明 |
---|---|---|
touchstart | 当手指触摸屏幕时触发;即使已经有一个手指放在了屏幕上也会触发 | 类似鼠标事件 mousedown |
touchmove | 当手指在屏幕上滑动时连续地触发。 | 类似鼠标事件 mousemove |
touchend | 当手指从屏幕上移开时触发 | 类似鼠标事件 mouseup |
https://jquery.com/
<script src="./jQuery v3.6.1.js"></script>
在需要的页面引入对应的JS文件
let 变量名 = jQuery('css选择器')
//$ 是 jQuery的简写
let 变量名 = $('css选择器')
方法名 | 参数 | 说明 |
---|---|---|
html() | 修改字符串 | 不传入参数及获取内容 |
text() | 修改字符串 | 不传入参数及获取内容 |
val() | 修改字符串 | 不传入参数及获取内容 |
<body>
<div id="div">
<p>123</p>
</div>
<input type="text" value="李四">
</body>
<script>
let div = $('#div')
console.log(div.html());
console.log(div.text());
// div.html(`<p>测试</p>`) //innerHTML
div.text(`<p>测试</p>`)
let inp = $('input')
console.log(inp.val());
inp.val('张三') //修改input内容
方法名 | 参数 | 说明 |
---|---|---|
attr() | 属性名,属性值 | 传入一个参数获取属性值,传入两个修改属性值 |
removeAttr() | 属性名 | 删除某个属性 |
addClass() | class名 | 添加class |
removeClass() | class名 | 删除某个class |
toggleClass() | class名 | 切换某个class |
hasClass() | class名 | 返回值为布尔值,查询元素是否包含这个class |
<body> <!-- java-id 自定义属性 用户自己设置的属性 --> <botton>显示</botton> <div class="box1" java-id="0001"></div> </body> <script> let div = $('div') console.log(div.attr('class')); console.log(div.attr('java-id')); // div.attr('class','box2') div.removeAttr('java-id') div.addClass('box2') div.removeClass('box1') $('botton').on('click',function(){ div.toggleClass('show') console.log(div.hasClass('show')); }) </script>
方法名 | 参数 | 说明 |
---|---|---|
append() | 字符串或元素 | 作为最后一个子标签加入父标签中 |
before() | 字符串或元素 | 追加到指定标签前面 |
after() | 字符串或元素 | 追加到指定标签后面 |
remove() | 没有参数 | 谁调用删除谁 |
<body>
<div id="box"></div>
<span>测试2</span>
</body>
<script>
let box = $('#box')
box.append(`<p>测试</p>`)
// box.append($('span'))
box.before('<a>before</a>')
box.after('<a>after</a>')
</script>
方法名 | 参数 | 说明 |
---|---|---|
css() | 属性名,值或者{属性名:值} | 一个参数为获取,两个参数为设置,多个样式修改用json |
width() | 值 | 设置宽度 |
height() | 值 | 设置高度 |
<body> <div id="div2"></div> </body> <script> // $('#div2').css('background','pink url("https://woniufile.oss-cn-hangzhou.aliyuncs.com/banner/class_time_home.png") center') // $('#div2').css('backgroundSize','cover') // json 数据格式 {键 : 值,键 : 值} $('#div2').css({ 'background':'pink url("https://woniufile.oss-cn-hangzhou.aliyuncs.com/banner/class_time_home.png") center', 'backgroundSize':'cover', 'width':'500', 'height':'300' }) // 对象 {属性名:属性值,属性名:属性值} // { // name:'张三' // } // 获取样式 console.log($('#div2').css('width')); </script>
方法名 | 参数 | 说明 |
---|---|---|
each() | 回调函数(index,item) | 循环之后 item 为js对象 |
eq() | 下标 | 获取对应下标的元素 |
first() | 无 | 第一个元素 |
last() | 无 | 最后一个元素 |
index() | 无 | 获取元素对应的下标 |
注意:jquery获取的元素可以直接设置全部样式,和添加全部事件,这个现象我们叫做隐式遍历。
// jquery 隐式遍历
$('div').css('background','pink')
// jquer遍历
$('div').each(function(index,item){
console.log(index);
// console.log(item);
// 遍历后为JS对象
// item.style.background = 'pink'
// 转为JQ对象
// $(item).css('background','pink')
console.log($(item).index());
})
//获取对应下标的元素进行操作
$('div').eq(1).css('background','pink')
$('div').first().css('background','green')
$('div').last().css('background','blue')
//js对象转JQ对象
$(js对象)
//JQ对象转JS对象
JQ对象 . get(下标)
JQ对象[ 下标 ]
let _div = document.querySelector('div')
$(_div).on('click',function(){
alert(1)
})
let _div = $('div')
_div[0].addEventListener('click',function(){
alert(1)
})
方法名 | 参数 | 说明 |
---|---|---|
parent() | 无 | 获取当前元素的父级 |
parents() | 选择器 | 获取元素符合条件的祖先级 |
children() | 无 | 获取元素子级 |
find() | 选择器 | 找满足条件的子标签 |
prev() | 无 | 找上一个标签 |
next() | 无 | 找下一个标签 |
sibilings() | 选择器 | 找满足条件的兄弟标签 |
找父级
<body>
<div class="grand">
<div class="grand">
<div class="parent">
<div class="child"></div>
</div>
</div>
</div>
</body>
<script>
$('.child').css('background','pink')
$('.child').parent().css('background','green')
$('.child').parents('.grand').css('background','blue')
</script>
找子级
<body> <div class="grand"> <div class="parent"> <div class="child"></div> </div> <div class="parent"> <div class="child"></div> </div> <div class="parent"> <div class="child"></div> </div> </div> </body> <script> // 找子级 // $('.grand').children().css('background','pink') $('.grand').find('.child').css('background','pink') </script>
找兄弟
<body> <div class="grand"> <div class="parent box"> <div class="child"></div> </div> <div class="parent box"> <div class="child"></div> </div> <div id="div" class="parent"> <div class="child"></div> </div> <div class="parent"> <div class="child"></div> </div> <div class="parent"> <div class="child"></div> </div> <div class="parent box"> <div class="child"></div> </div> </div> </body> <script> // $('#div').prev().css('background','pink') // $('#div').next().css('background','pink') $('#div').siblings('.box').css('background','pink') </script>
//事件绑定
$('div').on('click',function(){
alert($('div').html())
})
//事件委托形式
$('div').on('click','p',function(){
alert($('div').html())
})
方法名 | 参数 | 说明 |
---|---|---|
fadeIn() | 时间毫秒 | 淡入 |
fadeOut() | 时间毫秒 | 淡出 |
slideDown() | 时间毫秒 | 下滑 |
slideUp() | 时间毫秒 | 上划 |
animate() | {},事件毫秒 | 自定义动画 |
$('#hidden').on('click',function(){
$('div').fadeOut(500) ;
})
$('#show').on('click',function(){
$('div').fadeIn(500) ;
})
<body> <div class="nav"> <p>用户管理</p> <ul> <li>1</li> <li>2</li> <li>3</li> </ul> </div> <div class="nav"> <p>商品管理</p> <ul> <li>1</li> <li>2</li> <li>3</li> </ul> </div> </body> <script> $('.nav').on('click',function(){ let _ul = $(this).find('ul') if(_ul.css('display') == 'none'){ _ul.slideDown() }else{ _ul.slideUp() } }) </script>
$('div').on('click',function(){
$(this).animate({
'width':'300px',
'height':'300px',
'margin-top':'50px'
},2000)
})
js本身很难绘制几何图形,在html5里新增了一个标签canvas
,这个标签在页面上为我们提供了一块类似画布的东西,我们可以通过canvas对象绘制2d图 3d图。
<html lang="en"> <head> <style> <!-- 消除默认样式 --> * { margin: 0; padding: 0; list-style: none; text-decoration: none; color: #333; } body { background: pink; } #myCan { /* 对canvas图像进行放大缩小 不建议使用 */ /* width: 800px; height: 800px; */ background: #fff; display: block; margin: 50px auto; } </style> </head> <body> <!-- 画布大小通过属性控制 --> <canvas id="myCan" width="800" height="500"></canvas> </body> </html>
<script>
// 获取画布
let myCan = document.querySelector('#myCan')
// 获取画笔
let pen = myCan.getContext('2d')
</script>
方法名 | 参数 | 说明 |
---|---|---|
moveTo() | 横坐标,纵坐标 | 将画笔移动到某个位置 |
lineTo() | 横坐标,纵坐标 | 将画笔链接到某个点 |
注意:此时链接出来的只是路径,页面看不到效果,我们需要填充或者描边才能看到。
// 把画笔移动到某个位置
pen.moveTo(100,100)
//链接到某个坐标点
pen.lineTo(100,200)
// 此时我们绘制的线条只是路径
方法名 | 参数 | 说明 |
---|---|---|
stroke() | 无 | 描边路径 |
fill() | 无 | 如果只是一条直线路径填充是没有效果的 |
// 把画笔移动到某个位置
pen.moveTo(100,100)
//链接到某个坐标点
pen.lineTo(100,200)
// 此时我们绘制的线条只是路径
// pen.stroke()
// 如果只是一条直线路径填充是没有效果的
pen.lineTo(200,200)
pen.fill()
node -v
npm -v
可以获取到版本号表示安装成功。npm -v
npm的全称是node package manager,是一个nodejs包管理和分发工具,已经成为了非官方的发布node模块(包)的标准。
创建一个文件夹,或者gitee创建一个项目管理。
在项目根目录中打开终端执行以下代码。
npm init -y
该命令执行完成后,会在项目根目录生成一个package.json
文件。该文件中记录相关项目的相关信息,例如项目名称、项目版本等。
1.下载webpack
在项目根目录中打开终端下载webpack的依赖包
npm i webpack webpack-cli -D
下载成功后,在package.json中可以查看对应的版本记录。"devDependencies":{}
新建文件
webpack.base.config.js // 公共配置文件
webpack.prod.config.js //生产环境配置文件
webpack.dev.configs.js //开发环境配置文件
下载成功后,在package.json中可以查看对应的"webpack-merge"版本记录。"devDependencies":{}
npm i webpack-merge -D
module.exports = {
}
// require node.js 后台引入方式
// 引入合并插件
const {merge} = require('webpack-merge')
// 公共配置
const base = require('./webpack.base.config')
// 合并公共配置
module.exports = merge(base,{
})
module.exports = merge(base,{
mode:"development" //表明开发环境
})
module.exports = merge(base,{
mode:"production" //表明生产环境
})
需要用过webpack去启动webpack。启动过程中webpack会自动根据配置对代码进行编译处理,最后编译的代码在浏览器中打开。
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build":"webpack --config webpack.prod.config.js --mode production"
},
下载插件
npm i webpack-dev-server -D
配置服务器
module.exports = merge(base,{
mode:"development", //表明开发环境
devServer:{
port:"8080", //端口号
// open:"index.html" //启动后默认打开页面
}
})
配置启动命令
在package.json文件中添加代码
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack --config webpack.prod.config.js --mode production",
"dev":"webpack-dev-server --hot --config webpack.dev.config.js --mode development"
},
所有基础配置都是dev和prod都需要用到的,所以都在公共配置文件中进行配置。
entry入口配置
因为每一个html文件都需要一个入口的js文件,所以我们需要在webpack中将这些入口js文件的名字和路径全都进行配置
output出口配置
webpack在对我们的项目代码进行编译后,会得到一个新的代码,
配置html
webpack默认只能处理js文件,所以如果需要处理html,需要下载插件
1.下载插件
npm i html-webpack-plugin -D
2.添加配置
3.npm run build的时候就有压缩的html文件了。
优化HTML和JS的配置
//node.js自带的路径插件 const path = require("path") // 引入HTML解析插件 const HtmlWebpackPlugin = require('html-webpack-plugin') // 设置一个数组拿来存放我们有的页面 const pages = ['index','login'] module.exports = { // 入口配置 entry:{ // index:"./src/js/index.js", // login:"./src/js/login.js", // ...setEn(pages) //方法一:自定义函数处理 ...pages.reduce(function(value,item){ return { ...value, [item]:`./src/js/${item}.js` } },{}) }, // 出口配置 output:{ path:path.resolve(__dirname,"dist"), filename:"js/[name].js" }, // 配置插件 plugins:[ // new HtmlWebpackPlugin({ // template:"./src/index.html", // 设置需要编译文件的路径 // filename:"index.html", // 告诉weboack编译后的文件名字 // chunks:["index"] // 配置当前HTML中需要引入的JS文件名 一般用一个入口文件即可(import) // }), // new HtmlWebpackPlugin({ // template:"./src/login.html", // 设置需要编译文件的路径 // filename:"login.html", // 告诉weboack编译后的文件名字 // chunks:["login"] // 配置当前HTML中需要引入的JS文件名 一般用一个入口文件即可(import) // }), ...pages.map(item=>{ return new HtmlWebpackPlugin({ template: `./src/${item}.html`, filename:`${item}.html`, chunks:[item] }) }) ] } // 方法一 :自定义函数 // function setEn(arr){ // let obj = {} // for(let item of arr){ // obj[item] = `./src/js/${item}.js` // } // return obj // }
将js文件中使用的ES6及以上语法编译为ES5版本,使低版本浏览器可以使用。
npm i babel-loader @babel/core @babel/preset-env -D
module:{
rules:[
{
test:/\.js$i/,
use:{
loader:"babel-loader",
options:{
presets:['@babel/preset-env']
}
}
}
]
}
1.js中引入scss
如果我们需要使用webpack处理scss文件,那么我们所有的scss文件都应该在页面对应的js文件中引入。
import "../scss/index.scss"
2.下载插件
npm i node-sass sass-loader css-loader mini-css-extract-plugin -D
3.配置scss
//引入配置scss插件 const MiniCssExtractPlugin = require("mini-css-extract-plugin") new MiniCssExtractPlugin({ filename:"css/[name].css" }) 。。。。 { test:/\.scss$/i, exclude:/node_modules/, //node_modules中的文件 use:[ MiniCssExtractPlugin.loader, "css-loader", "sass-loader", ] }
在项目中有一些文件不需要webpack处理,直接复制到编译后的目录即可。
npm i copy-webpack-plugin -D
2.配置插件
// 引入拷贝不需要webpack处理的文件
const CopyPlugin = require("copy-webpack-plugin")
new CopyPlugin({
patterns:[
{from:"./src/static",to:"./static"}
]
})
npm i jquery
// 引入webpack用于加载全局事件
const Webpack = require('webpack')
.....
new Webpack.ProvidePlugin({
"$":'jquery',
})
由于浏览器运行的都是webpack编译后的代码,所以报错显示的位置就不正确,所以添加一配置方便我们定位错误。
在webpack.dev.config.js
中配置:
module.exports = merge(base,{
mode:"development", //表明开发环境
devServer:{
port:"8080", //端口号
open:"index.html" //启动后默认打开页面
},
devtool:"inline-source-map"
})
npm i clean-webpack-plugin -D
// 引入清除无用文件插件
const { CleanPlugin } = require('webpack')
// 合并公共配置
module.exports = merge(base,{
mode:"production", //表明生产环境
plugins:[
new CleanPlugin
]
})
模块化,指的是将每一个js文件都变成一个独立的模块,每一个js文件都拥有自己的作用域。默认情况下模块与模块之间不能进行数据访问。
<script src="./index.js" type="module"></script>
在实际开发中。通常一个html中只需要引入一个入口js即可,剩下的js文件,都可以在入口js中进行引入。
import "./a.js"
import "./b.js"
import "./c.js"
注意:同目录之中的js文件都需要以./
开头
默认情况下,模块与模块之间不能进行数据互相访问,但是我们可以通过暴露和引入的方式,来实现部分数据的共享。
- 暴露:指的就是可以当前模块中,通过暴露方式,将私有的数据共享给其他JS模块使用。
- 引入:指的就是可以在当前模块中,通过引入的方式,将其他JS的私有数据拿来使用。
export
export default
暴露多条数据
export var b = 5
var a = "hello"
export function show(){
alert("bbbb")
}
只暴露一条数据
export function showA(){
alert("bbbb")
}
export default showA
import {b,show} from "./b.js"
引入只暴露一条数据的:
import 变量名 from "./b.js"
一般来说,变量名等于暴露的名字。
注意如果引入的两个变量名有重名可以通过as来重命名
import show from "./a.js"
import {b,show as show2} from "./b.js"
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。