首页
关于
Search
1
实习日记 03 写下拉多选组件
10 阅读
2
less
10 阅读
3
实习日记02 看项目首页源码
9 阅读
4
时间复杂度与空间复杂度
8 阅读
5
链表
8 阅读
默认分类
实习
相关学习
算法
前端
登录
Search
Typecho
累计撰写
22
篇文章
累计收到
1
条评论
首页
栏目
默认分类
实习
相关学习
算法
前端
页面
关于
搜索到
6
篇与
的结果
2022-06-14
小程序
问题小程序是单页面应用吗?小程序的开发是如何发送请求请求数据的?微信小程序的四种类型网络请求?小程序获取定位的方法?小程序中数据如何同步渲染?小程序的生命周期?小程序的rpx单位?微信小程序和vue区别?小程序原理?Bindtap和catchtap区别?Wxml和html异同?小程序三种事件对象的属性列表?小程序优势劣势?答案:小程序相关小程序是单页面应用,通过路由进行页面切换小程序的开发是如何发送请求请求数据的?微信小程序只能和指定的域名进行通信,需要进行配置。且域名只支持https协议和wss协议,域名也不能使用ip地址且必须经过备案。微信小程序的四种类型网络请求?普通http请求 wx.request 上传文件wx.updateFile载文件wx.downloadFile webSocket通信wx.connectSocket 小程序不存在跨域的限制,是因为小程序并不运行在浏览器中getlocation 获取定位小程序中数据如何同步渲染通过setdata方法Setdata原理:小程序分为逻辑层和渲染层,逻辑层改变后要通过native运行。渲染层和逻辑层分别由两个线程管理,渲染层界面使用了webView进行渲染,逻辑层采用jsCore线程运行js脚本。一个小程序存在多个页面,所以渲染层存在多个webview,这两个线程的通信经由微信客户端native做中转,逻辑层发送网络请求也是经过native 转发所以我们不要重复 setdata ,以及减少数据的传输量。我们的数据传输实际是一次 Javascript 脚本过程,当数据量过大时会增加脚本的编译执行时间,占用 WebView JS 线程。去除不必要的事件绑定( WXML 中的 bind 和 catch ),从而减少通信的数据量和次数。小程序的生命周期1 应用生命周期onLaunch() 应用第一次启动的时候,首先执行这里的事件。一般用于获取用户信息,这里不能使用setdada修改dataonShow() 小程序应用渲染之后,用户能看到组件等信息,这个时候执行onshow,用户切换到后台在切换回来的时候会执行onshow。一般用于用户返回的时候对内容进行重置onHide() 小程序被隐藏到后台的时候触发 一般用于用户切换到后台进行的暂停操作onError() 当应用发生错误的时候触发 onPageNotFound() 当小程序第一次打开找不到入口界面的时候触发 一般用户主页找不到跳转到另外的主页2 页面的生命周期(每次进入到一个新的页面)Onload() 监听页面加载onShow() 监听页面显示onReady() 监听初次渲染完成onHide() 监听界面隐藏onUnload() 监听页面卸载onPullDownRefresh() 监听用户下拉刷新onReachBottom() 监听上拉触顶onShareAppMessage() 监听用户分享转发onPageScroll() 监听页面滚动onResize() 监听页面尺寸发生改变 横竖屏onTabItemTap() 当该页面是指定的tab页面,再次点击这个tabbar对应的tab按钮,就会触发3 组件的生命周期Created 组件实例刚被创建好,此时还不能调用setdataAttacthed 组件初始化完毕,进入页面节点树时执行Ready 组件布局完成之后执行 Moved 组件实例被移动到节点树另一个位置的时候执行Detachd 组件离开页面节点数的时候触发小程序的rpx单位Rpx是微信独有的解决屏幕自适应的尺寸单位,他是规定屏幕宽度为750rpx,从而达到自动适配微信小程序和vue区别生命周期不一样,小程序的简单数据绑定不同,小程序用{{}} vue用 :显示隐藏元素不同 vue v-if v-show 小程序 wx-if hidden数据双向绑定不同,vue只需要在表单元素加v-model就可以,小程序则必须获取到表单元素改变的值,然后再把值赋给data中声明的变量小程序原理采用js,wxml,wxss三种技术进行开发,本质是单页面应用,所有的页面渲染和事件处理,都在一个页面内进行,页面的更新也是通过数据的更改来实现的。小程序分为webview和appServer,前者用来展示ui,后者用来处理逻辑、数据、接口调用,在两个进程中运行。Bindtap和catchtap区别相同:都是点击事件,点击触发不同:bindtap不会阻止冒泡,catchtap会阻止Wxml和html异同同:都是用来描述界面的构成 都是标签、属性等构成不同:标签名字不一样 一个在浏览器里预览一个在小程序开发工具中预览 组件封装不同小程序中没有dom树和window对象小程序三种事件对象的属性列表小程序优势劣势优势:无需下载 打开速度快 开发成本低 审核严格,较为安全劣势:限制多,页面大小不能超过1m 样式单一,幻灯片导航等不能修改 依托微信,麻烦宿主环境 安卓和ios
2022年06月14日
2 阅读
0 评论
0 点赞
2022-06-14
vue
问题Vue是单页面应用吗?Import和require?路由懒加载以及具体如何实现?vue图片懒加载以及js实现懒加载的原理?V-bind,v-model区别?Vue2.0双向绑定原理和缺陷?Vue3.0实现双向数据绑定的方法?路由导航守卫?HashRouter 和 HistoryRouter的原理和区别?组件之间通信方式?异步加载在mouted还是created?Vue的生命周期?Keep-alive组件?http和tcp的Keepalive?父子组件生命周期函数调用顺序?既然函数是引用类型,为什么 vue 的 data 还是可以用函数?$nextTick?V-if v-show 异同?Vuex?首页白屏如何解决?路由跳转和location.href的区别?Computed和watch区别?混入?Vue提升性能的几种办法?虚拟DOM和diff算法?如何进行路由跳转?Push和replace区别?路由跳转的时候所带的参数params和query参数区别?编程式导航跳转到当前路由(路由未变的跳转),会报错的解决办法?如果params的数据是’’,无法跳转如何解决?路由组件能不能传递props数据?答案:Vue是单页面应用单页面应用是指公共资源仅加载一次,页面加载只发送一次请求,直接把所有需要的html,css,js都加载完毕,后续的数据更新与交互是通过路由跳转和发送ajax请求来完成的。优点是页面跳转很快,只是路由跳转而没有发送http请求,缺点是首屏加载时间太长和seo效果差。优点:交互体验好,页面显示比较流畅。 前后端分离 服务器压力小缺点:首屏加载慢 不利于SEO Import和requireRequire是AMD规范,import是es6的语法标准Require运行的时候调用,所以说可以放在任何地方用,import是编译的时候调用,必须放在开头的位置两者都是模块化的体现Import和require会返回一个promise对象路由懒加载Vue是单页面应用,如果没有懒加载会导致运用webpack打包后文件变得很大,造成进入首页时需要加载的东西很 多时间过长,则会出现长时间的白屏,不利于用户体验,懒加载可以将页面进行划分,需要的时候加载页面,能够有效分担压力,减少页面加载用的时间路由懒加载的办法Component写路由名字的时候利用import或者require,由于两者是返回一个promise函数,所以说vue router只会在第一次进入这个页面的时候才会获取函数,然后使用缓存数据图片懒加载--vue-lazyload先把img标签中的src设置成同一张图片(像素较低的),然后将其真正的图片地址存储在img标签的自定义属性之中,当js监听到该图片元素进入可视窗口的时候,在把自定义属性中的地址存储到src属性中。实现方式, vue的话直接用插件可以定义默认状态图片和失败状态的图片Js原生的话需要监听页面的滚动,每次页面滚动都会获取可视区域的高度,最后在对图片到页面的高度与可视高度与滑动高度的大小进行比较,当图片出现在可视窗口内的时候进行属性的替换。V-bind,v-model区别V-bind单向数据绑定,数据只能从data流向页面。形式:v-bind:href=“xxx” xxx改变页面的url也会改变v-model双向数据绑定,修改页面数据后台数据也会变。(只用在ipnut,textarea,select)v-model = V-bind + oninput事件 @input="sth = $event.target.value"Vue2.0双向绑定原理和缺陷?采用数据劫持和发布订阅模式的方式,通过object.defineProperty()来劫持各个属性的setter,getter缺陷Vue实例创建后,无法检测到对象属性的新增或者删除(object.defineProperty只能劫持到对象的属性),只能追踪到是否被修改--------创建一个vue实例的时候,会遍历所有的dom对象,并给每个数据增加get和set。Get和set 可以观察数据的更改和更新数据。但是在vue实例创建之后在添加或删除一个属性,这个属性就没有get和set不能监听数组的变化---------实现数组的响应式是对数组的部分方法进行了重写实现的,但是只重写了push/pop/shift/unshift/splice/sort/reverse,其他的方法对数组进行改写检测不到。Vue3.0实现双向数据绑定的方法通过proxy实现,proxy--在目标对象之前架设一层拦截,外界对该对象的访问,都必须先通过这层拦截,因此可以对外界的访问进行过滤和改写。优点:可以利用proxy来处理一些非核心逻辑(如读取修改属性之前做验证等操作)可以劫持整个对象,并返回一个新对象 有13种劫持操作路由导航守卫步骤:先实例化一个VueRouter对象,把所有的路由组件都配置在里面主要是用于路由跳转的时候进行的一系列操作 分类:全局前置守卫(router.beforeEach)--导航开始的时候调用全局解析守卫(router.beforeResolve)---指所有组件内守卫和异步路由组件解析后,但是导航还没有确认之前的全局后置守卫(router.afterEach)--主要用于分析,更改页面标题等路由独享守卫(全局守卫一致,不过没有router. 了)---定义在每个路由的配置上组件内守卫(beforeRouterEnter,...Update,...Leave)---VueRouter路由组件内定义(只针对当前组件的路由跳转,分为进入、更新、离开)beforeRouterEnter--是在渲染该组件前,组件实例创建之前的,所以不能获取thisbeforeRouterUpdate--当前路由改变,但是该组件被复用的时候调用,可以访问thisbeforeRouterLeave--在导航离开渲染该组件的对应路由的时候调用,可以访问thisHashRouter 和 HistoryRouter的原理和区别他们都是url改变的时候能够监听的到HashRouter--原理是利用了hashchange事件,能够在window监听hash的变化,vue-roter默认是hash模式--这种模式利用url的hash来模拟一个完整的url,就是项目中的#,#后面的hash发生变化的时候,不会导致浏览器给服务器发请求,并且会触发hashchange,可以通过监听hash值的变化来实现页面的更新。hash模式会创建hashHistory对象,访问不同的路由组件的时候会hashHistory.push(新路由放到栈顶)和hashHistory.replace记录浏览历史HistoryRouter--利用pushState(),replaceState()结合window.popstate(监听前进后退)实现的,pushState改变url地址不发请求,replaceState可以读取历史记录栈,还可以对浏览器的历史记录修改区别pushState设置的url可以是当前同源的所有url,而hash只能修改#后面的pushState新旧url可以一致,hash的则必须不一样pushState可以通过stateObject添加任意类型数据记录,hash只可以短字符串pushState可以设置title属性pushState兼容ie10,hash ie8pushState需要后端配合将所有的访问都指向index.html,否则刷新会404Hash模式不会请求服务器HashRouter 和 HistoryRouter的原理和区别他们都是url改变的时候能够监听的到HashRouter--原理是利用了hashchange事件,能够在window监听hash的变化,vue-roter默认是hash模式--这种模式利用url的hash来模拟一个完整的url,就是项目中的#,#后面的hash发生变化的时候,不会导致浏览器给服务器发请求,并且会触发hashchange,可以通过监听hash值的变化来实现页面的更新。hash模式会创建hashHistory对象,访问不同的路由组件的时候会hashHistory.push(新路由放到栈顶)和hashHistory.replace记录浏览历史HistoryRouter--利用pushState(),replaceState()结合window.popstate(监听前进后退)实现的,pushState改变url地址不发请求,replaceState可以读取历史记录栈,还可以对浏览器的历史记录修改区别pushState设置的url可以是当前同源的所有url,而hash只能修改#后面的pushState新旧url可以一致,hash的则必须不一样pushState可以通过stateObject添加任意类型数据记录,hash只可以短字符串pushState可以设置title属性pushState兼容ie10,hash ie8pushState需要后端配合将所有的访问都指向index.html,否则刷新会404Hash模式不会请求服务器异步加载在mouted还是created两者都可以,更多是在created中,因为能够更快的获取到服务端的数据,减少页面加载的时间,created加载的早一点。但是在created中dom元素还没有加载出来,如果需要操作dom的话放在mounted中。Vue的生命周期Vue 实例从创建到销毁的过程,就是生命周期。第一次页面加载会触发哪几个钩子?beforeCreate , created , beforeMount ,mounted 这几个钩子beforeCreate:创建前,此阶段为实例初始化之后,this指向创建的实例,此时的数据观察事件机制都未形成,不能获得DOM节点。data,computed,watch,methods 上的方法和数据均不能访问。可以在这加个loading事件。created:创建后,此阶段为实例已经创建,完成数据(data、props、computed)的初始化导入依赖项。可访问 data computed watch methods 上的方法和数据。初始化完成时的事件写在这里,异步请求也适宜在这里调用(请求不宜过多,避免白屏时间太长)。可以在这里结束loading事件,还做一些初始化,实现函数自执行。未挂载DOM,若在此阶段进行DOM操作一定要放在Vue.nextTick()的回调函数中。beforeMount:挂载前,虽然得不到具体的DOM元素,但vue挂载的根节点已经创建,下面vue对DOM的操作将围绕这个根元素继续进行。beforeMount这个阶段是过渡性的,一般一个项目只能用到一两次。mounted:挂载,完成创建vm.$el,和双向绑定完成挂载DOM和渲染,可在mounted钩子函数中对挂载的DOM进行操作。可在这发起后端请求,拿回数据,配合路由钩子做一些事情。beforeUpdate:数据更新前,数据驱动DOM。在数据更新后虽然没有立即更新数据,但是DOM中的数据会改变,这是vue双向数据绑定的作用。可在更新前访问现有的DOM,如手动移出添加的事件监听器。updated:数据更新后,完成虚拟DOM的重新渲染和打补丁。组件DOM已完成更新,可执行依赖的DOM操作。注意:不要在此函数中操作数据(修改属性),会陷入死循环。activated:在使用vue-router时有时需要使用来缓存组件状态,这个时候created钩子就不会被重复调用了。如果我们的子组件需要在每次加载的时候进行某些操作,可以使用activated钩子触发。deactivated:组件被移除时使用。beforeDestroy:销毁前,可做一些删除提示,如:您确定删除xx吗?destroyed:销毁后,当前组件已被删除,销毁监听事件,组件、事件、子实例也被销毁。这时组件已经没有了,无法操作里面的任何东西了。Keep-alive组件保存组件状态而不销毁,返回后仍在选本状态,避免了重复渲染。http和tcp的Keepalive状态保持或者重用机制,一条连接的建立不会被中断父子组件生命周期函数调用顺序执行顺序:父组件开始执行到beforeMount 然后开始子组件执行,最后是父组件mounted。如果有兄弟组件,父组件开始执行到beforeMount,然后兄弟组件依次执行到beforeMount,然后按照顺序执行mounted,最后执行父组件的mounted。当子组件挂载完成后,父组件才会挂载。当子组件完成挂在后,父组件会主动执行一次beforeUpdated/updated钩子函数(仅首次)父子组件在data变化中是分别监控的,但是更新props中的数据是关联的。销毁父组件时,先将子组件销毁后才会销毁父组件。兄弟组件的初始化(mounted之前)是分开进行,挂载是从上到下依次进行当没有数据关联时,兄弟组件之间的更新和销毁是互不关联的既然函数是引用类型,为什么 vue 的 data 还是可以用函数?Js中只有函数才会构成作用域,对象的{}和if的{}不构成,data是一个函数的时候每个组件实例都可以有自己的作用域,互不影响Vue中哪个生命周期内调用异步请求Created beforeMount mounted推荐在Created的钩子函数中调用异步请求Created能更快的获取到服务器端的数据,减少页面加载时间$nextTick由于vue dom更新是异步的,所以修改数据的时候不会立马更新,而是通过监听数据的变化,并缓存在同一事件循环之中,当前事件循环所有数据变化完成后在统一进行更新数据。使用$nextTick就是为了获取页面更新后的dom和数据。原理:运用宏任务和微任务定义一个异步的方法。V-if v-show 异同Vuex--vue中的状态管理工具Actions:修改异步请求(使用commit提交) 第一个默认参数是{commit}mutations:同步更改state状态 第一个默认参数是stategetter:对state中的数据进行过滤首页白屏如何解决路由懒加载 cdn加速 开启vue服务渲染模式 减少打包体积删除不必要的代码也可以添加loading效果,增强用户体验路由跳转和location.href的区别?路由跳转静态调整不刷新页面,location.href刷新页面Computed和watch区别Computed里的属性名是自定义的,可以监听一个或者多个所依赖的数据项,watch一次只能监听一个属性,这个属性的函数有两个参数,一个新值一个旧值Computed的自定义属性不能与data里面的重复,watch则必须是已经存在的属性Watch允许异步操作以及设置中间状态,Computed不可以混入 mixin 分发vue组件中可复用的功能(和公共组件差不多)1 定义一个混入对象(包含任意组件选项,例如created,methods等)2 定义一个使用混入对象的组件Var Component = Vue.extend({Mixins:[定义的混入对象] })3 var component = new Component()4 此时component 这个组件就拥有了混入对象的所有组件选项5 当使用混入对象的组件与混入对象有同名选项的时候会进行合并,本身的优先6 混入对象的钩子在组件自身钩子之前调用Vue提升性能的几种办法?懒加载 少用v-if 组件拆分,组件内部的运行不会影响其他外部组件 使用keep-alive切换路由 v-for加key 虚拟DOM和diff算法虚拟dom 通过js的object对象模拟dom中的节点,然后再通过特定的render方法将其渲染成真实的dom节点,最后通过appendChild()添加到页面中去,比操作真实dom节点更加节省性能。Diff算法对比新老虚拟DOM,记录变化,将变化部分更新到视图上。对操作前后的dom树同一层的节点进行对比,然后一层一层的对比下去。当一层节点有很多的时候也是会一个一个的对比,但是如果增加了一个key,diff算法就能够更快的识别更改的节点,并对其进行更改。Vue列表为什么加keyKey可以标识组件的唯一性,区别各个组件的key是为了可高效的更新虚拟DOM如何进行路由跳转?声明式导航和编程式导航。声明式导航就是router-link,编程式导航就是this.$router.push|replace。如果在进行路由跳转的时候还有其他事情要做,就可以使用编程式导航,因为是在方法中定义的。Push和replace区别,push能够记住历史,repalce不能记住(登陆后后退不能返回到登录页面)路由跳转的时候所带的参数params和query参数区别params参数:路由需要占位,属于URL当中一部分。 query参数,路由不需要占位,写法类似于ajax当中query参数。query传参需要配置path,params需要配置name,在params中配置path无效。query在路由配置中不需要设置参数,params必须设置。query传递的参数会显示在地址栏。params传参刷新后无效,query会保存传过来的值。编程式导航跳转到当前路由(路由未变的跳转),会报错,解决办法重写vue原型上的push和replace如果params的数据是’’,无法跳转如何解决?指定params参数值为undefined路由组件能不能传递props数据?可以,将query参数或params参数转换成props传递props: (route)=>({keyword1:route.params.keyword, keyword2: route.query.keyword })控制某个组件的显示和隐藏(即大部分情况下要用到,偶尔用不到)在路由的配置中利用meta配置和v-show实现。在使用组件的时候使用v-show对meta判断
2022年06月14日
3 阅读
0 评论
0 点赞
2022-06-14
浏览器
问题常见状态码?http的几种请求方法?Get和post区别?减少网页加载的办法?http协议中的header及含义?浏览器事件传输机制以及应用场景?LocalStorage、sessionStorage、indexexDB?浏览器事件循环机制?浏览器渲染过程?浏览器中的回流和重绘?Iframe?Defer和async的区别?同源策略与跨域?触发跨域场景?跨域问题解决方案?Cookie,token,session storage, localStorage 区别?Cookie中的属性?输入Url后的过程?浏览器垃圾回收机制?浏览器缓存机制?常见安全问题?常见http请求头和响应头?http和https区别?https中间人攻击?Http1.x,http2.x区别?Ajax原理?CDN?答案:常见状态码200 成功 301 永久重定向 302 临时重定向 304 命中缓存 403 没权限 404 服务器上没找到该资源 505服务器错误301和302区别相同:都表示重定向,即拿到这个状态码后会跳转到其他url不同:301是永久移除了之前的网站,302是以前网站还存在,只不过换了连接。http的几种请求方法Get 获取服务器资源,参数长度有限制,最长2048字节,明文传播,会在链接中显示Post 向服务器提交数据 无限制 放在请求体中传播Put 修改服务器资源Delete 删除服务器资源Get和post区别Get数据显示在url中,post数据不会显示在url中Get对数据长度有限制,最长是2048个字符,post无限制Get可收藏为书签,post不可以Get后退按刷新无影响,post数据会被重新提交编码类型不同Get历史参数会保留在浏览器历史中,post不会post更加安全get请求只会有一次tcp连接,post请求有两次减少网页加载的办法服务器:Cdn加速 gzip压缩 开启强缓存或者协商缓存 增加服务器带宽客户端:优化代码 减少dom操作添加事件委托 防抖节流 懒加载 精灵图 少用iframe浏览器事件传输机制---为了解决页面中事件发生顺序的问题事件触发的三个阶段----捕获阶段--目标阶段--冒泡阶段和定时器一样多一个参数,true代表捕获阶段,从外到内触发 1 2 3 False代表冒泡阶段,从内到外触发 3 2 1LocalStorage与sessionStorage、indexexDB相同:都是web存储的范畴 用于存储客户的本地数据 存储数据都是5m不同:数据生命周期来看LocalStorage被主动清理前一直有,sessionStorage关闭页面就没了indexexDB,是浏览器自带的数据库,包括索引、事务处理和查询功能特点:存储是以键值对形式存储的,所有类型数据都可以存储是异步的,操作的时候不会锁死浏览器。Webstroage是同步的支持事务 不能跨域 存储空间大 支持二进制存储事件循环机制的执行顺序首先,js执行代码分为同步任务和异步任务,同步任务会放到栈中依次执行,而异步任务是会放在任务队列中等到同步任务执行完毕后才执行,异步任务又分成宏任务和微任务,先执行宏任务,在执行宏任务产生的微任务,如果微任务中产生了微任务,那么则会等待宏任务的下一轮循环,先把首次遇到的微任务执行完毕,然后继续执行,等到没有任务可以执行的时候再去执行又产生的微任务浏览器渲染过程 DOM --- CSDOM --- render tree --- 回流得到节点几何信息 --- 重绘得到节点像素 --- 绘制浏览器中的回流和重绘回流--重新绘制当前整个页面,包括整个结构和样式重绘--重新绘制当前页面样式如何避免?1 最小化回流和重绘的次数2 使用文档片段fragmentIframe在Iframe标签可以定义图片网页等内容,当页面中代码大量相同的时候可以使用该标签将重复的部分嵌入优点:1 原封不动嵌入网页 2 多个网页引用ifrme可以只修改其中内容就全部修改3 增加复用性缺点:1 阻塞主页面onload事件(页面或图像加载后立即发生的事件就是onload)2 用的多的时候会导致滚动条多3 代码复杂,不利于搜索引擎优化4 兼容性差,增加服务器http请求Defer和async的区别主要是在执行时间,defer会在文档解析之后执行,并且多个defer会按照顺序执行,async则是在j's加载之后就会执行,并且在多个async 的时候是哪个加载好就执行哪个同源策略 协议 端口 域名是一个安全策略,限制文档的交互,避免恶意文档减少攻击。跨域 --- 协议 端口 域名任意一个不同触发跨域场景1.域名不同 (www.yangwei.com 和www.wuyu.com 即为不同的域名)2.二级域名相同,子域名不同 (www.wuhan.yangwei.com www.shenzheng.yangwei.com 为子域不同)3.端口不同,协议不同 ( http://www.yangwei.com 和https://www.yangwei.com属于跨域www.yangwei.con:8888和www.yangwei.con:8080)跨域问题解决方案1 jsonp利用script标签没有跨域限制的漏洞(src属性),网页可以得到从其他来源动态产生的json数据,也就是说从src标签访问跨域的数据是不会报错的,但是需要对方服务器做支持才可以(https://www.baidu.com?callback=getData)具体实现就是 然后在就可以访问跨域网址里面的东西了,再和后端商量函数或者变量的名称就可以直接调用了优点 兼容性好 缺点 仅支持get,容易XSS攻击Cors 跨域资源共享跨域资源共享是一种机制,它使用额外的http头来告诉浏览器,让运行在一个origin上的web应用被准许访问来自不同源服务器上的制定的资源。当一个资源从该资源本身所在的服务器不同的域、协议或者端口请求一个资源的时候,资源会发起一个跨域http请求设置方法:设置头部origin 然后设置方法get,post 就可以两种请求都可以了2 postMessagepostMessage是HTML5 XMLHttpRequest Level 2中的API,且是为数不多可以跨域操作的window属性之一,它可用于解决以下方面的问题:页面和其打开的新窗口的数据传递多窗口之间消息传递页面与嵌套的iframe消息传递上面三个场景的跨域数据传递3 nginx反向代理搭建一个中转的nginx服务器,用于转发请求。因为nginx服务器可以直接访问服务器的资源不像前端有同源策略的限制,所以利用nginx转发浏览器的请求浏览器的主要组成部分用户界面 除了主页面外其他的页面以及功能(前进后退书签菜单等)用户界面后端 绘制基本的窗口小部件浏览器引擎 在用户界面和呈现引擎之间传送指令js解析器 解析和执行js代码渲染引擎 负责显示请求的内容,如果是http请求,就解析html和css数据存储模块 持久层,保存各种数据,ck,sessionStorage,localstorage网络模块 用于网络调用4 websocket建立连接的时候需要http协议,连接建立之后通讯就与HTTP无关了4 iframe4.1通过iframe嵌套传递,首先是主页面通过location.hash将数据传递给iframe,此时只要求两个不同的网站的url多了一个需要传递的参数,然后再次通过iframe传给接下来的iframe,然后第二个iframe和主页面是同源的,就可以完成互相传递数据了(暴露数据,且url传递的数据值容易有XSS攻击)4.2 直接通过window.name 传递(第三方iframe引用该数据都可以获取,更风险)4.3 通过postMessage传递,postMessage要求同源,而主页面和iframe满足4.4 document.domain 必须同根域名Cookie,token,session storage, localStorage 区别?Cookie:同源的http请求中携带,一直在浏览器和服务器之间来回传递,起初是服务器通过response回复报文传到客户端,客户端在访问网页时在传给服务器进行校验,cookie中有个maxage来控制cookie的有效期Session:session是保存在服务器上的,服务器把客户端的信息记录在服务器上,从而验证身份,但是session对服务器压力大,尤其是session过大的时候,每次访问服务器都会更新session最后访问时间。Session的有效期是在长期间没有活跃的话删除,session需要cookie作为识别标志Cookie,Session区别:存放地方,Session安全(服务器),session服务器压力大,cookie 4k限制,session没有限制Token:和cookie类似,客户端通过登陆验证后,服务器会返回一个加密的token,再次访问服务器的时候会带上进行验证。但是存在哪里都行服务器浏览器都可以Token和Cookie区别:了解Token和Cookie区别首先要知道http协议无状态的含义,http协议无状态是指每次对数据进行处理的时候没有记忆能力,后续如果需要处理前面的信息,则必须重传。优点是响应快。cookie和session就是用于保持http连接的技术,用于在交互中存储状态。token无状态,服务器不需要去看是谁,cookie有状态,能够弥补http无状态问题,保存用户的登陆状态。cookie默认存储和默认发送不安全,token需要自己存储自己进行发送,并且没有跨域限制,所以token更加灵活。token可抵御csrf,因为token相对于cookie不容易伪造cookie只有4kb,因此一般只存一些关键信息,其他的用户信息都是存储在服务器的session中,服务器压力大。token是没有限制的,用户信息可以自行存储。Cookie中的属性CookieName 设置cookie的名字和值httpOnly 只能通过http响应报文新增或者更新cookie,客户端无法通过脚本读取expires cookie过期时间max-age 有效时间长度path 路径作用域,判断路径是否匹配所设置的作用域,不符合则不会带cookiedomain 设置cookie的作用域 (能够在突破跨域限制 a.taobao.com和b.taobao.com如果设置了domain=.taobao.com 就可以了)secure 开启安全模式,开启后只允许https下才可以保存cookiesameSite 在跨域时是否应该被发送,必须开启secure输入Url后的过程1 url解析 首先判断输入的是合法的url还是搜索词,然后完成字符编码的过程,浏览器还会进行安全检查等2 dns解析 浏览器缓存--本地hosts缓存--操作系统缓存—本地dns服务器缓存--根服务器--域名服务器(返回到本地dns并缓存信息)(dns劫持,拦截域名解析的请求,使得该域名ip换到其他的错误ip)3 tcp链接 应用层--传输层--网络层--链路层4 服务器处理请求5 浏览器接受响应6 渲染页面 dom cssom--render tree--布局--绘制浏览器垃圾回收机制(GC)浏览器的垃圾回收机制是指垃圾回收器会定期找出那些不在使用的变量然后释放其内存。由于垃圾回收机制开销比较大,所以并不会一直运行。只会清理局部变量。常用方法是标记清除,当函数运行时给所有的变量标记一个进入环境,该变量离开环境的时候标记离开环境(会自动排除全局变量和闭包变量),最后把这些被标记过的变量删除。浏览器缓存机制(从客户端读取资源)分为强缓存和协商缓存,强缓存不会向服务器发送请求,直接从缓存中读取资源,返回了200状态码。协商缓存会给服务器发送请求,根据请求携带的参数判断是否协商缓存,如果同意协商缓存会返回304状态码并带上新的参数给浏览器并通知浏览器从缓存中读取数据。缓存有关的header强缓存:expires是response header里的过期时间,浏览器在这个时间内的话就强缓存。Cache-control:可以设置max-age==xx(s) 代表在xx秒内可以强缓存协商缓存:1 etag和if-none-match:etag是上一次加载资源的时候服务器返回的response header,当要读取缓存的时候会首先把etag放到if-none-match中然后发送到服务器看服务器中的etag是否一样,一样的话允许缓存。Etag改变的条件是服务器的资源发生了变化2 last-modified和if-modified-since:latst-modified是该资源的最后一次更改时间,具体过程与上面相同。etag精度低性能高。浏览器缓存过程1 浏览器加载资源开始,服务器返回200,浏览器会在下载资源的同时把response header和请求的时间缓存下来。2 下一次加载资源的时候,比较时间差max-age,在时间段内就直接强缓存,时间过期就向服务器发送header带有if-none-match和if-modified-since3 服务器收到请求判断etag是否变化,没有变化就直接协商缓存(返回304),如果有改动则重新返回新的资源文件并带上新的etag值并返回2004 如果没有etag值则比较if-modified-since,成功返回304,失败返回新的last-modified和200用户:地址栏访问 F5刷新(协商缓存) ctrl+f5 跳过缓存直接拉取资源常见安全问题XSS 跨站脚本攻击--通过在目标网站页面注入恶意脚本,获取用户敏感信息(评论私信等),原因是因为遇到html标签里的script标签的时候会进行执行CSRF 跨站请求伪造--通过网站B对我们的网站A进行伪造请求,以受害者的请求发送信息(正常网站登录,诱导进入第三方网站,第三方网站有跳转正常网站的请求,然后服务器无法判断谁发的请求,达到以用户的名义恶意访问)Iframe 攻击者将目标网站通过iframe嵌套的方式嵌入自己网页,并将iframe设置成透明,诱导点击CDN劫持Clickjacking 透明的iframe框诱导点击解决办法XSS:大部分浏览器与框架(vue中不能再template中写script)都进行了修改,预防办法就是对用户输入的信息进行转义或者过滤CSRF:数据修改操作必须post;http协议中使用referer属性进行请求来源过滤请求地址添加token;添加验证码或者密码Iframe:sandboxCDN劫持:开启SRI,scrpit和link标签开启integrity,会验证文件哈希值与提供的哈希值Clickjacking: http中增加X-FRAME-OPTIONS,这个属性控制页面是否可以被嵌入iframe常见http请求头和响应头? 请求头:Accept--可以接受的服务器返回类型 Accept-Encoding--接受的编码方法Accept-languag--接受的语言 Connection-- keepalive或者falseHost--主要用于被请求资源的internet主机和端口号Referer--告诉服务器从哪里来的 cookie--响应头:.Cache-Control--缓存相关 Content-Type--告诉客户端,资源文件的类型,还有字符编码,乱码就是这个没有传对 Content-Encoding--告诉客户端编码的方式Date-- Expires--允许缓存的时间段 Last-Modified--上次修改时间 Connection--keepalive的话表示客户端还可以一直给服务器发消息Etag--缓存相关的标记值http和https区别https需要申请ca证书;http超文本传输协议明文传播,https是安全性的ssl(现在是tls了)加密传输协议Http80端口https443端口;http连接无状态https中间人攻击服务器向客户端发送公钥攻击者截取公钥,保留在自己手上攻击者生成伪造公钥,发给客户端客户端收到伪造的公钥,加密生成加密hash值发给服务器攻击者获得加密的hash值,用自己的私钥解密获得真密钥同时生成假hash值发送给服务器服务器用私钥解密获得假密钥服务器用假密钥加密传输信息防范方法:服务器给浏览器的公钥中加入ca证书,浏览器可以验证证书有效性Http1.x,http2.x区别http2.x使用二进制传输,1则是文本(字符串)传输http2.x支持多路复用,一个http请求实现多个http请求传输,可以用流ID进行标记http2.x支持头部压缩,客户端服务端维护一张信息表,之后只传输信息表上的索引http2.x 支持服务器推送,就是再未经客户端允许,主动向客户端推送内容Ajax原理Ajax是在不需要刷新页面的情况下,通过异步请求请求加载后台数据并呈现出来。例如表单验证是否登录成功,下拉框提示等原理相当于在用户和服务器之间加了一个中间层,让用户操作和服务器响应异步化。不会把所有的请求都递交服务器,需要表单验证等交给ajax引擎来做,需要服务器的数据的时候用ajax引擎发送创建过程创建XMLHttpRequest对象,也就是创建一个异步调用对象创建一个新的http请求,并指定该http请求的方法,url和验证信息设置响应http请求状态变化的函数发送http请求获取异步调用后返回的数据使用js和dom实现局部刷新XMLHttpRequestXMLHttpRequest对象用于在后台与服务器交换数据Promise封装ajax请求CDN在现有的因特网中增加一层新的网络架构,将网站的内容发布到离用户最近的网络边缘,提高访问速度。Cdn=镜像加缓存
2022年06月14日
1 阅读
0 评论
0 点赞
2022-06-14
JS
问题New操作符做了什么?解释一下原型?闭包、闭包函数、闭包的特点?js内置对象?检查数据类型的方式?Js中的Object. defineProperty?Call apply bind的作用、区别、以及应用场景?Map、foreach、forin、forof?var、let、const?数组的常见方法?Math常见方法?数组去重的几种方式?如果数组中的数据是对象呢?数组的最大最小值的几种方法?函数节流与防抖的概念?ES6新特性?ES6对象新增的方法?函数、方法、类以及如何添加属性和方法?ES5与ES6继承的区别?类和函数Class和function的区别?promise?async,await?Set,map,weakset,weakmap区别?装箱和拆箱?内存泄漏的几种情况?Json和xml?浅拷贝深拷贝?Js操作dom的方法?Js中的变量(主要解释var和let定义变量的区别)?Js中display和visibility?答案:New操作符做了什么1 创建一个空的简单的js对象2 设置原型,将对象的__proto__设置为函数的prototype对象3 让函数中的this指向这个对象(function.call),执行构造函数的代码(为这个新对象添加属性)4 判断函数的返回值类型,如果是值类型,返回创建的对象。如果是引用类型,返回这个引用的对象(普通数据类型和复杂数据类型)原型每个对象都有他的原型对象,他可以使用原型对象身上的方法和属性拿到原型对象可以通过对象的--proto--或者构造函数的prototype拿到(构造函数中的this指向new创建的对象 this.name = name)闭包声明在一个函数中的函数就是闭包闭包函数,闭包是指内部函数可以访问其所在的外部函数中声明的参数和变量闭包特点保护私有变量,可以访问函数内部私有变量,局部变量常驻内存, 更加的安全还能够保持代码的封装性,访问也比较方便缺点:一直在内存中,浪费资源,内存占用过多就会溢出导致内存泄漏作用域是指代码的执行环境,作用域链就是嵌套函数一层一层往上查找Js的内置对象有哪些Math,Date,Array,String检查数据类型Typeof(判断函数是function,对象和数组和null都是object,nan是num,未定义就是未定义) 简单数据类型 boolean,number,string,undefinend,null引用类型 Object(包括对象数组date等)Object.prototype.toString.call(x) Object.prototype.toString方法可以判断数据类型,通过call函数改变this的指向,让this指向x,从而判断X的数据类型。之所以不通过x.toString去找原型对象的toString方法去判断,是因为在继承obj的时候重写了tostring方法Instanceof 判断对象属性 (一般不用,因为该方法设计初衷是为了判断构造函数的prototype属性是否出现在某个实例对象的原型链上)Js中的Object. defineProperty给对象身上定义新的或者修改现有的一个属性,默认定义的属性无法删除和改变Object. defineProperty(obj,’name’,{Value: 属性的默认值get:function(){ name = ‘xxx’} function可以省略set: function(){ return ‘xxx’}Configurable:默认是false,为true是属性可以被删除Writable:默认是false,为true是属性可以被修改Enumerable:默认false,为true就可以枚举属性})Call apply bindCall和apply都会调用函数并且改变函数内部this指向。Call的参数是单个单个的,apply是数组形式的,bind返回一个函数,不会输出东西,其他两个会直接执行。Bind不会调用函数,但会改变this指向。Call:判断数据类型:Object.prototype.toString.call(x)类数组转数组:类数组是对象,但是内容和数组一样有序号有长度,Array.prototyte.slice.call(xxx)Apply:对给定数组求最大最小值,Math.max.apply(null,array) == Math.max(1,2,3,4,5)Map 遍历数组,会返回一个新的数组,三个参数arr.map(function(value,index,arr){xxx})For each 遍历数组,不会返回新数组 同上For in 遍历数组和对象,遍历的数组是字符串形式,遍历的对象属性包括原型对象身上的,输出的是属性名,如果需要输出属性值的话需要arr[i]For(let i in arr){ } For of 遍历对象,只能遍历迭代器对象,array,set,map,遍历的数组输出的是num格式Var 变量,函数提升Let 不存在变量函数提升,let定义的变量只在块中有用Const 严格的let,并且声明的时候必须赋值,且值的地址不能改(简单数据类型值不能改,复杂数据类型地址不能改,但是值可以改)如果直接定义一个变量而不用任何声明,默认该变量是window的,哪里都能用Var定义的变量是定义在了window上一个成员属性身上Let声明的变量不是真正的全局变量,而是保存在类似函数作用域的脚本作用域对象中,类似于局部变量,所以window上找不到数组常见方法Array = [1,2,3,4,5]1 array.indexOf(2) 检查数组中有没有2这个元素,有的返回下标,没有返回-13 Array.sort((a,b) =>{return a - b}) a-b是从小到大排序,b-a从大到小,返回一个数组也可以直接array.sort() 默认是从小到大的(10个数以内)5 array.push(1) 给array添加一个1,返回值是数组的长度,会直接改变原数组6 array.pop() 删除并返回数组的最后一个元素,改变原数组7 array.unshift() 给数组开头添加元素,改变原数组8 array.shift() 删除数组第一项,改变原数组9 array.reverse() 反转数组11 array.splice(index,howmuch,arr...)从索引index开始删除howmuch个项,然后把arr添加进去以上都会改变原数组以下都不改变原数组2 Const res = array.filter((item,index) =>{ }) item是数组中的每个元素,会返回一个数组4 Const res = Array.reduce(function(prev,current,currentIndex,sourceArray){//Prev 上一个数字,current当前数字,currentIndex当前数字索引,Return Prev +current 求和})10 array.slice(start,end) 获取从start到end索引的数组,不包括end项12 array.join()把数组中的所有元素放入一个字符串,默认以逗号分割,或者填进去分割的东西,将数组转换成字符串13 array.concat(arr) 把arr中的元素都加到array后面,返回新数组14 Array.map(function(currentValue,index,arr){ }) map会依次处理数组中的每一个元素,并返回一个新的数组,对原来数组不影响,也不会检查空数组MathMath.min(1,2,3) math.max(1,2,3) math.ceil() 进1 math.floor() 舍 math.round()四舍五入Math.random 返回一个0-1的数字 不包括0和1Math.floor(math.random()*总数 + 第一个值)Math.floor(math.random()*10 + 1) 随机产生1-10Str.split(“X”) 把字符串以X为分隔符分割并返回一个数组,不填写X则一个一个分开 Array.from(arr) 可以直接把字符串转为数组数组去重1.filter和indexOf2.相邻元素排序--先利用sort排序,然后循环比较i+1和i项,不等的话就加入到新数组中3.set 解构赋值 return [...new Set(array)]4.const result = new Set(array) 此时已经排好序的,但是类型是set类型,所以需要array.from将类数组对象变成数组 array.from(new Set(array))数组中各项是对象的去重临时对象缓存数组项key值 --- 遍历比较求数组中的最大最小值1 Math.max(...array) 因为max里要传一个一个的参数,所以...array Math.max.apply(null,array)2 利用reduce循环比较3 sort函数排序后直接选函数节流单位时间内只执行一次 -- 返回值是一个函数,开启定时器,定时器如果存在直接返回,清空定时器,并且把timmer置为null,能设置一个立即执行函数防抖事件被触发n秒后在执行回调,如果还没到时候就又被触发就重新计时,能设置一个立即执行ES6箭头函数和普通函数区别1 箭头函数的this指向父级作用域的this,普通函数的this是调用这个函数2 call,apply,bind无法改变箭头函数的this指向3 箭头函数不可以被当作构造函数4 箭头函数不可以使用arguments对象,如果使用的话需要在传参的时候表明接受的参数(...args) 普通函数:sayName(){const args = arguments log(args)} ----sayName(a,b)args里面就变成了传进去的参数的数组 也就是arguments是接受传入的参数的函数5 箭头函数不支持new.target(用来判断一个构造函数是否用new关键字调用)ES6新增了rest参数效果等同于arguments,不过arguments是一个类数组是一个对象,rest则是数组,且要求形参中必须有…rest,而且需要放到变量的最后类数组转数组方法Array.prototype.slice.call()(或者apply) Array.from new Array()Es6的扩展运算符……和…rest的不同在于 … 一般是在实参位置,…rest是在形参位置作用:数组合并:arr = […arr1,…arr2] 能把两个数组中的参数都拿出来,只写一个数组的话就是克隆,浅拷贝Symbol不能进行运算不能用for in遍历,但是可以用reflect.ownkeys获取键名str = Symbol(‘xx’) != str1 = Symbol(‘xx’)str = Symbol.for(‘xx’) == str1 = Symbol.for(‘xx’)Es6对象新增的方法Object.is(a,b) 比较两个变量是否相同 能判断普通和复杂数据类型也能够判断NaN ==NaNObject.assign(target,...sources) 两个或者多个对象进行合并,覆盖target,返回一个合并后的结果,后面的会覆盖前面的Object.key(obj) 返回目标对象所有可遍历的属性的键名 Object.value(obj) 返回目标对象所有可遍历的属性的键值Object.entries(obj) 返回目标对象所有可遍历的属性的键值对数组函数、方法、类函数是可以执行的js代码,通过名字直接调用的,函数中的数据是显示传递。方法是定义在对象的内部,不能直接调用,是特殊的函数,方法中的数据是隐式传递。类是ES6新增的定义,用来创建对象用的。在函数内部添加的属性会添加到使用该函数作为构造函数创建的对象身上。而在函数外部直接添加的属性,则只会作为构造函数的属性,而构造函数的实例对象拿不到这个属性,如果需要添加的话必须添加到构造函数原型身上。给函数添加方法和属性,如果直接添加的话,打印对象打印不出来,但是构造函数可以调用,实例函数不可以调用,所以必须通过原型。Person.prototype.name = ‘hello’ p1.name = ‘hello’ES5与ES6继承ES6使用语法 class B extends A继承,ES6类继承是ES5函数继承的语法糖,把ES6的继承通过Babel转义成ES5之后,发现它是通过object.create方法实现了(1)B.proto = A。表示子类B继承父类A的静态属性。通过Object.setPropertypeOf()方法实现(2)B.prototype.proto = A.prototype 。这与组合继承相同。 (一) ES6继承同时存在两条继承链。ES5是没有第一条原型链的。(二) ES6的子类必须在constructor方法中调用super()方法,super()代表调用父类的构造函数,因为子类没有自己的this对象,所以子类要先继承父类的this。但ES5 的继承,实质是先创造子类的实例对象this,然后再将父类的方法添加到this上面(Parent.apply(this))。(三) ES6 可以自定义原生数据结构(比如Array、String等)的子类,这是 ES5 无法做到的。ES6的构造函数通过原型链连接起来了,构造函数之间有直接的引用关系;ES5实际上是使用call或者apply借用父类构造函数实现的实例化,构造函数之间没有直接的引用关系ES5的实例化对象是由子类构造函数先创建的,然后父类构造函数是使用call或者apply修改这个对象ES6的实例化对象是由父类构造函数先创建的(这就是为什么要先调用super),然后子类构造函数修改这个对象Class和function的区别相同:都可以用构造函数,class的构造函数里面是一个constructor不同:class不可以使用call,bind,apply改变他的this指向Promise--异步编程解决方案,需要new三个状态:pending,fufilled,rejected 当一件任务交给promise时状态时pending,任务完成就是fufilled任务失败就是rejected。两个过程:分别是pending- fufilled和pending- rejected 状态一旦改变就不能在变了缺点:无法取消promise,一旦新建就会立即执行无法中途取消。 如果不设置回调,promise内部的错误不会抛出,不会反应到外部。then方法--拿到resolve或者reject的值,可以链式调用,接受两个参数,分别是成功 和失败回调Catch方法--捕获错误的Finally方法---执行到最后一定执行的Promise.all()---接受一组异步任务,全部完成后执行回调。将多个promise实例包装成一个新的promise实例 并发的Promise.race()---接受一组异步任务,第一个异步任务完成后后执行回调。将多个promise实例包装成一个新的promise实例 继发的Promise封装的话就是把内容封装到一个promise对象中,new Promse((resolve,reject)=>{})Async-await先执行async函数,返回一个promise对象Await相当于promise的thenTry…catch可以捕获异常,代替了promise的catchSet,map,weakset,weakmap区别?强引用与弱引用---在js中强引用是指变量通过指针指向一个地址。强引用不会被垃圾回收,弱引用虽然也是引用,但是当所有的强引用不在引用一个地址的时候,即使弱引用仍在引用,那么那个地址的数据仍然会被销毁。Set---成员不能重复,类似数组;可以遍历;方法有add,delete,hasWeakset---成员都是对象;成员都是弱引用,随时会消失(当其他对象都不引用该对象垃圾回收机制就会将其回收),不可以遍历Map---键值对的集合,可以遍历Weakmap--只接受对象为键名,不接受其他类型为键名;键名指向的对象不计入垃圾回收;不能遍历,方法同get,set,has,delete,不可以枚举不可以清空装箱:基本数据类型变成引用类型 拆箱:相反内存泄漏的几种情况?1 意外的全局变量 2 闭包 3 未被清空的定时器 4 未被销毁的事件监听 5 dom引用、Json和xmlXml大,占带宽,不容易解析处理,但是对数据描述性好,一般用于配置文件,json一般用于数据交互浅拷贝深拷贝浅拷贝只复制指针,仍然共享,深拷贝创造一模一样的新的对象。浅拷贝:Object.assign() for in 深拷贝:递归拷贝所有属性 使用json转换 lodash里的cloneDeepJs操作dom的方法通过document.getElmentsByid byname classname qureySelector querySelectoryAll 等可以修改标签内容 innerHTML 设置样式style.xxx 添加事件 onclick onmouseover onmouserover onfocus onblur 添加事件之后最后一个生效,添加多个事件用addEventListenerJs中display和visibility? Visibility不破坏页面布局但会有空白
2022年06月14日
4 阅读
0 评论
0 点赞
2022-06-13
CSS
问题1111CSS3新特性?CSS中animation和transition的区别?常见的布局样式?二栏布局和三栏布局?选择器优先级以及权重?css可以继承的属性?块元素、行元素、行内快元素?px,em,rem,vw+vh区别?Overflow?左边定宽,右边自适应---二栏布局?左右固定,中间自适应---三栏布局?三栏平均分布?盒子绝对水平垂直居中?图片水平垂直居中?文字水平垂直居中?css画三角形和圆形?css提高页面性能的办法?水平方向的布局规律?解释line-hight与行距?盒子模型?浮动?定位?伪类伪元素?高度塌陷与边距重叠?IFC?BFC?移动端适配?Flex布局?答案:CSS3新特性选择器(伪类,伪元素,nth-child()) 阴影(box-shadow) 背景与渐变 过渡 变化 动画媒体查询@media 颜色透明度rgba 圆角 border-radius 旋转倾斜位移 transformCSS中animation和transition的区别Animation是动画功能,通过控制关键帧来控制动画的每一步,实现动画效果Transition是过渡功能,可以让css变得平滑。因为原生的css过渡在客户端需要处理的资源比js和flash少得多,所以才更加平滑区别: Transition需要借助交互,Animation可以自动播放也可以借助交互。Transition只能定义开始和结束状态,Animation除开始结束状态,还可以通过关键帧控制中间形态。Transition不能暂停播放,Animation可以。变换 translate() 根据xy轴的移动 scale()缩放 rotate()3d变换渐变background:linear-gradient(方向,开始颜色,结束颜色)布局样式静态布局:传统网页采取的布局方式,一切元素都是以px做单位,适用于pc端流式布局:页面元素的宽度按照屏幕的分辨率进行适配调整,但整体布局不变(高宽大部分设置成百分比,可以设置宽高的最大最小值)Table布局:优点-表格中内容可以自动居中 缺点—table比其他标记占更多的内存(下载慢),table会阻挡浏览器渲染引擎的渲染顺序(延迟页面生成速度)。Flex布局:弹性盒子布局,能够解决元素居中,并且自动弹性伸缩,适配不同的屏幕。包裹文字的各元素采用em/rem做单位,而页面的主要划分区域尺寸仍采用百分数或者px,适用于移动端Grid布局:将容器划分为行和列,产生单元格,然后指定项目所在的单元格。Float布局:脱离文档流不脱离文本流,文字环绕 缺点:高度塌陷自适应布局:多个静态布局的,每个静态布局对应一个屏幕分辨率范围,需要开发多套界面,屏幕太小内容会拥挤。响应式布局:创建多个流式布局,分别对应一个屏幕分辨率范围。能够在不同屏幕不同分辨率上实现不同的展现方式,只需要一套界面就够,屏幕会根据屏幕宽度调整设计。适用于pc端和移动端兼容,加meta标签,例如width = device-width 这一句的意思是让页面的宽度等于屏幕的宽度。使用rem,还能根据特定的media定制样式元素(标签)选择器 选择一个标签对样式进行改变Id选择器 给标签添加一个 id=‘XX’ 可以多个id命同样的名(但是一般不重复),选择的时候用#加id类选择器 class=‘XX’ 选择的时候用 .加class class名字可以重复,也可以一个标签用多个不同名称的class,写的时候用空格隔开。通配选择器选择所有的元素 直接用*选择器优先级!import内联样式 style=‘xx’ 1000Id选择器 0100类,伪类,属性选择器.conent 0010类型div选择器,伪元素选择器 0001通配符 子选择器 后代选择器 0000继承最低权值相等,后出现优先css的继承 可以继承的属性:字体 font-family:规定元素的字体的系列,楷书行数等Font-size: 字体大小 pxFont-weight:字体粗细 Font-style:字体的风格 斜体Font-variant:小写字母变大写,原本的大写字母变大一点文本Text-align:文本对齐方式 center left right justify 两端对齐 inherit 继承父类Text-indent:文本缩进Line-height:行高 line-height == height 文字上下居中显示Text-transform:大小写展示的方式间隔 Letter-spacing word-spacing 可见性 visibility 光标属性 cursor块元素:独占一行,高、宽、行高、margin,padding都可设置,宽度不设置默认父元素的 div p h ul table li form...行元素(内联元素): 行内元素自身没有行高这个属性一行多个,高、宽、行高、margin和padding的top和bottom不可设置,(padding的top和bottom仅本身有效,但是不会撑开父盒子)但是left和right可以设置,元素的宽度高度就是包含的问题图片的宽度,不能变。行高其实可以设置,因为设置后只有位置发生了变化,但是并没有改变盒子的大小,所以在给行内元素设置背景的时候,还是默认的高度有背景。不会换行。(img虽然是行内元素,但是设置margin和padding都有效)Span a em b strong 内联块元素(行内块元素):一行多个,可以设置转换:(1)display:inline;转换为行内元素;(2)display:block;转换为块状元素;(3)display:inline-block;转换为行内块状元素。Px,em,rem,vw+vh的区别(一绝三相)Px 绝对单位,网页开发的基本长度单位Em 相对单位,相对于父元素字体大小进行计算(相乘)--没有当前盒子字体大小则是浏览器默认的Rem 相对单位,相对于根元素html字体大小进行计算(相乘)----没有当前盒子字体大小则是浏览器默认的Vm+vh 相对单位,相对当前网页视口宽度和高度进行计算Overflow是当元素溢出这个元素框的时候的选择,不一定是本身,也有可能是自己的子元素Css实现左边定宽,右边自适应的方法,二栏布局Calc函数---可以计算宽度,例如100%-100px左盒子浮动,右盒子加margin-left(左边盒子宽度)左边盒子浮动,右边盒子包括一个div,然后div设置overflow:hidden(触发BFC)(否则左边盒子会遮盖住右边的)子(左边盒子)绝父相,left,top设置为0(实测这个不设置也可以)。右边盒子加margin-left(左边盒子宽度)最大的盒子设置display:flex; 右边盒子flex:1;(占满flex剩余的空间) 最大盒子设置display;table; 左右盒子设置display:table-cell;Css实现三栏布局,左右固定,中间自适应1 左盒子左浮动,右盒子又浮动,最大盒子必须有尺寸,然后中间盒子设置margin-left和margin-right为左右盒子的宽度(此种方法注意盒子排列顺序是左右中)2 大盒子加display:table,左中右加display:table-cell3 大盒子相对定位,左右盒子绝对定位并且设置top left right,中间盒子设置绝对定位后设置left和right,分别是左右盒子的宽度(中间盒子也可以设置浮动)4 大盒子display:flex,中间盒子flex:1三栏布局平均分布大盒子display:flex,剩余盒子flex:1css实现绝对居中定宽高父盒子加相对定位,子盒子绝对定位,left、top 50%,margin-left、margin-top (子盒子宽高的一半,这里移动的是负值)px---------首先利用定位让子盒子左上角的点在父盒子中心,然后利用margin微调父盒子加相对定位,子盒子绝对定位,offset的偏移量(top,left,right,bottom)全设置为0,margin设置为auto,这样margin会自动变化,从而调整到中间不定宽高父盒子加相对定位,子盒子绝对定位,left、top 50%,transform:translate(50%,50%)---------首先利用定位让子盒子左上角的点在父盒子中心,然后使用transform属性父盒子display:table-cell,text-align:center, vertical-align:middle; 子盒子display:inline-block父盒子display:flex; justify-content:center; 子盒子align-self:center(或者父align-items:center)图片垂直居中要先让div包裹一个盒子,这个div在被最外部的div包裹----最外层div设置display=table,img的父元素div设置display=table-cell,vertical-align: middle;第二种办法是div直接包裹了图片。通过利用定位,再给图片元素设置top:50%,transform:translateY(-50%)图片水平居中上面基础上再给最外层div元素添加text-align:center上面基础上再给图片元素添加left和transform文字水平居中Text-align = center 文字垂直居中line-height = heightcss画三角形Border: 10px solid transparent; transparent--继承父元素颜色Border-top:10px solid red; top为下三角Css画圆形Border-radius:50%Width:80pxHeight:80pxBgc:xxxCss提高页面性能1属性设置用简写 margin的top、bottom等写成margin:10px 20px 30px.. 减少打包体积2用css替换图片 减少http请求节省带宽3删除不必要的零和单位 0.2=.2 减少打包体积4用精灵图代替单个文件加载 减少http请求节省带宽水平方向的布局规律Overflow:visible溢出部分显示,hidden隐藏(会裁剪),scroll生成垂直水平两个滚动条,Auto根据需要生成滚动条。 Overflow-x Overflow-y 单独处理水平或者垂直一个元素在其父元素中,必须满足margin+border+padding = 父元素内容区的高度假设父元素width=800,height=400子元素宽度等于200,会自动将margin-right变成600Width,margin-left,margin-right任意一个为auto,就会调整这一个的值如果width与margin都是auto,则width填满,margin是0margin-left,margin-right是auto,width固定,则子元素会居中 即margin:0 auto;盒子模型是css定义的一个模块,是一个长方形的盒子,实质上是包含了html元素的框。从里到外顺序:内容区 content 内边距 padding 边框border 外边距 margin 从里到内顺序内容区是由width和height控制 如果盒子中没内容则不显示。边框区的设置至少三个样式 border-width border-color border-style(线条的样式)分为标准盒模型和IE盒模型Box-sizing:context-box border-box(width和height包含padding和border)Margin值的顺序,逆时针,不够4个则对称浮动Float: left right某元素浮动后,字体不会浮动上去,会围绕浮动的元素清除浮动:可以在不想受浮动影响的元素增加clear属性,可选值是left、right、both。分别是不受左右浮动影响和不受最大的那个浮动的影响。原理:给该元素增加了外边距定位(position) relative相对(相对自身) absolute绝对(选择其最近的父级定位元素,当这个父级是static的时候,绝对定位元素会以body坐标原点进行定位) fixed 固定(相对浏览器窗口定位,不随滚动条改变) sticky粘滞(在元素到达某一位置时将元素固定)定位的默认值是static 相对定位不会脱离文档流,其他都会,可以使用z-index改变层叠1 开启定位后,可以通过偏移量(offset)来设置元素位置----top,bottom,left,right2 单一的绝对定位会定位到网页的左上角伪类:hover :active :visited :link :visited 等类似属性,能够在元素到达某种状态的时候得到某个样式或者失去某个样式的称为伪类。伪元素创建一些不存在于文档中的元素.box::after{content:’ ’ } (在box元素的末尾添加东西).box::before (在box元素的开头添加东西)IFC内部盒子水平排列 影响布局的有 font-size line-height height vertical-alignBFC概念1 内部盒子会垂直排列 2 属于同一个BFC的相邻盒子边距仍会重叠 3 不会与浮动区域重合 4 容器里面元素与外面元素互不影响5 计算BFC高度的时候浮动元素也计算在内开启BFC后不会边距重叠,不会塌陷,开启BFC的元素可以包含浮动元素1 float 2 absolute fixed 3 inline-block table-cell 4 overflow高度塌陷 垂直外边距重叠(水平的不会)高度塌陷是指子元素浮动(也就是脱离文档流)后,父元素的高度没有人撑开了,就会塌陷。解决方式一:开启BFC(指把这块元素开创一个独立的布局空间)垂直外边距重叠指块元素的外边距会发生重叠,边距取两者之间最大值。有三种情况:1同级别垂直两个元素设置的上边距或下边距,边距不会叠加而是最大值 2子元素设置margin时会传递给父元素的margin 边距虽然重叠了但是各自边距的值没变解决边距重叠:(开启BFC或使用fixed或absolutely)1 开启BFC的元素不会被浮动元素所覆盖2 开启BFC的元素子元素和父元素的外边距不会重合(当子元素设置margin值的时候,margin的值会传递给父元素,从而导致父元素也要移动,而子元素的相对位置没有变化,解决这个问题主要是要让子元素的不挨着父元素的边)3 开启BFC的元素可以包含浮动的子元素,开启后都可以清除浮动开启方式(也是清除浮动的几种方式):1 父元素的overflow(滚动条)设置成一个非visible的值(一般设置成hidden或者auto)2 float:left; or position:absolute; or display:inline-block 都是通过脱离文档流开启解决方式二:在父元素中在增加一个div,然后给其增加clear属性,这样会不受浮动的影响在浮动元素的下面,也会撑大父元素到这个位置,缺点是多了一个div解决方式三:通过伪元素::after解决,给父元素增加一个::after属性,此时会在最后为父盒子增加内容,但是由于::after是行级元素,会在同一行,所以将其转变成块元素,最后在增加clear:both;(清除浮动),达到效果。 清除浮动是清除浮动对当前元素的影响.box::after{content:’ ’; display:block; clear:both} 这个方式可以同时解决高度塌陷和外边距重叠的问题。通过在前后都增加空内容,添加间隔,display采用table表格的形式移动端适配使用media媒体查询,让不同屏幕的分辨率加载不同的css代码(代码量大)Flex弹性布局使用rem,因为rem是相对于根元素字体大小计算的等比缩放(字体也会越来越大或者越来越小,体验差)使用vw,vw是相对单位,1vw表示屏幕宽度的1%布局自适应的几种方案 要区分不同型号版本分辨率。响应式布局,弹性布局,流式布局(百分比布局),使用rem 把px换算成vw需要等比缩放的元素用调试平台 浏览器 safari uni-appFlex布局水平的主轴和垂直的交叉轴Flex-direction:row row-reverse column column-reverse 排列顺序Flex-wrap:nowarp wrap wrap-reverse 如何换行Flex-flow: Flex-direction和Flex-wrap的简写Justiy-concent:flex-start flex-end center space-between(两端对齐,项目之间间隔相等) space-around(项目两个间隔相等,所以项目中间比两侧宽两倍) 主轴上对齐方式Align-items:stretch(默认值,是占满) flex-start flex-end center baseline(项目第一行文字基线对齐) 交叉轴对齐方式Alige-content: stretch flex-start flex-end center space-between space-around 多根轴线对齐方式项目的属性Order:项目排列顺序(数字越小排列越前) 默认是0Flex-grow: 默认是0,1的话代表占满剩余空间Flex-shrink: 默认是1,空间不足时等比例缩小。 0代表不缩小Flex-basis: 项目主轴的值(即项目的占据的空间,默认为项目的大小,设置后将占据固定空间) 默认是autoFlex: Flex-grow, Flex-shrink, Flex-basis 结合Align-self:单个项目的对齐方式 auto(继承父元素的) flex-start flex-end center baseline stretch
2022年06月13日
2 阅读
0 评论
0 点赞
1
2