display: grid/inline-grid: 容器类型(块状或者行内)
1.1: 属性grid: 块状grid-inline-grid: 行内
grid-template-row/columns: 创建显式网格(列/行)
2.1: 属性repeat(次数,宽度):重复grid-template-columns: repeat(1,1fr)grid-template-row: repeat(1,1fr)
grid-auto-row/columns: 创建隐式网格grid-auto-flow: 项目排列方向gap: 行列间隙place-content: 项目在容器中的排列方式place-items: 项目在单元格中的排列方式grid-row/colums: 某项占据的网格区域grid-area: 是grid-row/column的语法糖place-self: 某项在单元格中的排列方式更多:https://developer.mozilla.org/zh-CN/docs/web/CSS/CSS_Grid_Layout
公式: font-size: calc(100vw / 3.75); //100px;
数据:
变量 let,储存数据和表示数据的标识符,可以在程序中被改变
常量 const,一旦赋值就不能被改变了。
命名规则驼峰命名(大,小) UserName (大) userName(小)蛇形命名(大,小)user_name(小) APP_PHP(大)
function(){//...}
let item = function(){...}
(参数),没有参数可以留空let item = () => {//...}
;(function(){//..})();//或者;(()=>{//语法糖})();
基本类型: number string boolean null undefined
引用类型:object array function
let arr = ['1','2','3','4']console.log(arr)
let arr = {'name':'小明','age':'15'}console.log(arr)
//多维数组let arr = [['1',2,'你好'],['1',2,'小明']]console.log(arr[0][1] //2);//对象数组let arr = [{'name':'小明','age': '15','sex':'男'},{'name':'小明红','age': '15','sex':'女'}]console.log(arr[0].name //小明);//“类”数组let item = {'name':'小明红','age': '15','sex':'女'}//对象使用 Array.from() 转换成数组arr = Array.form(item)consloe.log(arr)//数组//对象使用forEach()遍历输出数据arr.forEach(item => console.log(item))consloe.log(arr)//对象
//块作用域{let name = '小明';console.log(name)}//函数作用域let site = '墨子';const arr = function(){site = '鲁班大师'console.log(site) //'鲁班大师'}console.log(arr) //'鲁班大师'//全局作用域let site = '墨子'; // 在全局中生成变量
//键值和属性一样可以简写let name = '墨子';let age = 18;const obj = {name,age}conosle.log(obj)
if(true){//...console.log('hello')}
if(true){console.log('hello')}else{console.log('你好')}
let name = '墨子';if(name = '墨子'){console.log('hello')}else if(name = '鲁班大师'){console.log('你好')}else{console.log('嘿嘿')}
//条件?true : false
let name = true;
console.log(name ? ‘墨子’: ‘鲁班大师’)
let name = '墨子';switch(name){case '鲁班大师':console.log('1');break;case '墨子':console.log('2');break;default:console.log('甄姬')}
传入true才可以执行
switch(true)
let name = 80;switch(true){case name>70 && name < 100:console.log('80');break;case name>60 && name < 80:console.log('70');break;default:console.log('60')}
consot arr = [1,2,3];let index = 0;while(index < arr.length){console.log(arr[index])}
consot arr = [1,2,3];for(let index = 0; index < arr.length; i++){console.log(arr[i])}
consot arr = [1,2,3];for(value of arr){console.log(value) //1,2,3}
consot arr = {name: '小马', age:'18', sex: '男'};for(index in arr){console.log(arr[index]) //小马,18,男}
const arr = ['小马', 18,'男'];arr.forEach(function(item,index,arr){console.log(item)});//简化arr.forEach(item => console.log(item))
const arr = ['小马', 18,'男'];const res = arr.map(item => console.log(item));const res = arr.map((item,index,arr) =>`<span> ${index}: ${item} </span>\n`).join('');const bos = document.querySelector('body');bos.innerHTML+=resconsole.log(res);
//参数不足的时候let fn = function(a,b = 0){return a+b}console.log(fn(1))
fn = (a,b,...arr){//展开函数//第一种//创建一个数组let tmp = [a,b,...arr];let res = 0; //初始值tmp.forEach(item =>{res += itemreturn res;})}//第一个函数参数输出fn(1,2,3,4) //10fn = (a,b,...arr){//展开函数//第二种//解析解构:将集合中的每一个成员,赋值给一个个独立的变量let [c,d,e] = arr;let data = [a,b,c,d,e];//数组的reduce方法进行求和return = data.reduce((prev,curr) => prev+curr,0)}//第一个函数参数输出fn(1,2,3,4) //10
return数组,对象
//查询一个数组对象数据const items = [{id: 1,name: '西瓜', price: 20},{id: 2,name: '苹果', price: 30},{id: 3,name: '橘子', price: 40},{id: 4,name: '香蕉', price: 50},];const getFruits = ((item, ...num) => {//先建一个返回数组let res = [];//循环num的个数for(let i = 0; i < num.length; i++){//循环出items的数据items.forEach(item => {//判断id和num的值是否相同,相同的话追加在res数组中if(item.id === num[i]){res.push(item)}})}return res})let result = getFruits(items,3,4) //{id: 3,name: '橘子', price: 40},{id: 4,name: '香蕉', price: 50}
const arr = ['小明','男','18']let res = `<ul><li>姓名:${arr[0]}</li><li>性别:${arr[1]}</li><li>年龄:${arr[2]}</li></ul>`console.log(res)
let arr = [100,200];//左侧为模板 数组用[...] 对象用{...}//右侧为值//创建let [a,b] = arr;//更新值;[a,b] = [300,500];console.log(a,b) //更新值 300,500//如果变量>值:使用默认值;[a,b,c = 600] = [300,500];console.log(a,b,c) //300,500,600//变量<值:使用剩余参数 ...res;[a,b,...arr] = [300,500,400,500];let [c,d] = arr;console.log(a,b,...arr) //300,500,400,500
//属性名有冲突的时候可以使用 uname(旧值): name(新值)let {uname: name,age} = {uname: '小明',age: 18, sex: '男'};console.log(uname,age)
let user = {uname: '小明',age: 18, sex: '男'};let {...obj} = user;//克隆以后和之前的对象并不相等console.log(obj)
let user = {uname: '小明',age: 18, sex: '男'};//原始传参let show = (user => {return `名字:${user.uname},年龄:${user.age}`})console.log(show(user)) // 名字:小明,年龄:18//简化对象传参let show = (({uname,age})=>{return `名字:${uname},年龄:${age}`});console.log(show(user))
let res = {data: {age: 18},//getter: 读取 getAge => 语法糖 get ageget age(){return this.data.age;},//setter: 设置 setAge => 语法糖 set ageset age(age){//通过加一些条件判断 能否访问属性if(age < 18){console.log('没有成年')return false;}this.data.age = age; //通过判断进行处理}}//修改属性值res.age = 15//执行console.log(res.age) //没有成年
str.length :字符串长度str.search('查找的值') : 字符串索引 从0开始str.replace('原值','替换的值') : 字符串替换str.slice(开始,结束) : 起始索引,结束索引str.substr() : 起始值和获取的数量,不需要知道到哪结束str.split() : 字符串 => 数组str.join() : 数组 => 字符串toLowerCase() /toUpperCase(): 转换字母大写/小写push/pop :尾部添加/删除
let arr = [];arr.push('a') //在尾部添加返回数组的数量并不返回具体的值arr.pop() //从尾部开始删除并且返回删除的值
unshift/shift :头部添加/删除
let arr = [];arr.unshift('a') //在尾部添加返回数组的数量并不返回具体的值arr.shift() //从尾部开始删除并且返回删除的值
delete :删除任意数组,删除后还会有空白占位符,需要使用filter()过滤方法
let arr = [1,2,3];delete arr[1]
filter() : 过数组方法
let arr = [1,2,3];delete arr[1]arr.filter(item => item);console.log(arr) //[1,3]
keys()键值对方法
console.log(arr.keys())
返回一个迭代对象,使用for-of 遍历对象
let arr = ['小明','男','18'];//获取键 arr.keys()for(item of arr.keys()){console.log(item);}//获取值 valuefor(item of arr.values()){console.log(item);}//键值对 [key,value]for(item of arr.entries()){console.log(item);}
数组的增删改
splice(‘起始位置’,’删除数量’,’附加元素(可选)’);
let arr = ['小明','男','18'];//删除console.log(arr.splice(0,2)); // ['男'] 被删除后返回组成的数组//添加console.log(arr.splice(1,0,'111'));//数量为0 表示不删除,在当前索引后添加新元素//更新console.log(arr.splice(1,1,'五班'));//数量为1 表示在索引1删除1个值后再添加'五班'
sort()
排序模板: a-b 从小到大, b-a从大到小
arr.sort(function(a,b){
retrun a-b
});
let arr = [1,25,163,154,12]arr.sort((a,b) => a-b) // 从小到大排序arr.sort((a,b) => b-a) //从大到小排序
let a =[1,1,1,1,]
let b = [2,2,2,2,2]
let c = [3,3,3,3,3]
let d = […a,…b,…c]
//同步回调函数function add(a,b){return a + b}function sum(a,b,callback){return callback(a,b)}let res = sum(10,50,function(a,b){return add(a,b)});console.log(res)
let arr = ['小明','18','三班','五年级'];arr.forEach(item=>item)//没有返回值arr.map(item=>item) //有返回值
every(callback) //返回值是布尔值 所有值都满足条件才会返回true
some(callback) // 只要满足一个条件就可以返回true
let arr = [15,8,59,66,3];arr.every(item => item > 10) //falsearr.some(item => item > 10) //true
let arr = [15,8,59,66,3];//filter(callback) //过滤符合的值,并且返回新的数组arr.filter(item => item > 10) //[15,59,66]//find(callback) // 返回新数组的第一个值arr.find(item => item > 10) //15//findLast(callback) //返回新数组最后一个值arr.findLast(item => item > 10) //66//findIndex(callback) //返回新数组第一个索引值arr.findIndex(item => item > 10) //0//findeLastOf(callback) //返回新数组最后一个索引值//lastIndexOf获取最后一个索引值,分两步//1. 先过滤获取最后一个值let res = arr.findLast(item => item > 10) //66//2. 获取当前索引值arr.lastIndexOf(res) //3
语法:
reduce(function(前一个值,当前值),{
…
最终的累加结果,由前一个值返回
}起始值)
//reduce(callback,init)arr.reduce((prev,curr)=>prev+curr)//解析let res = arr.reduce(fucntion(prev,curr){return prev + curr;// prev = 1, curr = 2, prev = 3// prev = 3, curr = 3, prev = 6// prev = 6, curr = 4, ...})console.log(res)
class
属性
constructor()
method(){} 简写
get method() / set method()
static 关键字
extends / super
//构建函数class User{//属性constructor(name){this.name = name}//方法say(){return `${this.name}`}//静态static age = '15'}let res = new User('小马')console.log(res.say())//继承class Child extends User{constructor(name,email){super(name)this.email = email}speak(){return `${this.name}:${this.email}`}}let resChild = new Child('小刘','123@qq.com')console.log(resChild.speak())//小刘 123@qq.com
<div class="box"> <1> </div><div class="box">2</div><div class="box">3</div><div class="box">4</div><div class="box">5</div>
querySelectorAll()
let item = document.querySelectorAll('.box');console.log(item)
querySelector()
let item = document.querySelector('.box');console.log(item)
关键字 forms 使用name值和id值都可以获取到
<form action="" id="form"><input type="email" value="123@qq.com" name="email" /><br /><input type="text" value="小刘" name="uname" /><br /><input type="password" name="password" value="20230926" /></form>
const form = document.forms.form;const email = form.email.valueconst password = form.password.valueconsole.log(password)
let forms = document.forms.ID(表单的ID)
获取表单组件方法forms.email
let data = {uname,age}data = JSON.stringify(data,null,4)console.log(data)
children: 元素类型子节点firstElementChild: 第一个子元素lastElementChild: 最后一个子元素nextElementSibling: 下一个兄弟元素previousElementSibling: 前一个兄弟元素parentElement: 父元素contains(): 判断是否是后代元素返回 true/false
<ul class="box"><li>item1</li><li>item2</li><li>item3</li><li>item4</li><li>item5</li></ul>
// 获取元素let list = document.querySelector('.box');//获取元素下的子元素let item = list.children//获取第一个子元素item = item.firstElementChild//获取最后一个子元素item = item.lastElementChild//获取下一个兄弟元素item = item.nextElementSibling//获取前一个兄弟元素item = item.previousElementSibling//获取子元素的父元素list = item.parentElement//判断是否是父元素的后代 返回true/falselist.contains(item)
createElement()
append()
createDocumentFragment()
after()
before()
coneNode(true): true深度克隆的到内部所有的后代元素
replaceChild(新节点,旧节点)
remove()
//创建元素let ul = document.createElement('ul');//追加在body中document.body.append(ul)//追加元素ul.append('<li>追加元素</li>');//创建文档片段(可以理解为把所有新建的元素统一追加在片段中后,再由片段追加在容器中)let list = document.createDocumentFragment();//创建新元素let p1 = document.createElement('p')//新元素赋值p1.textContent = 'Paragraph 1'//将创建的新元素添加到文档片段中list.append(p1);//把文档片段插入容器中ul.appendChild(list);//在元素后追加let box = document.querySelector('.box');box.after('在box后面追加');//在元素前面追加box.before('在box前面追加');//克隆节点cloneNode(true)为true时候深入克隆所有的后代元素let cone = ul.cloneNode(true);//替换元素(元素必须是节点才可以替换)let newText = box.lastElementChildlet boxFri = box.firstElementChildbox.replaceChild(newText, boxFri)//删除newText.nextElementSibling.remove();
textContent: 全部内容(js,css,隐藏内容)innerText: 返回已经渲染(可见)内容innerHTML: 返回子元素的HTML内容(html)outerHTML: 返回整个元素以及所有的子元素的HTML标记(html)
let box = document.querySelector('.box');//显示全部内容包含样式与已经隐藏了内容 并且可以更改box.textContent//返回已经解析后的(可见)内容 并且可以更改box.innerText//返回元素里的子元素HTML内容 并且可以更改box.innerHTML//返回整个元素以及所有子元素的HTML 并且可以更改box.outerHTML
beforebegin: 元素自身的前面afterbegin: 插入元素内部的第一个子节点之前beforeend: 插入元素内部的最后一个子节点之后afterend: 元素自身的后面insertAdjacentElement(): 指定位置插入元素insertAdjacentText(): 指定位置插入文本节点insertAdjacentHTML: 指定位置插入元素节点
//指定位置插入// let box = document.querySelector('.box');//指定位置插入必须是元素节点// box.insertAdjacentElement('beforebegin','111')//指定位置插入是HTML元素节点// box.insertAdjacentHTML('beforebegin','111')//指定位置插入是文本// box.insertAdjacentText('beforebegin','111')//创建节点let h3 = document.createElement('h3');// 元素自身的前面h3.append('111');// 在元素自身的前面插入元素// box.insertAdjacentElement('beforebegin',h3)// 在元素自身的后面插入元素// box.insertAdjacentElement('beforeend',h3)// 在元素内部第一个子节点插入元素// box.insertAdjacentElement('afterbegin',h3)// 在元素内部最后一个子节点插入元素// box.insertAdjacentElement('afterend',h3)let h2 = `<h2>标题</h2>`//方法同上box.insertAdjacentHTML('beforebegin',h2)box.insertAdjacentHTML('beforeend',h2)box.insertAdjacentHTML('afterbegin',h2)box.insertAdjacentHTML('afterend',h2)let text = '文本'box.insertAdjacentText('beforebegin',text)box.insertAdjacentText('beforeend',text)box.insertAdjacentText('afterbegin',text)box.insertAdjacentText('afterend',text)
<inputtype="text"style="height: 25px"autofocusonkeydown="submit(this)"placeholder="输入留言"/><ul class="list"></ul>
function submit(eve){//值不能为空if(eve.value.length === 0){alert('不能为空!')return false;}else{//获取容器const ul = document.querySelector(".list");//先把值传到新建的节点<li>中,然后插入在ul容器中afterbegin容器的第一个元素,并且添加删除按钮与事件ul.insertAdjacentHTML("afterbegin",`<li>${eve.value}<button onclick="del(this.parentElement)">删除</button></li>`);}//删除事件function del(eve) {return confirm('是否直接删除') ? eve.remove(): false;}}
dataset: 读取自定义属性 data-自定义属性前缀
<div class="divbox" data-name-user="小刘">20231009</div>
let divbox = document.querySelector('.divbox');divbox.dataset.nameUser = '小明1'console.log(divbox.dataset.nameUser) //小明
<style>.divbox{width: 100px;height: 100px;background-color: darkcyan;color: #fff;}</style><div class="divbox" data-name-user="小刘">20231009</div>
//获取元素let divbox = document.querySelector('.divbox');//获取width的值,返回字符串let width = window.getComputedStyle(divbox).width//设置行内样式width = parseInt(width) + 100+'px'divbox.style.width = width
classList: 对元素上的class进行增删改查
classList.add(): 添加 可以连续添加(‘a’,’b’)classList.contains(): 判断是否包含类名 返回true/falseclassList.replace(): 替换(旧值,新值)classList.remove(): 移除classList.toggle(): 如果类名存在就删除,如果不存在就添加事件方法中如果使用到了
this千万不要使用箭头函数(因为它没有自己的this)
它的this是上下文的(执行环境)
onclick: 点击事件
//点击事件btn.onclick = function(){console.log(this)}//删除点击事件btn.onclick = null
addEventListener()
//addEventListener('事件名称',方法)//可以添加多个同名的事件方法,会按照顺序执行多个事件btn.addEventListener('click',function(){console.log('第一个事件')});btn.addEventListener('click',function(){console.log('第二个事件')});...
addEventListener('click',functuion): 事件添加
removeEventListener('click',function): 删除事件的时候,方法要单独写
dispatchEvent(): 事件派发,把事件委托到别处并且自动执行
...//添加事件box.addEventListener('click',function(){console.log('1')})//事件删除,如果有方法的话,把方法封装后再进行添加和删除如下:const show = function(){console.log(1)}//先添加事件box.addEventListenner('click',show);//删除事件box.removeEventListener('click',show);//事件派发//创建事件对象固定语法 new Event('事件')const res = new Event('click');box.dispatchEvent(res)//
setTimeout(function,time): 一次性执行,只执行一次setInterval(function,time): 间接式执行clearTimerout(): 删除一次性执行的定时器clearInterval(): 删除间接式定时器
//一次性执行let i = 0;let out = setTimeout(function(){i++;console.log(i)//1},1000);//删除一次性执行clearTimerout(out);//每间隔1s执行一次let val = setInterval(function(){i++;console.log(i) //每隔一秒将会执行一次//停止间隔执行//一般会有一个条件判断,执行停止 用在倒计时上面比较多clearInterval(val);},1000);
eve.stopPropagation(): 事件由内向外,逐级向上传递一直到根元素
eve.preventDefault(): 禁止默认行为,点击后没有任何反应
box.addEventListenner('click',function(){console.log('父元素')});item.addEventListenner('click',function(eve){console.log('子元素');eve.stopPropagation(); //点击子元素将不会执行})
ev.currentTarg: 绑定主体ev.target: 事件触发主体
box.addEventListener('click',function(eve){console.log(eve.currentTarget) //事件绑定的主体console.log(eve.target.textContent) //事件触发主体});
onchange: 当表单的值发生改变时触发onsubmit: 提交表单时候触发onfocus: 获取表单元素焦点时候触发onblur: 表单失去焦点时候触发onkeydown: 当按下键盘触发onkeyup: 当键盘弹起时触发onkeypress: 当按住键盘触发onclick: 点击表单元素后触发
使当前的script支持模块功能
<script type="module">
….
</script>
export 导出关键字import moduleName from './module.js': 导入固定语法
//模块A导出export function multiply(a,b){return a*b};export const PI = 3.14159;//模块B导入import {multiply,PI} from './moduleA'console.log(multiply(2,3))console.log(PI)
//模块A 导出function square(x){return x*x}function cube(x){return x*x*x;}export {square,cube}//模块B 导入 * asimport * as math from './moduleA';console.log(math.square(3)) //输出 9console.log(math.cube(3)) //输出 27
//模块A 导出function square(x){return x*x}function cube(x){return x*x*x;}//别名导出export {square, cube as cubes}//模块B 别名导入import {square as squarer, cubes} from './moduleA'console.log(squarer(3)) //输出 9
比较常用使用类来打包
//模块Aexport class User{constructor(uname){this.uname = uname}greet(){return `欢迎您${this.uname}`}}//模块Bimport {User} from './moduleA';const user = new User('小刘');console.log(user.greet())
default 默认导出 关键字
一个模块中只有一个默认导出
``javascript //模块A export default class{ constructor(uname){ this.uname = uname } greet(){ return你好${this.uname}`
}
}
//模块B
//默认导入就不需要使用{} user1 任意命名
import user1 from ‘./moduleA’;
const user = new user1(‘小刘’);
console.log(user.uname) //你好小刘
#### 混合导出> 默认的不要加{}, add, {a,b}```javascript// 模块A//默认导出export default function add(a, b) {return a + b;}export function subtract(a, b) {return a - b;}export function multiply(a, b) {return a * b;}//模块Bimport add,{ subtract, multiply } from './moduleA';console.log(add(2, 3)); // 输出:5console.log(subtract(5, 2)); // 输出:3console.log(multiply(2, 3)); // 输出:6
number ,string ,boolean ,null ,array ,object
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号