赞
踩
.box {
clip-path: circle(0%);
clip-path: inset(50%);
clip-path: polygon(0 0);
}
这种方式隐藏的元素,虽然不可见,但仍然会占据自身大小的空间,效果上与 visibility:hidden 相似。并且也不能响应事件监听和各种交互状态。
只需要将 blur() 值设置为一个较大的值,元素将模糊到无法显示的地方,如值大于400:
.elem {
filter: blur(500px);
}
通过以上代码,就能将元素进行隐藏了,他的效果与使用 opacity: 0 一样,元素虽不可见,但仍占据空间,并且能够响应事件和交互状态。
注意:filter:opacity(0) 透明滤镜与 opacity: 0 也一样。
<div hidden>这个元素将被隐藏,不占用空间,无法交互。</div>
以上方式,针对的页面元素,是不区分块状元素和行内元素,都能够达到隐藏效果,下面还有几种方式,可能针对特定的元素才起作用。
font-size: 0
font-size 用于设置文字的大小,当我们把它的值设置为 0 时,文本内容就不可见
.box{
transform: scale(0);
}
需要注意的是,transform:scale(0) 达成的隐藏效果,无法作用于行内元素,这是由于 transform 属性本身对行内元素不起作用。
并且,这种隐藏方式也会占用页面空间(元素的原始大小区域),但元素实际上宽高都为0,同样无法响应事件和交互
<div>文本</div>
<style>
div{text-align:center;}
</style>
<div>文本</div>
<style>
div{height:60px; line-height:60px;}
</style>
<div>文本</div>
<style>
div{height:300px; display:table-cell; vertical-align:middle}
</style>
<div><img src="1.jpg" /></div>
<style>
div{text-align:center}
</style>
// 1)利用行高等于高度的原理 <div><img src="1.jpg" /></div> <style> div{height:200px; line-height:200px; } img{vertical-align:middle} </style> //2)利用中线参照物的原理 <div><img src="1.jpg" /><span></span></div> <style> div{height:200px; } img{vertical-align:middle;} span{vertical-align:middle;width:0; height:100%; display:inline-block} </style> //方法二中,如果前面样式重置的时候你把图片转成块级元素了,那么你还需要再给转回来(display:inline-block),参照物span也可以使用css3里面的伪元素替代: <div><img src="1.jpg" /></div> <style> div{height:200px; } img{vertical-align:middle; display:inline-block} div::after{content:"";vertical-align:middle;width:0; height:100%; display:inline-block} </style>
1、定位居中方法
<div class="box"> <div class="inner"></div> </div> <style> .box{ width:400px; height:400px; background:#ff0; position:relative } .inner{ width:100px; height:100px; background:#0f0; position:absolute; top:50%; margin-top:-50px; left:50%; margin-left:-50px; } /* margin-top的取值是负的子盒子的高度的一半,margin-left的取值是负的子盒子的宽度的一半*/ </style>
<div class="box"> <div class="inner"></div> </div> <style> .box{ width:400px; height:400px; background:#ff0; position:relative } .inner{ width:100px; height:100px; background:#0f0; position:absolute; top:calc(50% - 50px); left: calc(50% - 50px); } /* calc(50% - 50px) 里面减掉的是子盒子的宽度(或者高度)的一半*/ </style>
<div class="box"> <div class="inner"></div> </div> <style> .box{ width:400px; height:400px; background:#ff0; position:relative } .inner{ width:100px; height:100px; background:#0f0; position:absolute; top:0; bottom:0; right:0; left:0; margin:auto; } </style>
<div class="box"> <div class="inner"></div> </div> <style> .box{ width:400px; height:400px; background:#ff0; position:relative } .inner{ width:100px; height:100px; background:#0f0; position:absolute; top:50%; left: 50%; transform:translate(-50%,-50%) } /* translate里面的百分数参照物是元素自身,所以就算你不知道盒子尺寸也可以实现的*/ </style>
2、弹性盒居中方法
<div class="box">
<div class="inner"></div>
</div>
<style>
.box{
display:flex;
justify-content:center;
align-items:center
}
</style>
<div class="box">
<div class="inner"></div>
</div>
<style>
.box{display:flex; justify-content:center; }
.inner{ align-self:center }
</style>
<div class="box">
<div class="inner"></div>
</div>
<style>
.box{display:flex; }
.inner{margin:auto}
</style>
3、inline-block居中方法
//1)行高等于高度居中方法 <div class="box"> <div class="inner"></div> </div> <style> .box{ width:400px; height:400px; background:#ff0; text-align:center; line-height:400px } .inner{ vertical-align:middle; display:inline-block } </style> // 2)参照物中线对齐方法 <div class="box"> <div class="inner"></div> </div> <style> .box{ width:400px; height:400px; background:#ff0; text-align:center; } .inner{ vertical-align:middle; display:inline-block } .box::after{ content:""; vertical-align:middle; display:inline-block; width:0; height:100% } </style> // 3)等同多行文本居中方法 <div class="box"> <div class="inner"></div> </div> <style> .box{ width:400px; height:400px; background:#ff0; text-align:center; display:table-cell; vertical-align:middle } .inner{ display:inline-block } </style>
css动画就是元素从一种样式过渡到另一种样式的过程。动画包括两个部分: 描述动画的样式规则和用于指定动画开始、结束以及中间点样式的关键帧。常见的动画效果很多,比如,平移、旋转、缩放等,css实现动画的方式有以下几种:
1、transition:实现渐变动画
2、transform:实现转变动画
3、animation:实现自定义动画
// animation: move 1s 部分就是动画的第一部分,用于描述动画的各个规则;
// @keyframes move {} 部分就是动画的第二部分,用于指定动画开始、结束以及中间点样式的关键帧;
div {
animation: change 3s;
}
@keyframes change {
0% {
color: #f00;
}
100% {
color: #000;
}
}
创建动画序列,需要使用 animation 属性或其子属性,该属性允许配置动画时间、时长以及其他动画细节,但该属性不能配置动画的实际表现,动画的实际表现是由 @keyframes 规则实现。
animation 的子属性有:
Block formatting context:块级格式化上下文(直译)。
BFC是一个独立的渲染区域,是Web页面中盒模型布局的CSS渲染模式,其中的元素布局和定位不受外界的影响,并且在一个BFC中,块盒与行盒(行盒由一行中所有的内联元素所组成)都会垂直的沿着其父元素的边框排列。
因为这个“不受外界影响”这个特性,可以用来清除浮动,解决margin塌陷,不被浮动元素覆盖(文字环绕)等。
如何形成BFC呢?
1)BFC中盒子对齐
对比IFC(行内格式化上下文)的特性,盒子在水平方向一个接着一个排列。块级格式化上下文里的块级盒会在垂直方向一个接着一个排列,即便不在bfc里块级盒子也是垂直排列的。
2)外边距折叠
在常规情况下,两个兄弟盒子之间的垂直距离是由他们最大的外边距决定,而不是外边距之和。
<div class="parent"> <div class="child1"></div> <div class="child2"></div> </div> .parent{ overflow: hidden; } .parent .child1, .parent .child2 { background-color: salmon; height: 50px; } .child1 { margin-bottom: 30px; } .child2 { margin-top: 50px; }
从上面的例子可以看出,两个盒子是50px而不是80px,因为垂直外边产生折叠,间距以较大的为准。如何解决呢?使用规则第5条,创建子元素BFC,任意选择其中一个子元素创建BFC。方法如下:
<div class="parent">
<div class="child1"></div>
<div class="child-box">
<div class="child2"></div>
</div>
</div>
.child-box {
overflow: hidden;
}
3)不被浮动元素覆盖(解决文字环绕)
<div class="float"> <div class="item">我是aa里內容</div> <div class="item"> 我是bb里內容我是bb里內容我是bb里內容我是bb里內容我是bb里內容我是bb里內容我是bb里內容我是bb里內容我是bb里內容我是bb里內容我是bb里內容我是bb里內容我是bb里內容我是bb里內容我是bb里內容我是bb里內容我是bb里內容我是bb里內容我是bb里內容我是bb里內容我是bb里內容我是bb里內容 </div> </div> .item { height: 50px; } .item:nth-child(1) { float: left; width: 50px; background-color: sandybrown; } .item:nth-child(2) { height: 100px; background-color: seagreen; /* 激活BFC */ /* 该div会自动适应宽度 */ /* overflow: hidden; */ }
4)清除浮动
清除浮动常用的方法overflow:hidden,因为浮动的子盒子无法撑出处于标准文档流的父盒子的height。
创建BFC清除浮动后【为显示区别,父元素加了阴影效果】
此处利用规则6:计算BFC的高度时,浮动元素也参与计算
1) 不同浏览器的标签默认的内外边距不同
清除浏览器自带的默认样式
2) 图片加a标签在IE9中会有边框
解决方案:img{border: none;}
3) IE6及更低版本浮动元素,浮动边双倍边距
解决方案:不使用margin,使用padding
4) IE6及更低版本中,部分块元素拥有默认高度
解决方案:给元素设置font-size: 0;
5) a标签蓝色边框
解决方案:a{outline: none;}
6) IE6不支持min-height属性
解决方案:{min-height: 200px; _height: 350px;}
7) IE9以下浏览器不能使用opacity
// 解决方案:Firefox/Chrome/Safari/Opera浏览器使用opacity;IE浏览器使用filter
opacity: 0.7; /*FF chrome safari opera*/
filter: alpha(opacity:70); /*用了ie滤镜,可以兼容ie*/
8) IE6/7不支持display:inline-block
解决方案:{display: inline-block; *display: inline;}
9) cursor兼容问题
解决方案:统一使用{cursor: pointer;}
10) IE6/7中img标签与文字放一起时,line-height失效的问题
解决方案:文字和都设置float
11) table宽度固定,td自动换行
解决方案:table设置 {table-layout: fixed},td设置 {word-wrap: break-word}
12) 相邻元素设置margin边距时,margin将取最大值,舍弃小值
解决方案:不让边距重叠,可以给子元素加一个父元素,并设置该父元素设置:{overflow: hidden}
13) a标签css状态的顺序
解决方案:按照link–visited–hover–active的顺序编写
14) IE6/7图片下面有空隙的问题
解决方案:img{display: block;}
15) ul标签在Firefox中默认是有padding值的,而在IE中只有margin有值
解决方案:ul{margin: 0;padding: 0;}
16) IE中li指定高度后,出现排版错误
解决方案:设置line-height
17) ul或li浮动后,显示在div外
解决方案:清除浮动;须在ul标签后加
li{
width: 200px;
white-space: nowrap;
text-overflow: ellipsis;
-o-text-overflow: ellipsis;
overflow: hidden;
}
20) div嵌套p时,出现空白行
21) IE6默认div高度为一个字体显示的高度
解决方案:{line-height: 1px;}或{overflow: hidden;}
22) 在Chrome中字体不能小于10px
解决方案:p{font-size: 12px; transform: scale(0.8);}
23) 谷歌浏览器上记住密码后输入框背景色为黄色
input{
background-color: transparent !important;
}
input:-webkit-autofill, textarea:-webkit-autofill, select:-webkit-autofill{
-webkit-text-fill-color: #333 !important;
-webkit-box-shadow: 0 0 0 1000px transparent inset !important;
background-color: transparent !important;
background-image: none !important;
transition: background-color 5000s ease-in-out 0s;
}
24) CSS3兼容前缀表示
.box{
height: 40px;
background-color: red;
color: #fff;
-webkit-border-radius: 5px; // chrome/safari
-moz-border-radius: 5px; // Firefox
-ms-border-radius: 5px; // IE
-o-border-radius: 5px; // Opera
border-radius: 5px;
}
rem是CSS 3中新增的一种相对长度单位。当使用rem单位时,根节点的字体大小(font-size)决定了rem的尺寸。
rem单位类似于em单位,em单位表示父元素字体大小,不同之处在于,rem的基准是相对于元素的字体大小。下面通过代码对比em和rem的区别。
1)sass与less 原文链接
sass和less都是css的预编译处理语言,他们引入了mixins,参数,嵌套规则,运算,颜色,名字空间,作用域,JavaScript赋值等 加快了css开发效率,当然这两者都可以配合gulp和grunt等前端构建工具使用
sass和less主要区别:在于实现方式 less是基于JavaScript的在客户端处理,引入less.js就可以处理,sass是基于ruby所以在服务器处理
1.1 less优点
可以在浏览器中运行,实现主题定制功能;
1.2 less缺点
编程能力弱,不直接支持对象,循环,判断等;只有when判断
@variable 变量命名和css的@import/media/keyframes等含义容易混淆;
mixin/extend的语法比较奇怪;
mixin的参数如果遇到多参数和列表参数值的时候容易混淆;
1.3 sass优点:
用户多,更容易找到会用scss的开发,更容易找到scss的学习资源;
可编程能力比较强,支持函数,列表,对象,判断,循环等;相比less有更多的功能;
丰富的sass库:Compass/Bourbon;
1.4 sass缺点
在公司内部安装node-sass会失败,需要使用cnpm或者手工安装
1.5 less 和 sass 不同点:
基本语法
Less 的基本语法属于「CSS 风格」
Sass、相比之下激进一些,利用缩进、空格和换行来减少需要输入的字符 不过区别在于 Sass、同时也兼容「CSS 风格」代码
// less
.box {
display: block;
}
// sass
.box
display: block
-嵌套语法
三者的嵌套语法都是一致的,甚至连引用父级选择器的标记 & 也相同。
区别只是 Sass 可以用没有大括号的方式书写
// less
.a {
&.b {
color: red;
}
}
// less
@red: #c00;
strong {
color: @red;
}
// sass
$red: #c00;
strong {
color: $red;
}
// Less 中可以在字符串中进行插值:
@device: mobile;
@import "styles.@{device}.css";
// Sass 中只能在使用 url() 表达式引入时进行变量插值:
$device: mobile;
@import url(styles.#{$device}.css);
.alert { font-weight: 700; } .highlight(@color: red) { font-size: 1.2em; color: @color; } .heads-up { .alert; .highlight(red); } // 编译后 .alert { font-weight: 700; } .heads-up { font-weight: 700; font-size: 1.2em; color: red; } // sass @mixin large-text { font: { family: Arial; size: 20px; weight: bold; } color: #ff0000; } .page-title { @include large-text; padding: 4px; margin-top: 10px; } // less .message { padding: 10px; border: 1px solid #eee; } .warning { &:extend(.message); color: #e2e21e; }
-继承
.active {
color: red;
}
button.active {
@extend .active;
}
2)双飞翼布局与圣杯布局 原文链接
圣杯布局和双飞翼布局达到的效果基本相同,都是侧边两栏宽度固定,中间栏宽度自适应。 主要的不同之处就是在解决中间部分被挡住的问题时,采取的解决办法不一样,圣杯布局是在父元素上设置了padding-left和padding-right,在给左右两边的内容设置position为relative,通过左移和右移来使得左右两边的内容得以很好的展现,而双飞翼则是在center这个div中再加了一个div来放置内容,在给这个新的div设置margin-left和margin-right 。
不同之处
所谓圣杯布局和双飞翼布局其实解决的问题是相同的,都是解决左右两栏固定宽度,中间部分自适应,其中某部分内容比其他内容高的时候,保证三者元素等高。 他俩的区别就是:圣杯用padding。双飞翼用在main外层多加了一个div然后改用margin。
相同之处
用 float 实现圣杯布局
左右栏通过添加负的margin放到正确的位置了,此段代码是为了摆正中间栏的位置
中间栏的位置摆正之后,左栏的位置也相应右移,通过相对定位的left恢复到正确位置
中间栏的位置摆正之后,右栏的位置也相应左移,通过相对定位的right恢复到正确位置
优点:不需要添加dom节点
双飞翼布局:
3)flex,grid
flex Flex 布局教程:实例篇
grid CSS Grid 网格布局教程
Cookie、localStorage和sessionStorage
Cookie
1、有时效性,不设置有效期,默认关闭浏览器就失效。
2、分域名储存,在当前域名下储存只能在当前域名下使用。
3、分路径储存,根路径不能用子路径的数据,子路径可以用根路径的数据。
4、不可跨域。
5、大小为4K。
6、可以灵活设置生存周期。
7、操作使用较为复杂,由于cookie其本质是设置在header的头数据,所以操作数据需要对数据进行拆分重组过程。
设置cookie:document.cookie = ‘键=值;expires=失效时间;path=要储存的路径;’
清除cookie:document.cookie = ‘键=值;expires=失效时间改到已经过去的时间’
localStorage和sessionStorage
localStorage的特点:数据会永久储存,不清除的话一直都在
sessionStorage的特点:浏览器刷新或者关闭时,数据会丢失
// 设置getItem(): localStorage.setItem('name', '张三') sessionStorage.setItem('name', '李四') // 获取setItem() localStorage.setItem('name', 'xxx') sessionStorage.setItem('name', 'xx') console.log(localStorage.getItem('name')) console.log(sessionStorage.getItem('name')) // 删除removeItem() //设置缓存 localStorage.setItem('name', '张三') sessionStorage.setItem('name', '李四') //删除缓存 localStorage.removeItem('name') sessionStorage.removeItem('name') //获取缓存 console.log(localStorage.getItem('name')) console.log(sessionStorage.getItem('name')) // 全部清除clear(): // 1.先设置一些数据 localStorage.setItem('name', '张三') localStorage.age = '18' sessionStorage.setItem('name', '李四') sessionStorage.age = '20' console.log(localStorage.getItem('name'), localStorage.age) console.log(sessionStorage.getItem('name'), sessionStorage.age) // 2.清除所有缓存 localStorage.setItem('name', '张三') localStorage.age = '18' sessionStorage.setItem('name', '李四') sessionStorage.age = '20' //清除所有数据 localStorage.clear() sessionStorage.clear() console.log(localStorage.getItem('name'), localStorage.age) console.log(sessionStorage.getItem('name'), sessionStorage.age) //其他的一种设置获取: const jsonData = [ { "id": 3, "username": "cuihua", "password": "asdf333", "nickname": "asdf", "identity": "学生", "gender": "女", "age": 23, "createTime": 1647587821399, "updateTime": 1647587905785, "cart": [] }, { "id": 4, "username": "admin", "password": "123456", "nickname": "ed", "identity": "学生", "gender": "", "age": "", "createTime": 1649251356317, "updateTime": 1649251356317, "cart": [] }, { "id": 5, "username": "sa123", "password": "111111", "nickname": "张三", "identity": "学生", "gender": "", "age": "", "createTime": 1649317083990, "updateTime": 1649317083990, "cart": [] } ] //还可以这样设置 //设置 localStorage.jsonData = JSON.stringify(jsonData) sessionStorage.jsonData = JSON.stringify(jsonData) //获取 console.log(localStorage.jsonData) console.log(sessionStorage.jsonData)
当谈到网络通信协议时,大家都熟悉的就是HTTP(Hypertext Transfer Protocol),它是一种用于在 Web 浏览器和服务器之间传输数据的协议。随着技术的发展,HTTP也在不断演进,从HTTP1.0发展到了HTTP2.0,带来了许多新的特性和改进。本文将详细介绍HTTP1.0和HTTP2.0之间的区别。
随着互联网的不断发展,HTTP协议也在不断演进,HTTP3(基于UDP的QUIC协议)已经出现,并带来了更多的改进。了解并掌握不同版本的HTTP协议对于开发者来说是非常重要的,可以根据具体的业务场景和需求选择合适的协议版本,以提供更好的用户体验和性能。
// 例1:函数中的setTimeout function outer(){ for(var i=0;i<5;i++){ setTimeout(function(){ console.log(i) },100) } } //例2:函数中的匿名函数 function outer(){ var inner = []; for(var i=0;i<5;i++){ inner[i] = function(){ console.log(i) } } return inner; } //如果是同一个对象的inner[i]中的i值会相互影响
好处:
①保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突;
②在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存);
③匿名自执行函数可以减少内存消耗
坏处:
①其中一点上面已经有体现了,就是被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;
②其次由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响
var global = "global";
var local = function(){
var global = "local";
return function(){
return global;
}
}()
console.log(global);//"global"
console.log(local());//"local"
②保留辅助变量
function counter(){
var count = 0;
return function(){
return ++count;
}
}
var count1 = counter();
var count2 = counter();
console.log(count1());//1
console.log(count1());//2
console.log(count2());//1
//count1与count2不是同一个对象,count变化不会相互影响
function outer(){
var inner = [];
for(let i=0;i<5;i++){
inner[i] = function(){
console.log(i)
}
}
return inner;
}
②添加立即执行函数
function outer(){ var inner = []; for(var i=0;i<5;i++){ inner[i] = (function(num){ return function(){ console.log(num); } })(i) } return inner; } // 或 function outer(){ var inner = []; for(var i=0;i<5;i++){ (function(num){ inner[i] = function(){ console.log(num); } })(i) } return inner; }
③通过new Function
var inner = [];
for(var i=0;i<5;i++){
inner[i] = new Function("console.log("+i+");")
}
return inner;
}
另外,网上有人提到可以为inner[i]添加属性,在function中返回该属性的值即可。
//该方法不可行,因为会被覆盖,若不是inner[i] = function,而是inner[i].fun = function则可行
function outer(){
var inner = [];
for(var i=0;i<5;i++){
inner[i].value = i;
inner[i] = function(){
console.log(this.value)
}
}
return inner;
}
最详尽的 JS 原型与原型链终极详解,没有「可能是」。(一)
js 六种继承方式介绍及优缺点
js中类的继承多态
五种基本数据类型分别是:Number、String、Undefined、Boolean、Null;
两种复杂数据类型:Object、Symbol
JavaScript高级this指向和实现继承的几种方式
this、call/apply/bind、Object.create、继承
Event Loop到底是个啥?
事件循环机制(event loop)
面试官问你前端性能优化时,他想问什么?
前端性能优化
前端页面性能优化(完整归纳版)
前端性能优化怎么做?
封装FetchAPI,要求超时报错的同时,取消执行promise,而不是继续执行
判断是不是原型的方法
浏览器种输入一个url到显示页面全过程
JS 的 六种打断点的方式,你用过几种?
HTTP缓存机制及原理详解
xss攻击详解
XSS 与 CSRF 攻击——有什么区别?
分享 10 种常见的 JavaScript 设计模式
js之设计模式
JavaScript设计模式(一):观察者模式
EventSource VS 轮询
轮询(短轮询),长轮询(comet),长连接(SSE),WebSocket
httpServer代理WebSocket通信
BFC、IFC概念的布局规则、形成方法、用处
重排重绘与GPU加速
requestAnimationFrame运动框架基本概念+运动框架应用于web页面的抗阻塞均匀计数器
关于Canvas 常用API汇总
webWorker 多线程 – postMessage 通信
commonJS和ES6模块化的区别
tree shaking功能及使用原理详细解析
webpack的Tree Shaking原来要这么使用才有效
应用ast抽象语法树修改js函数
https://www.jianshu.com/p/1a9bafe443b7
webpack(四)——webpack里面的plugin和loader的区别
(1)vue实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模板、挂载Dom->渲染、更新->渲染、卸载等一些列过程,我们称这是Vue的生命周期
(2)各个生命周期的作用
生命周期 | 描述 |
---|---|
reate | 组件实例被创建之初,组件的属性生效之前 |
created | 组件实例已经完全创建,属性也绑定,但真实dom还没有生成,$el还不可用 |
beforeMount | 在挂载开始之前被调用:相关的render函数首次被调用 |
mounted | el被新创建的vm.$el替换,并挂载到实例上去之后调用该钩子 |
beforeUpdate | 组件数据更新之前调用,发生在虚拟dom打补丁之前 |
update | 组件数据更新之后 |
activited | keep-alive专属,组件被激活时调用 |
deactivated | keep-alive专属,组件被销毁时调用 |
beforeDestory | 组件被销毁前调用 |
destoryed | 组件销毁后调用 |
computed:是计算属性,依赖其他属性值,并且computed的值有缓存,只有它依赖的属性值发生改变,下一次获取computed的值时才会重新计算computed的值;
watch:更多的是【观察】的作用,类似于某些数据的监听回调,每当监听的数据变化时都会执行回调进行后续操作;
当我们需要进行数值计算,并且依赖于其他数据时,应该使用computed,因为可以利用computed的缓存特性,避免每次获取值时都需要重新计算
当我们需要在数据变化时执行一步或开销较大的操作时,应该使用watch,使用watch选项云信我们执行异步操作(访问一个api),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态。这些都是计算属性无法做到的
webpack原理分析(一)
webpack的基本的配置和应用
vue+elementui项目中,页面实现自适应,缩小放大页面排版基本保持不变
vue的虚拟Dom和react的虚拟Dom有什么区别
react跟vue的diff算法有什么区别
为什么说Vue是渐进式框架?
spa(single-page application)尽在web页面初始化时加载相应的HTML、JavaScript、css。一旦页面加载完成,spa不会因为用户的操作而进行页面的重新加载或跳转;取而代之的是利用个路由机制实现HTML内容的变换,ui与用户的交互、避免页面的重新加载。
优点:
1.用户体验好、快,内容的改变不需要重新加载整个页面,避免了不必要的跳转和重复渲染
2.基于上面一点,spa相对于服务器压力小
3.前后端职责分离,架构清晰,前端进行交互逻辑,后端负责数据处理
缺点:
1.初次加载耗时多:尉氏县单页面web应用功能及显示效果,需要在加载页面的时候将JavaScript、css统一加载,部分页面按需加载
2.前进后退路由管理:由于单页面应用在一个页面中显示所有的内容,所以不能使用浏览器的前进、后退功能,所有的页面切换需要自己简历堆栈管理
3.SEO难度较大:犹豫所有的内容都在一个页面中动态替换显示,所以在SEO上其有着天然的弱势
class可以通过对象语法和数组语法进行动态绑定
<div v-bind:class="{active:isActive,'text-align':hasError}"></div>
data:{
isActive:true,
hasError:false
}
<div v-bind:class="[isActive ? activeClass : errorClass]"></div>
data:{
activeClass :'active',
errorClass:'text-danger'
}
style可以通过对象语法和数组语法进行动态绑定
<div v-bind:style="{color: activeColor,fontSize: fontSize + 'px'}"></div>
data:{
activeColor: 'red',
fontSize : '20'
}
<div v-bind:style="[styleColor,styleSize]"></div>
data:{
styleColor: {
color: 'red',
},
styleSize: {
fontSize: '20px'
}
}
所有的prop都使得其父子prop之间形成了一个单向下行绑定:父级prop的更新会向下流动到子组件中,但是反过来则不行。这样会防止子组件意外改变父级组件的状态,从而导致你的应用个的数据流向难以理解。
额外的,每次父级组件发生更新时,子组件中给所有的prop都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变prop。如果你这样做了,vue会再浏览器的控制台中发出警告。子组件想修改时,只能通过$emit派发一个自定义事件,父组件接收到后,由父组件修改。
有两种常见的仕途改变一个prop的情形:
props:['initialCouner],
data() {
return {
counter:this.initialCouner
}
},
props:['size],
computed:{
normalizedSize:function(){
return this.size.trim().toLowerCase()
}
},
由于JavaScript的限制,vue不能检测到以下数组的变动:
// Vue.set
Vue.set(vm.items,indexOfItem,newValue)
//Vue.$set ,Vue.set的一个别名
vm.$set(vm.items,indexOfItem,newValue)
//Array.prototype.splic
vm.items.splice(indexOfItem,1,newValue)
为了解决第二个问题,Vue提供了一下操作方法:
//Array.prototype.splice
vm.items.splic(newLength)
https://baijiahao.baidu.com/s?id=1709872840052170461&wfr=spider&for=pc
1、减少请求数量
1.1 图片处理:
1-1 Base64:
将图片的内容以 Base64 格式内嵌到 HTML 中,可以减少 http 请求数量,但是编码之后的大小比图片大了
1-2 使用字体图标来代替图片
1.2 避免使用空的 src 和 href
1.3 不使用 css@import
2、减少资源大小
2.1 html 压缩
html 代码压缩就是压缩在文本文件中有意义,但是在 html 中不显示的字符,包括空格,制表符
2.2 css 压缩
css 压缩包括无效代码删除与 css 语义合并
2.3 js 压缩与混乱
js 压缩与混乱包括无效字符及注释的删除、代码语义的缩减和优化、降低代码的可读性、实现代码的保护
2.4 图片压缩
3、优化网络连接
3-1 使用 CDN
CDN 是内容分发网络,它能够实时地根据网络流量和各个节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上,其目的是使用户可以就近的取得所需内容,解决网络拥挤的状况,提高网站的响应速度
3-2 使用 DNS 预解析
4、优化资源加载
4.1 资源加载位置
通过优化资源加载位置,更改资源加载时机,使尽可能快地展示出页面内容,尽可能快地使用功能可用
1、css 文件放在 head 中,先外链,后本页
2、js 文件放在 body 底部,先外连,后本页
3、处理页面、处理页面布局的 js 文件放在 head 中,如 babel-polyfill.js 文件、flexible.js 文件
4、body 中尽量不写 style 标签和 script 标签
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。