CSS
一、css的flex布局
弹性盒子由弹性容器(Flex container)和弹性子元素(Flex item)组成。
display: flex; 将元素设置为 Flex 容器。
flex-direction: 定义主轴的方向(默认为 row,即水平方向)。
flex-wrap: 定义项目是否换行(默认为 nowrap,即不换行)。
align-items 弹性盒子元素在侧轴(纵轴)方向上的对齐方式。
弹性子元素属性
使用弹性盒子,居中变的很简单,只需要设置margin: auto
CSS的Flex布局(也称为Flexbox或弹性盒子布局)是一个在CSS3中引入的新的布局模式,用于在一维方向上布局、对齐和分发空间在容器中的项(items)。Flex布局特别适用于设计复杂的网页布局,因为它提供了很多在块级和行内布局模型中无法实现的功能。
Flex布局的基本概念
- Flex容器(Flex Container):使用display: flex;或display: inline-flex;声明的元素。
- Flex项(Flex Items):Flex容器的子元素自动成为Flex项。
Flex容器的属性
- flex-direction: 定义主轴的方向(默认是水平方向,即row)。
- flex-wrap: 定义Flex项是否应该换行(默认是nowrap,即不换行)。
- justify-content: 定义Flex项在主轴上的对齐方式。
- align-items: 定义Flex项在交叉轴上的对齐方式。
- align-content: 定义多行Flex项在交叉轴上的对齐方式(当flex-wrap为wrap时有效)。
Flex项的属性
- order: 定义Flex项的排列顺序(数字越小越排在前面,默认为0)。
- flex-grow: 定义Flex项的放大比例,默认为0,即如果有剩余空间也不放大。
- flex-shrink: 定义Flex项的缩小比例,默认为1,即如果空间不足将缩小。
- flex-basis: 定义Flex项在主轴上占据的固定空间大小,默认值为auto。
二、Grid 网格
container {
display: grid;
}//定义一个网格
.CSS Grid 网格模型是一种二维布局系统,它为Web开发人员提供了一种强大的方法来设计和实现复杂的页面布局。自从2017年成为CSS标准的一部分以来,Grid布局已经成为创建响应式、灵活的网页布局的关键技术。以下是Grid布局的一些核心概念和特性:
基础概念
- 容器(Grid Container):通过将一个元素的display属性设置为grid或inline-grid,该元素就变成了Grid容器。容器定义了一个网格结构,用于布局其直接子元素。
- 项(Grid Items):Grid容器内的子元素自动成为Grid项,它们按照Grid容器定义的布局排列。
定义网格结构
- Grid Template Rows and Columns:使用grid-template-rows和grid-template-columns属性定义网格的行和列尺寸。可以使用长度单位、百分比、关键词(如auto、min-content、max-content)或fr单位(代表可用空间的分数)来设定尺寸。
- Grid Gap:使用gap属性(或旧版的grid-gap、grid-row-gap、grid-column-gap)设置网格行和列之间的间距。
- Repeat Function:repeat()函数允许你重复一个给定的轨道大小定义,比如repeat(3, 1fr)会创建三列,每列宽度为1fr。
置放网格项
- Grid Lines:网格线定义了行和列的边界,编号从1开始。
- Grid Areas:使用grid-template-areas属性可以定义网格区域,通过名称而不是具体的行和列坐标来放置项目,提高布局的语义性和可维护性。
- Grid Placement:使用grid-row和grid-column属性(或简写的grid-area)可以精确控制每个Grid项在网格中的位置。也可以使用数值、关键词(如span、start、end)或命名的区域来指定位置。
特性与优势
- 二维布局:与Flexbox(主要用于一维布局)相比,Grid布局提供了真正的二维控制,独立管理行和列。
- 响应式设计:轻松创建适应各种屏幕尺寸的复杂布局,无需媒体查询也能实现流式布局。
三、css选择器及其权重
元素选择器(如 p, div): 权重为 1。
类选择器(如 .myClass): 权重为 10。
ID选择器(如 #myId): 权重为 100。
属性选择器(如 [type="text"]): 权重相当于类选择器,为 10。
元素选择器:直接通过HTML元素名来选择元素。例如,p 会选择所有的 <p> 元素。
类选择器:使用 . 符号和类名来选择元素。例如,.myClass 会选择所有带有 class="myClass" 的元素。
ID选择器:使用 # 符号和ID名来选择元素。ID在HTML文档中应该是唯一的。例如,#myID 会选择 id="myID" 的元素。
属性选择器:通过元素的属性来选择元素。例如,[target="_blank"] 会选择所有 target 属性值为 "_blank" 的元素。
四、CSS垂直居中
- Flexbox(弹性盒子模型):
-
- 在父元素上设置 display: flex; 和 align-items: center;
.parent {
display: flex;
align-items: center; /* 垂直居中 */
justify-content: center; /* 水平居中 */
height: 200px; /* 设定父元素高度 */
}
- Grid(网格布局):
-
- 将父元素设置为 display: grid;,并使用 align-content: center; 或 align-items: center; 来实现垂直居中。
.parent {
display: grid;
align-items: center; /* 垂直居中 */
justify-items: center; /* 水平居中 */
height: 200px; /* 设定父元素高度 */
}
3.使用绝对定位(position)和外边距(margin)
<div class="father">
<div class="left"></div>
<div class="center"></div>
<div class="right"></div>
</div>
<style>
.left, .right {
position: absolute;
height: 300px;
width: 200px;
top: 0;
}
.left {
left: 0;
}
.right {
right: 0;
}
.center {
margin: 0 200px;
height: 300px;
}
</style>
五、内联样式的优先级
内联样式(Inline Styles)具有最高的优先级,内联样式直接作用于元素本身
通过在HTML元素的style属性中直接定义CSS规则来实现的,例如:
<p style="color: red;">这段文字将会是红色。</p>
六、盒模型以及种类 Box Model
这个盒子由以下几个部分组成:
- 内容区域(Content):这是元素实际包含的内容,如文本、图片或其它嵌套的元素。
- 内边距(Padding):围绕在内容区域外部的空白区域,可以设置上下左右不同的内边距值,控制内容与边框的距离。
- 边框(Border):围绕内边距和内容的可选线条,可以设定样式、宽度和颜色。
- 外边距(Margin):位于边框之外的空白区域,用于控制元素与其他元素之间的距离,同样可以分别设置上下左右的外边距。
1. W3C标准盒模型(Standard Box Model)
- 在此模型中,元素的总宽度(或高度)由内容宽度(或高度)、内边距、边框宽度共同决定,外边距不计入元素的总尺寸内。
- 计算公式为:总宽度 = width + padding(左右) + border(左右) + margin(左右)。
- 可以通过CSS的box-sizing: content-box;来指定使用此模型,这是默认行为。
2. IE盒模型(Quirks Mode Box Model)或怪异盒模型
- 在此模型中,元素的指定宽度(或高度)包含了内容宽度(或高度)、内边距和边框宽度。
- 计算公式为:总宽度 = width(已含padding和border)+ margin(左右)。
- 使用box-sizing: border-box;
七、三列布局
三列布局是一种常见的网页布局方式,其主要特点是将网页内容分为三个部分,左右两列固定宽度,中间一列自适应宽度。
1. 使用浮动(Floats)
浮动是最传统的布局技术之一,通过将左右两侧栏设置为浮动元素,并让中间内容区域自然环绕它们。
1.left-column {
2 float: left;
3 width: 25%;
4}
5.main-content {
6 float: left;
7 width: 50%;
8}
9.right-column {
10 float: right;
11 width: 25%;
12}
.container {
overflow: auto; /* 或者使用clearfix技术来包含浮动 */
}
.left {
float: left;
width: 200px; /* 左侧栏宽度 */
}
.right {
float: right;
width: 200px; /* 右侧栏宽度 */
}
.main {
margin: 0 200px; /* 左右留出侧边栏宽度 */
}
2. 使用Flexbox(弹性盒子)
Flexbox提供了一种更现代、灵活的方式来布局元素,特别适合创建响应式设计。
1.container {
2 display: flex;
3}
4.left-column, .right-column {
5 flex: 1;
6}
7.main-content {
8 flex: 2;
9}
.container {
display: flex;
}
.left, .right {
flex: 0 0 200px; /* 固定宽度 */
}
.main {
flex: 1; /* 自适应宽度 */
}
3. 使用Grid(网格)
CSS Grid布局是一种二维布局系统,非常适合创建多列布局。
.container {
display: grid;
grid-template-columns: 200px 1fr 200px; /* 两侧固定宽度,中间自适应 */
}
.left {
grid-column: 1;
}
.right {
grid-column: 3;
}
.main {
grid-column: 2;
}
JS
一、js数据类型
1、基本数据类型
String,布尔,整数,浮点数
2、对象类型(Object Types)
允许你将多个值作为单个实体来引用。JavaScript中的大多数内容都是对象,包括函数、数组、日期等。
- Object:JavaScript中的对象是一组无序的属性集合,每个属性都有一个名字和一个值。属性的名字是字符串,而值可以是任何数据类型。
- Array:数组是一种特殊的对象,用于存储多个有序的值。数组中的每个值(通常称为元素)都有一个索引,用于在数组中访问该元素。
- Function:函数也是对象,它们可以被赋值给变量、作为参数传递或作为返回值。函数用于执行特定的任务或计算,并可能返回一个值。
- Date:日期对象用于处理日期和时间。
- RegExp:正则表达式对象用于匹配、替换或测试字符串。
- Error 和其子类(如 TypeError、ReferenceError 等):用于表示和处理错误。
二、js中,this关键字
1. 全局上下文中的this
在全局上下文中(不在任何函数内部),this 引用的是全局对象。
2. 函数上下文中的this
- 直接调用:如果函数是直接被调用的,那么 this 指向全局对象
- 作为对象的方法调用:如果函数是对象的一个属性,并通过该对象被调用,那么 this 指向该对象。
- 使用call、apply或bind方法调用:这些方法允许你显式地设置函数执行时的 this 值。
3. 箭头函数中的this
箭头函数不绑定自己的 this,this 的值继承自包围它的函数或全局对象。这使得箭头函数在需要引用外部 this 的回调函数中特别有用。
const obj = {
name: 'Bob',
greet: function() {
setTimeout(() => {
console.log(this.name); // 'Bob'
}, 1000);
}
};
obj.greet();
4. 构造函数中的this
在构造函数中,this 引用新创建的对象实例。
三、bind,call,apply的区别
返回值: call() 和 apply() 直接返回函数执行的结果,而 bind() 返回一个改变了this上下文的新函数,这个新函数可以再传入其他参数后执行。
参数书写方式不同
- call()的第一个参数是this要指向的对象,后面传入的是参数列表,参数可以是任意类型;
- apply():第一个参数是this要指向的对象,第二个参数是数组
- 参数传递: call() 接受单独列出的参数,apply() 接受一个参数数组,而 bind() 既可以接受单独列出的参数也可以接受数组,但不会立即执行。
//例如:
var obj = {}//定义一个空的对象
function f(x,y){
console.log(x,y)
console.log(this) //this是指obj
}
f.apply(obj,[1,2]) //后面的值需要用[]括起来
f.call(obj,1,2) //直接写
四、ES6新特性,主要数组方法的使用以及区别
Array.from()
- 用途: 将类数组对象(具有length属性和索引元素)或可迭代对象转换为真正的数组。
- 用法:
const arrayLike = {0: 'a', 1: 'b', length: 2};
const arr = Array.from(arrayLike); // ['a', 'b']
Array.of()
- 用途:创建一个具有可变数量参数的新数组实例,而不考虑参数的数量或类型。
- 示例:
const array = Array.of(1, 2, 3); // [1, 2, 3]
- find()
-
- 用途:返回数组中满足提供的测试函数的第一个元素的值。否则返回undefined。
- findIndex()
-
- 用途:返回数组中满足提供的测试函数的第一个元素的索引。否则返回-1。
五、js异步Promiase
一个 Promise 对象代表一个最终可能完成(也可能被拒绝)的异步操作及其结果值。它有以下状态:
- Pending(待定):初始状态,既不是成功,也不是失败状态。
- Fulfilled(已实现):意味着操作成功完成。
- Rejected(已拒绝):意味着操作失败。
Promise 的使用
一个 Promise 对象可以通过调用 new Promise(executor) 来创建,其中 executor 是一个函数,它接受两个参数:resolve 和 reject。这两个函数都是 Promise 构造函数提供的,分别表示异步操作成功或失败时的回调函数。
链式调用:Promise支持链式调用,即.then()和.catch()方法,用于注册fulfilled状态和rejected状态的回调函数
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
// 模拟异步操作,例如网络请求
if (/* 请求成功 */) {
resolve('操作成功!');
} else {
reject(new Error('操作失败!'));
}
}, 1000);
});
// 使用 .then() 处理成功的情况
// 使用 .catch() 处理失败的情况
promise.then(result => {
console.log(result); // 输出:操作成功!
}).catch(error => {
console.error(error); // 如果失败,输出错误信息
});
六、var,let,const区别
var, let, 和 const 都是JavaScript中用于声明变量的关键字
1. 作用域
- var: 具有函数作用域或全局作用域。如果在函数外部使用var声明变量,它会成为全局变量。即使在块级结构(如if语句或for循环)中声明,var变量也会被提升至包含它的函数或全局作用域。
- let 和 const: 只在声明它们的块(例如循环体、条件语句块等)中有效。
2. 变量提升(Hoisting)
- var: 存在变量提升现象,变量可以在声明之前使用,此时变量的值为undefined。
- let 和 const: 不会发生变量提升。在声明之前访问它们会导致引用错误
3. 重复声明
- var: 允许在相同作用域内重复声明同一个变量,这可能会导致意外的行为。
- let 和 const: 在相同作用域内不允许重复声明,尝试这么做会导致语法错误。
4. 变量的可变性
- var 和 let: 声明的变量是可变的,即可以在声明后改变其值。
- const: 声明的是常量,一旦赋值后就不能再修改。
Vue
一、用vue开发和正常开发有什么区别
- 组件化开发:
-
- Vue强调组件化开发,即将一个大型的应用拆分成多个小的、可复用的组件。这使得代码更加模块化、可维护性更强。
- 传统开发中,开发者可能会将HTML、CSS和JavaScript混合在一起,导致代码难以维护。而Vue通过组件化的方式,使得代码结构更加清晰,易于理解和复用。
- 数据绑定与响应式更新:
-
- Vue: 使用Vue的核心特性——数据绑定,开发者只需关注数据模型,Vue会自动处理数据变化到视图的更新,实现双向绑定(Vue 2中通过v-model指令)或单向数据流(Vue 3推荐)。这与传统开发中手动操作DOM来同步数据变化形成了鲜明对比。
- 传统开发: 在没有框架的情况下,开发者必须手动编写JavaScript来监听数据变化,并相应地修改DOM,这既繁琐又容易出错。
- 路由管理与状态管理:
-
- Vue: 通过Vue Router可以轻松管理页面路由,Vue的状态管理库Vuex则帮助管理全局状态,使状态变更更加集中和可预测。
- 传统开发: 路由和状态管理往往需要自己实现,缺乏标准化解决方案,容易导致混乱和错误
二、Vue 3 的生命周期有哪些
- 创建阶段:
-
- setup(): Vue 3 中,setup() 函数替代了 Vue 2 中的 beforeCreate 和 created 钩子。它会在 beforeCreate 和 created 之前执行,此时组件实例尚未被创建,但可以通过 setup() 函数的参数访问 props 和 context。在这个阶段,可以创建响应式数据、计算属性和方法等。
- 挂载阶段:
-
- onBeforeMount(): 组件即将被挂载到 DOM 之前调用。此时,组件已经完成了其响应式状态的设置,但还没有创建 DOM 节点。
- onMounted(): 组件挂载到 DOM 后调用。
- 更新阶段:
-
- onBeforeUpdate(): 组件即将因为响应式状态变更而更新其 DOM 树之前调用。此时,你可以访问到更新前的 DOM,但组件实例的响应式状态还未更新。
- onUpdated(): 组件更新后调用。此时,组件 DOM 已经更新,你可以访问到更新后的 DOM。
- 卸载阶段:
-
- onBeforeUnmount(): 组件即将被卸载之前调用。在这个阶段,可以执行清理任务,如取消定时器、解绑全局事件等。
- onUnmounted(): 组件卸载后调用。此时,组件实例已经被销毁,无法再访问到组件的状态和 DOM。
三、vue3的computed
computed又被称作计算属性,用于动态的根据某个值或某些值的变化,来产生对应的变化。
在Vue 3中,你不再直接在组件的选项API中定义 computed 属性,而是通过 setup() 函数内使用 computed() 方法来定义计算属性。computed() 接受一个 getter 函数作为参数,并返回一个可读写的计算属性。
computed ()接受一个 getter 函数,返回一个只读的响应式 ref 对象。该 ref 通过 .value 暴露 getter 函数的返回值。它也可以接受一个带有 get 和 set 函数的对象来创建一个可写的 ref 对象。
四、vue路由设置
router的文件夹,并在其中创建一个index.js文件来配置路由。在这个文件里,你会定义各个路由及其对应的组件:
// src/router/index.js
import Vue from 'vue'
import VueRouter from 'vue-router'
import HomeComponent from '../components/HomeComponent.vue'
import AboutComponent from '../components/AboutComponent.vue'
Vue.use(VueRouter)
const routes = [
{ path: '/', component: HomeComponent },
{ path: '/about', component: AboutComponent }
]
export default new VueRouter({
mode: 'history', // 使用history模式去除URL中的#
routes
})
在你的主入口文件(通常是src/main.js)中引入并使用Vue Router:
// src/main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router' // 引入路由
Vue.config.productionTip = false
new Vue({
router, // 将路由器注入Vue实例
render: h => h(App),
}).$mount('#app')
在Vue组件中,你可以使用<router-link>来创建导航链接,并用<router-view>来展示根据当前路由匹配的组件:
<!-- 在App.vue或其他组件中 -->
<template>
<div id="app">
<router-link to="/">首页</router-link>
<router-link to="/about">关于我们</router-link>
<router-view></router-view> <!-- 路由出口 -->
</div>
</template>