也是为HTML服务的 存储数据 计算 请求
从三个方向来讲
CSS
响应式布局: 根据不同的屏幕设置不同的布局
/* 最小屏幕宽 720px样式 */
@media screen and (min-width:720px) {
#footer p{
color: #008B8B;
}
}
/* 最小屏幕宽 960px样式 */
@media screen and (min-width:960px) {
#footer p{
color: palevioletred;
}
}
/* 最小屏幕宽 1200px样式 */
@media screen and (min-width:1200px) {
#footer p{
color: rgb(138,138,138);
}
}
在head 或者 body 中添加script标签 标签之间就是JS的代码
前提有一个JS文件
在head 或者 body 中添加script标签 通过属性src引入JS文件
-->
内部引用和外部引用不能合并在一起
标签之间的内容时不会识别的
以后写的话内部就是内部 外部就是外部
JS是动态语言, 变量的类型是有赋予的值来决定的 与Python这一点是一样的
数字类型 Number
字符串类型 String 使用引号包含的数据, 单双引号都可以
布尔类型 Boolean 值只有两个 true 和 false
对象类型 Object ===> Python 中的字典
特殊的数据类型
检验变量类型的方法
typeof 变量名
其他类型转化为布尔类型的规则
转换的格式
Boolean(数据)
var b = true;
console.log(typeof b)//boolean
console.log(Boolean(10))//true
console.log(Boolean(0))//false
console.log(Boolean(3.14))//true
console.log(Boolean(""))//false
console.log(Boolean(" "))//true
console.log(Boolean(null))//false
console.log(Boolean(undefined))//false
console.log(Boolean({}))//true
在小数数据存储的时候, 小数点后没有数据 或者是小数点后只有一个0
解释器解释 计算器在存储的时候会把该数据存储为整型 (节省内存)
浮点数据的存储占用的内存要比整型数据大很多 几乎为两倍
var num = 10;
console.log(typeof num);//number
var value = 10.0
console.log(value)//10
// 声明浮点数据的时候的格式
value = .8 // 不建议使用这种格式
console.log(value)//0.8
value = 1.8
console.log(value)//1.8
// 数值类型的最大值和最小值
console.log(Number.MAX_VALUE) // 1.7976931348623157e+308
console.log(Number.MIN_VALUE) //5e-324
// 数据过大或者过小的时候 会转化为科学计数法表示的
// 数值相除的时候 分母是不能为0的
console.log(0 / 0) // NaN -- Not a Number
// 如果数据超过上面的范围就会出现 正无穷和负无穷的情况
console.log(1 / 0) // Infinity 正无穷
console.log(-1 / 0) // -Infinity 负无穷
// 验证数据 是否 不是一个数值 isNaN(数据)
// 不是数值尾部true 是数值为false
console.log(isNaN("123abc"))//true
console.log(isNaN(123))//false
// 将字符串类型数据或者浮点类型数取整
var res = parseInt(3.14);
console.log(res)//3
// 字符串: 只要字符串开头的数据满足整数的格式 就能提取出来数据
console.log(parseInt("+125613fghjdklasjjhfds"))//125613
console.log(parseInt("a+125613fghjdklasjjhfds"))//NaN
// 将字符串的数据转化为浮点型
// 只要字符串开头的数据满足整数或者小数的格式
console.log(parseFloat("1.34abdf"))//1.34
var len = s.length
s = “how are you how old are you”
index = s.lastIndexOf(“are”)
console.log(index)//20
s = "abcdef"
var new_s = s + "-" + "hello"
console.log(new_s)//abcdef-hello
new_s = new_s + 10
console.log(new_s)//abcdef-hello10
console.log(typeof new_s)//string
new_s = new_s + true
console.log(new_s)//abcdef-hello10true
console.log(typeof new_s)//string
s = "hello" + 5 * 5
console.log(s)//hello25
s = 5 + 5 + "hello"
console.log(s)//10hello
s = “goodgoodstudydaydayup”
开始索引和结束索引
[开始,结束)
var upper_str = s.toUpperCase()
console.log(upper_str)//GOODGOODSTUDYDAYDAYUP
var lower_str = upper_str.toLowerCase()
console.log(lower_str)//goodgoodstudydaydayup
var replace_s = s.replace(“o”, “OO”)
console.log(replace_s)//i13lOOve14you520hahaha
封装重复使用的代码 简化代码 降低代码的重复率
格式:
function 函数名(形参列表){
函数体
return 返回值
}
// 计算两个数的和
function add(x, y){
console.log(arguments)
// 想获取其中的数据的话 可以通过遍历来获取
for (i in arguments){
console.log(i)
console.log(arguments[i])
}
return x + y
}
console.log(typeof add)
// 函数的调用
var res = add(10, 20)
console.log(res)
res = add(10, 20, 30, 40, 50)
console.log(res)
* function(形参列表){
函数体
return 返回值
}
在内存中执行完成会被立即释放的
res = (function(a, b){
return a + b
})(13, 24)
console.log(res)
f = function(a, b){
return a + b
}
res = f(17, 19)
console.log(res)
f1 = add
res = f1(19, 19)
console.log(res)
函数有自己独立的作用域
在函数内部声明的变量 不用var标记 – 是一个全局变量
在函数的外部可以使用
使用var声明 就是一个局部变量 只能在函数中使用
function display(){
var max_value = 100
min_value = 10
}
display()
console.log(min_value)//10
console.log(max_value)//Uncaught ReferenceError: max_value is not defined
function outer(){
console.log("外部函数")
function inner(){
console.log("内部函数")
}
inner()
}
outer()
想让inner的作用范围广一些 闭包
函数嵌套, 外层函数的返回值是一个函数
function outer1(){
console.log("外部函数1")
function inner1(){
console.log("内部函数1")
}
return inner1
}
res = outer1()
res()
+ - * / %
console.log(1 + 2)
console.log(1 - 2)
console.log(1 * 2)
console.log(1 / 2)
console.log(1 % 2)
+(正号) -(符号) ++(自加) --(自减)
单独的一条语句 a++ 和 ++a是没有区别的
都是在原来的基础上对变量进行自加1
在参与运算的时候
a++ 先将变量的值参与运算 再对变量进行自加1
++a 先对变量进行自加1 再将变量的值参与运算
var m = 10
n = m++
console.log(n) //10
console.log(m) //11
n = ++m
console.log(n) //12
console.log(m) //12
+= -= *= /= %=
> >= < <= == != ===(恒等)
==和===的区别
var res = (123 == "123" ? "成立" : "不成立")
console.log(res)//成立
res = (123 === "123" ? "成立" : "不成立")
console.log(res)//不成立
res = (123 === 123 ? "成立" : "不成立")
console.log(res)//成立
逻辑与 && (and) 逻辑或 || (or) 逻辑非 ! (not)
在Python中and和or是具有短路原则的
var x = 10, y = 11
res = (x < y && --y >= x++)
// res x y 分别等于什么???
console.log(res)
console.log(x)
console.log(y)
// true 11 10
var x = 10, y = 11
res = (x >= 10 && y-- > ++x || y++ > 10)
// res x y
console.log(res)
console.log(x)
console.log(y)
// false 11 11
条件表达式 ? 表达式1 : 表达式2
条件成立执行表达式1 否则执行表达式2
var res = (123 == "123" ? "成立" : "不成立")
console.log(res)//成立
res = (123 === "123" ? "成立" : "不成立")
console.log(res)//不成立
res = (123 === 123 ? "成立" : "不成立")
console.log(res)//成立
if(条件表达式){
条件成立时执行的语句
}else{
条件不成立时执行的语句
}
if(条件表达式1){
条件1成立时执行的语句
}else if(条件表达式2){
条件2成立时执行的语句
}...
else{
以上条件均不成立执行的语句
}
case后跟随的是固定的数据 是一个明确的值
是根据switch后面的表达式的结果可能出现的情况列出的选项
如果其中一个选项满足 整个选择语句结构 通过break就结束
default是case中列出的选项都不成立 执行default
default的执行时机与其书写的位置没有关系
switch(表达式){
case 值1:
执行语句
break
case 值2:
执行语句2
break
...
default:
执行语句
break
}
while(条件表达式){
循环语句
}
do-while至少会执行一次循环操作
do{
循环操作
}while(条件表达式)
小括号中放的是三条语句, 因为语句结束的标记是分号 有两个分号
初始化条件有多个 使用逗号分隔
for(循环初始化语句;循环条件判断语句;循环后初始化条件变化的语句){
}
// 死循环
for(;;){}
变量获取的是序列的索引
for(变量 in 序列){
}
类比成 Python中的列表
在JS中的数组没有脚标越界一说
没有指定位置 不会报错的 只是返回undefined
var value = arr[11]
console.log(value)
for(var i = 0; i < arr.length; i++){
console.log(arr[i])
}
var join_str = arr.join("-")
console.log(join_str)
arr.reverse()
console.log(arr)
arr.sort(function(ele1, ele2){
return ele1 - ele2
// ele1 > ele2 结果是大于零的会交换元素
// 否则不交换
})
console.log(arr)
Object的数据结构是类似于Python的字典的键值对的形式呈现出来的
person.study = function(){
console.log(this.age +"岁的"+this.name + "在学习")
}
获取对象的属性
删除对象的属性
delete person.name
调用行为
person.study()
常用创建对象的形式
var student = {
name:"测测",
age: 18,
sleep:function(){
console.log(this.name + "在睡觉")
}
}
student.sleep()
获取当前时间
var date = new Date()
console.log(date)
自定义时间
月份 0-11 表示1到12
date = new Date(2020, 12, 25)
console.log(date)
date = new Date(2020, 0, 25, 12, 30, 25)
console.log(date)
将指定的时间字符串格式转化为时间
年月日: “年-月-日” 或者 “年/月/日”
date = new Date(“2021-12-25 12:30:30”)
console.log(date)
以特定的格式显示星期 年月日
console.log(date.toDateString())
以特定的格式显示时分秒和时区
console.log(date.toTimeString())
以本地时间格式显示年月日
console.log(date.toLocaleDateString())
以本地时间格式显示时分秒
console.log(date.toLocaleTimeString())
获取指定时间对应的时间戳
时间戳:指定时间到1970年1月1日凌晨经历的秒数
var time_code = date.getTime()
console.log(time_code)
将时间戳转化为指定的时间
date = new Date(time_code)
console.log(date)
获取指定字符串时间对应的时间戳
time_code = Date.parse(“2019-12-25 23:15:14”)
console.log(time_code)
date = new Date(time_code)
console.log(date)
获取时间中指定字段的值get/重置指定字段的值set
console.log(“圆周率:”+Math.PI)
console.log(“产生的是0到1之间的随机数 不包含1:”+Math.random())
console.log(“两个数中的最大值:”+Math.max(18, 21))
console.log(“两个数中的最小值:”+Math.min(18, 21))
console.log(“绝对值:”+Math.abs(-10))
console.log(“求幂数:”+Math.pow(2, 5)) // 2的5次方
console.log(“开平方:”+Math.sqrt(8))
console.log(“四舍五入:”+Math.round(3.78))
console.log(“向上求整:”+Math.ceil(18.01))
console.log(“向下求整:”+Math.floor(18.99))
窗口对象 window
提供的是与浏览器进行交互的属性和方法
window对象常用的属性和行为
属性:
行为:
在JS中声明的变量和行为 如果没有标记属于哪个对象,那么它就属于window对象的
var person = {
name:"珂珂"
}
console.log(person.name)
var value = 100
console.log(value) // window对象是可以省略的
console.log(window.value)
alert("弹窗")
window.alert("弹窗2")
// 为了适配所有的浏览器
var width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth
var height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight
console.log("屏幕宽度:" + width + " 屏幕高度:" + height)
红豆生南国,春来发几枝。愿君多采撷,此物最相思。
验证新窗口的名字
每隔多长时间执行什么行为就是定时器
要执行的行为
时间间隔 单位是毫秒
定时器生成的时候 会有一个定时器id的产生 根据这个id去移除定时器
var i = 1
var timeid = setInterval(function(){
console.log("执行了该定时器" + i + "次")
i++
if(i > 20){
// 停止定时器
clearInterval(timeid)
}
}, 1000)
延时指定时间之后 才会执行某些行为
只会执行一次
在延时期间 关闭这个行为 延时器生成的时候也是有延时器id的
第一页
第二页
3页
第三页
1-1
1-2
1-3
2-1
2-2
2-3
3-1
3-2
3-3
var s = "你好 byebye,.12345"
var encode = encodeURIComponent(s)
console.log(encode)//%E4%BD%A0%E5%A5%BD%20byebye%2C.12345
var decode = decodeURIComponent(encode)
console.log(decode)//你好 byebye,.12345
文档对象模型
在文档对象模型中 它是以节点的形式来操作文档的
常用的节点的分类:
文本是嵌套在标签之间的 文本节点 是元素节点的子节点
属性是跟标签是平级的
DOM + 事件
在head中获取文档中的内容时 要等页面加载完成之后才可以操作
因为代码是从上向下执行的 在进行JS操作的时候 文档上的元素还没有加载 所以是获取不到的
想要获取的话 等页面加载完成的时候 才能获取
onload — 页面加载完成的时候触发这个事件
小草偷偷地从土里钻出来,嫩嫩的,绿绿的。园子里,田野里,瞧去,一大片一大片满是的。坐着,躺着,打两个滚,踢几脚球,赛几趟跑,捉几回迷藏。风轻悄悄的,草软绵绵的。
桃树、杏树、梨树,你不让我,我不让你,都开满了花赶趟儿。红的像火,粉的像霞,白的像雪。花里带着甜味儿;闭了眼,树上仿佛已经满是桃儿、杏儿、梨儿。花下成千成百的蜜蜂嗡嗡地闹着,大小的蝴蝶飞来飞去。野花遍地是:杂样儿,有名字的,没名字的,散在草丛里,像眼睛,像星星,还眨呀眨的。
“吹面不寒杨柳风”,不错的,像母亲的手抚摸着你。风里带来些新翻的泥土的气息,混着青草味儿,还有各种花的香,都在微微润湿的空气里酝酿。鸟儿将窠巢安在繁花嫩叶当中 [2] ,高兴起来了,呼朋引伴地卖弄清脆的喉咙,唱出宛转的曲子,与轻风流水应和着。牛背上牧童的短笛,这时候也成天嘹亮地响着。
获取/设置元素节点中的内容
在设置的时候是有区别的
天上风筝渐渐多了,地上孩子也多了。城里乡下,家家户户,老老小小,也赶趟儿似的,一个个都出来了。舒活舒活筋骨,抖擞抖擞精神,各做各的一份事去。“一年之计在于春”,刚起头儿,有的是工夫,有的是希望。
设置属性
获取属性值
春天像小姑娘,花枝招展的,笑着,走着。
建议使用 setAttribute设置属性
建议使用 getAttribute设置属性
天上风筝渐渐多了,地上孩子也多了。城里乡下,家家户户,老老小小,也赶趟儿似的,一个个都出来了。舒活舒活筋骨,抖擞抖擞精神,各做各的一份事去。“一年之计在于春”,刚起头儿,有的是工夫,有的是希望。
添加 插入 替换 移除这些操作 都是有父节点完成的
// 创建一个段落节点 给添加在body上
var p_node = document.createElement("p")
// 添加在body 添加在指定标签节点的末尾
document.body.appendChild(p_node)
// 创建文本节点
var text_node = document.createTextNode("我是文本节点")
// 文本是嵌套在标签之间的 文本节点是元素节点的子节点
p_node.appendChild(text_node)
// 在指定元素前插入节点
var a_node = document.createElement("a")
a_node.innerText = "百度一下"
// 属性
a_node.setAttribute("href", "http://www.baidu.com")
// 新添加的节点 在哪个节点之前
document.body.insertBefore(a_node, p_node)
// 替换
var b_node = document.createElement("b")
b_node.innerText = "静夜思"
// 将b节点替换掉a节点 新节点 旧节点
document.body.replaceChild(b_node, a_node)
// 删除节点 删除p节点
document.body.removeChild(p_node)
床前明月光
这个是静夜思的第一句
疑是地上霜
这个是静夜思的第2句
举头望明月
这个是静夜思的第3句
低头思故乡
这个是静夜思的第4句
offsetLeft、offsetTop
默认是相对于body的左边间隙的宽度 和 上边间隙的宽度
left和top是跟定位属性相关的
如果设置了参照物(在指定的标签中设置有效的定位属性)
这个offsetLeft和offsetTop是相对于参照物的间隙
用户引发的操作或者页面加载的时候主动触发的操作
如果想用户触发某个动作之后 有对应的操作出现
绑定事件的方式
内联模式
比较传统 也比较单一
没有与HTML进行分离
<标签名称 事件属性名=“js的代码”>标签名称>
脚本模式
与HTML进行分离
1. HTML混写 但是JS代码是在script中写的
事件 — 触发的是一个行为
行为映射到程序中就是一个函数
在script中写好了对应的函数
在HTML中 事件绑定的时候 绑定的是这个函数
2. 纯JS
小桥流水人家 古道西风瘦马。
百度一下
触发一个事件 执行该事件对应的行为时
会像事件对应的功能中传递一个实参 — 事件对象
document.onkeydown = function(e){
if(e.altKey){
console.log("alt键被按下")
}else if(e.ctrlKey){
console.log("ctrl键被按下")
}else if(e.shiftKey){
console.log("shit键被按下")
}else if(e.metaKey){
console.log("主键被按下")
}
// 几个键同时按
if(e.altKey && e.ctrlKey){
console.log("两个键同时被按下")
}
// 获取按键的标识符
console.log(e.key)
// Windows
if(e.ctrlKey && e.key == "c"){
console.log("拷贝")
}
// mac
if(e.metaKey && e.key == "c"){
console.log("拷贝")
}
// 字母对应的大写字母的ascii码值
console.log(e.keyCode)
}
document.onkeypress = function(e){
console.log(e.charCode)
// 区分了大小写
}
省市联动
数据结构:
有很多的省份
每个省份下有很多的市
事件的传递机制分为两种:冒泡传递(默认的)和捕获传递
冒泡传递 理解 鱼吐泡泡
叠加的标签都有事件 事件是会传递的
事件的监听 — 可以理解为为标签绑定事件的另外一种方式
— 绑定了之后可以解绑
监听的事件类型
绑定事件的时候 on…事件
事件类型 就是去掉on后面的内容 就是事件类型
例如 onclick ===> click
监听到该事件之后执行的行为
是否设置为捕获传递 默认为false(默认为冒泡传递)
btn.addEventListener("click", function(){
console.log("哎呀,我被点击了")
})
取消监听的设置要与设置监听是一致的 否则取消失败
btn.removeEventListener("click", function(){
console.log("哎呀,我被点击了")
})
看起来明明设置的是一致的 但是却取消失败
原因: 就是因为监听事件之后执行的行为 不是一个行为
function(){} 这种是匿名函数 执行一次之后就会被
在内存中释放掉了 之后再写是新生成了一个 与原来那个无关
取消成功的话
函数不适用匿名函数了
如果想用JQ的内容就得先将其引入
head中
$(选择器).行为()
$是JQ的符号 — 表示的是jQuery
$(选择器)
获取的是所有满足选择器要求的元素 — 节点集
body中
忽如一夜春风来,千树万树梨花开。
忽如一夜春风来,千树万树梨花开。
忽如一夜春风来,千树万树梨花开。
- 苹果
- 香蕉
- 鸭梨
- 橘子
飞流直下三千尺,疑是银河落九天。
JQ和JS是可以共存的
但是JQ对象只能使用JQ的行为 不能使用JS的操作方式
也就是说 jq_page只能使用css()设计样式 不能使用.style.样式名设计样式
JS只能使用JS的操作行为 不能使用JQ
也就是说 page_node只能使用.style.样式名设计样式 不能使用css()设计样式
皇宫中和朝廷里的大臣,本都是一个整体,奖惩功过,不应有所不同。如有作恶违法的人,或行为忠善的人,都应该交给主管官吏评定对他们的惩奖,以显示陛下处理国事的公正严明,而不应当有偏袒和私心,使宫内和朝廷奖罚方法不同。
先帝开创的大业未完成一半却中途去世了。现在天下分为三国,指蜀汉国力薄弱,处境艰难
(陛下)你实在应该扩大圣明的听闻,来发扬光大先帝遗留下来的美德,振奋有远大志向的人的志气,不应当随便看轻自己,说不恰当的话,以致于堵塞人们忠心地进行规劝的言路。
这确实是国家危急存亡的时期啊。不过宫廷里侍从护卫的官员不懈怠,战场上忠诚有志的将士们奋不顾身,大概是他们追念先帝对他们的特别的知遇之恩(作战的原因),想要报答在陛下您身上。
(陛下)你实在应该扩大圣明的听闻,来发扬光大先帝遗留下来的美德,振奋有远大志向的人的志气,不应当随便看轻自己,说不恰当的话,以致于堵塞人们忠心地进行规劝的言路。
皇宫中和朝廷里的大臣,本都是一个整体,奖惩功过,不应有所不同。如有作恶违法的人,或行为忠善的人,都应该交给主管官吏评定对他们的惩奖,以显示陛下处理国事的公正严明,而不应当有偏袒和私心,使宫内和朝廷奖罚方法不同。
好好学习 天天向上
少壮不努力 老大徒伤悲
好好学习 天天向上
good good study day day up
少壮不努力 老大徒伤悲
- A
- B
- C
- D
- E
- F
JQ中的行为是获取和设置集于一身的
春眠不觉晓,处处闻啼鸟
夜来风雨声,花落知多少
设置属性
获取属性
$(选择器).attr(属性名)
设置样式
获取样式
$(选择器).css(样式名)
hello nice to meet you
添加元素
插入元素
替换元素
删除元素
包裹: 就是将指定标签使用 要求的标签给包裹起来
庆历四年春,滕子京谪守巴陵郡。越明年,政通人和,百废具兴。乃重修岳阳楼,增其旧制,刻唐贤今人诗赋于其上。属予作文以记之。
予观夫巴陵胜状,在洞庭一湖。衔远山,吞长江,浩浩汤汤,横无际涯;朝晖夕阴,气象万千。此则岳阳楼之大观也,前人之述备矣。然则北通巫峡,南极潇湘,迁客骚人,多会于此,览物之情,得无异乎?
葵花宝典
九阳真经
九阴真经
降龙十八掌
葵花点穴手
排山倒海
1
2
3
4
爱好是:
打篮球
踢足球
沙滩球
棒球
盒子模型包含四个部分:
内容区 内边距 边框 外边距
木兰辞
唧唧复唧唧,木兰当户织。不闻机杼声,惟闻女叹息。
问女何所思,问女何所忆。女亦无所思,女亦无所忆。昨夜见军帖,可汗大点兵,军书十二卷,卷卷有爷名。阿爷无大儿,木兰无长兄,愿为市鞍马,从此替爷征。
东市买骏马,西市买鞍鞯,南市买辔头,北市买长鞭。旦辞爷娘去,暮宿黄河边,不闻爷娘唤女声,但闻黄河流水鸣溅溅。旦辞黄河去,暮至黑山头,不闻爷娘唤女声,但闻燕山胡骑鸣啾啾。
图片展示
静夜思
床前明月光,疑是地上霜。
举头望明月,低头思故乡。
悯农
锄禾日当午,汗滴禾下土
事件的语法
$(选择器).事件名(触发事件执行的函数)
鼠标悬浮的事件 : 包含两个函数 鼠标进入的时候执行的函数 鼠标离开的时候执行的函数 只给一个函数的话 两个鼠标的动作都会执行这个函数
那些样式需要发生动画的变化效果 {key:value,key:value}
动画过渡完成需要的时间 毫秒的
动画完成之后 调用的函数 可以省略的
如果有多个动画 是依次执行动画的顺序的
$(selector).stop(stopAll,goToEnd);
可选的 stopAll 参数规定是否应该清除动画队列。默认是 false,即仅停止活动的动画,允许任何排入队列的动画向后执行。
可选的 goToEnd 参数规定是否立即完成当前动画。默认是 false。
移动框相对于小图的可移动范围 与 大图相对于大图可视框的移动范围是成比例的
换句话说
移动块移动的距离 / 移动框的移动范围 = 大图的移动位移 / 大图的移动范围
在这个公式中 大图的移动位移是未知项