在的网站越来越流行吸顶特效,或者某个版块滚动到顶部后固定到顶部的一个特效!如下:(高手请飘过)
在线报名版块吸顶效果
该吸顶特效代码:
var oDiv=document.getElementById('bm'); //获取当前div
var divT=oDiv.offsetTop; //距离顶部距离
// console.log(divT);
window.onscroll=function() { // 获取当前页面的滚动条纵坐标位置 (依次为火狐谷歌、safari、IE678)
var scrollT=document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
// console.log(scrollT);
if (scrollT >=divT) {
if (window.navigator.userAgent.indexOf('MSIE 6.0') !=-1) { // 兼容IE6代码
oDiv.style.position='relative';
oDiv.style.top=scrollT + 'px';
} else { // 正常浏览器代码
oDiv.style.position='fixed';
oDiv.style.top='80px'; //吸顶位置距离顶部80px
}
} else {
oDiv.style.position='';
oDiv.style.top=0;
}
}
吸顶效果一般都是通过修改对应css的属性,有原来的relative改成fixed,但是当一个css的属性改成fixed的时候,整个版块就会脱离文档流,这样在临界点时候就会产生抖动!比如下拉500px之后,产生吸顶效果,此时整个文档的高度为:500px+当前版块高度,也就是至少下拉到501px的时候才满足吸顶条件!一旦吸顶后,版块有relative变成了fixed属性,脱离文档流,这时候整个文档的高度又变成了500px,此时已经不满足系统条件,版块的fixed又变成relative,而后又满足了吸顶条件....这样就产生了吸顶抖动,让人难受的情况!
解决吸顶效果就是提前利用占位符,把当前的版块位置占了,这样就是变成fixed时候,整个版块的高度仍然不变,我一般用两种方法:
(1)创建一个父DIV
创建一个父div,并且给div一个固定的高度!这样只是子div发生了变化,不影响整个版块高度!
注意:空的div对于是不是占位有一点的不兼容,所以有条件可以加个做左侧悬浮,加上块属性
float:left; display:block;
(2)通过js动态添加或者去除margin-top属性!
通过margin-top占去版块本身的位置,当不满足吸顶时候,再释放margin-top,
相关代码案例:
$(window).bind('scroll', function () {
if ($(window).scrollTop() > 0) {
$('.navbar').addClass('is-fixed');//给navbar增加is-fixed属性
$(".main2").css("margin-top","40px");//给紧邻的div添加margin,防止抖动
} else {
$('.navbar').removeClass('is-fixed');
$(".main2").css("margin-top","0px");//还原
}
});
这种问题对于高手来说可能是小意思了,对于初学js者可能多多稍稍都会碰到这种问题,总结一下,或许你会用到!
. 前言
在互联网时代,网络应用的性能对于用户体验、市场竞争力和公司声誉至关重要。随着Web技术的不断发展,用户对网页加载速度和响应速度的期望不断提高。因此客观、标准地衡量页面性能对于优化页面具有关键性的指导作用。通过准确地评估性能瓶颈和问题所在,我们可以更有效地调整和优化页面,从而改善用户体验,提高市场竞争力。
2. 关键指标
2.1
FCP (First Contentful Paint)
首次内容绘制,标记浏览器渲染来自 DOM 第一位内容的时间点,内容可能是文本、图像等元素,是用户感知加载速度的一个重要指标。
2.2
LCP (Largest Contentful Paint)
最大内容绘制时间,计算从页面开始加载到用户与页面发生交互(点击,滚动)这段时间内,最大元素绘制的时间,该时间会随着页面渲染变化而变化,因为页面中的最大元素在渲染过程中可能会发生改变。
2.3
LCP (Largest Contentful Paint)
累计布局偏移。测量在页面的整个页面生命周期内发生的所有意外布局偏移中累计的布局偏移分数。
更多的页面指标不在重复解释,感兴趣可以查看https://web.dev/metrics/
3. 衡量指标
性能指标一般通过以下两种方式来进行测量:
1、Chrome 开发者工具
2、lighthouse
3、WebPageTest
1、ftwo 之家基于web-vitals包装的前端性能采集工具
2、Chrome User Experience Report 是google的性能检测工具,通过引入google提供的脚本,将我们的客户端数据上报google,从而统计你的网页的性能报告和评估
如何衡量线上页面站点性能,推荐使用之家的ftwo前端线上采集工具,基于真实用户实际浏览过程中收集相关指标,坏体验的UV指标参照如下,坏UV占比控制在25%以下
4. 优化措施
4.1
网络层面
? 开启Gzip压缩
gzip 是 GNUzip 的缩写,最早用于 UNIX 系统的文件压缩。HTTP 协议上的 gzip 编码是一种用来改进 web 应用程序性能的技术,web 服务器和客户端(浏览器)必须共同支持 gzip。目前主流的浏览器,Chrome,firefox,IE 等都支持该协议。常见的服务器如 Apache,Nginx,IIS 同样支持,gzip 压缩效率非常高,通常可以达到 70% 的压缩率。
?使用 HTTP 2
HTTP2.0 大幅度的提高了 web 性能,在 HTTP1.1 完全语义兼容的基础上,进一步减少了网络的延迟。实现低延迟高吞吐量。
? 使用CDN
使用内容分发网络(CDN)是一种优化页面性能的有效方法,它能够缩短网络加载时间,为用户提供更快的访问速度。CDN 将网站的静态资源(如文档、图片、样式表、脚本等)复制到分布在各地的服务器上,使用户能够从离他们较近的服务器上加载资源,从而减少网络延迟。
为了从 CDN 中获得最佳性能,应针对文档、资源和接口分别设置合适的缓存时长。以下是一些建议:
1. 文档:对于 HTML 文档,建议设置较短的缓存时长(如几分钟到几小时),以便在内容发生更改时,用户能够尽快获取到更新后的内容。
2. 资源:对于 CSS、JavaScript 等静态资源,可以设置较长的缓存时长(如一周到一个月),因为这些资源的更新频率通常较低。但务必确保资源具有唯一的版本号或哈希值,以便在更新时使缓存失效。
3. 接口:对于 API 接口,缓存时长的设置要根据数据更新频率进行调整。如果数据经常发生变化,建议使用较短的缓存时长;如果数据变化不大,可以使用较长的缓存时长。同时要注意合理设置缓存策略,如 Cache-Control 头部,以确保数据的实时性和准确性。
通过使用 CDN 并合理设置缓存时长,我们可以显著提高页面加载速度,优化用户体验,并节省服务器带宽和资源。
4.2
图片优化
图片往往是一个 h5 页面的重要组成部分,然而图片占用的资源往往也是很大的,因此图片优化在性能优化中占据很重要的地位。下面来看几种优化图片的方式。
4.3
代码优化
? 第三方插件、库按需引入
在项目中经常会使用到第三方的插件,比如在模板页中引入或是全局注册,会导致项目首屏资源体积增加,改成组件内局部注册或是动态引入lib的地址
? 动态组件,按需引入
场景一: 在我们营销专题页中弹窗种类很多,但是实际在用户端弹出使用时刻,只会是一两个弹窗。因此统一所有弹窗的入口,在通过动态组件只弹窗某一个弹窗。
场景二: 长页面,板块很多,而且都是城市维度的动态数据,
非首屏的板块,提前预热计算板块是否存在,通过动态组件和板块的高度,当滑动可视窗口才开始下载资源和渲染。
? 动态组件有序显示
通过指令和组件完成状态,实现组件有序显示,避免出现页面CLS偏移。
(1)自定义指令v-module-status,绑定两个参数一个版块的顺序,一个版块的执行完成状态。
(2)定义一个全局组件状态存储对象,存储页面使用了v-module-status指令的组件状态数据。
(3)指令中检查当前组件的执行完成状态是否完成,若完成,则遍历全局组件状态存储对象,查找出当前组件之前的所有组件,查看是否之前的所有组件已经完成接口请求,如果完成则把当前组件的display:none移除,反之设置成display:none,同时当前之后的所有组件也进行更新是否显示的状态。
(4)使用指令的组件内部需要配合设置一个接口请求完成状态的标识,传递给指令,能保证指令可以拿到当前组件的接口请求状态。
? 去掉页面端重定向
广告位投放中间页,根据一定条件,跳转不同的落地页,影响页面的重定向时长。
? 去掉页面端自动锚点
带车系投递(高意向度)滚动锚点至猜你喜欢板块,不带车系通投(低意向度)锚点到SKU板块;猜你喜欢、SKU板块中间存在N个动态的板块,自动锚点时,页面会不断跳动,给用户带来不友好的体验。
定
指定车系投放
通
无车系通投
为了改善用户体验,建议采取以下措施之一:
1. 去掉自动锚点功能,让用户自主地浏览页面和板块,避免页面频繁跳动。
2. 优化自动锚点逻辑,在用户关闭半屏开屏弹窗后再进行锚点跳转。这样一来,用户可以先关注弹窗内容,并在关闭后再被引导至相应板块,从而减少页面跳动现象。
? vue 路由懒加载
当打包构建应用时,JavaScript 包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。
let router=createSimpleRouter({
routes: [
{
path: `${URL_PREFIX}/index`,
name: "index",
component: ()=> import(/* webpackChunkName: "index" */ '../views/index/Index'),
meta: meta
},
{
path: `${URL_PREFIX}/cities`,
name: "cities",
component: ()=> import(/* webpackChunkName: "cities" */ '../views/cities/Index'),
meta: {
...meta,
subcategoryId: 11750,
}
},
{
path: `${URL_PREFIX}/success/:encryptedOrderId`,
name: "success",
component: ()=> import(/* webpackChunkName: "success" */ '../views/success/Index'),
meta: {
...meta,
subcategoryId: 14393,
}
}]
});
参考链接
https://web.dev/metrics/
https://www.infoq.cn/article/HVyqFtlxgDao4vq5Durp
作者简介
方林锋
■ 经销商技术部-营销活动团队
■ 2015年加入汽车之家,任职于经销商技术部-营销活动技术团队,目前负责专题、车展等相关开发。
来源:微信公众号:之家技术
出处:https://mp.weixin.qq.com/s/vY-tgd20BphaONOGbQw9IQ
以下是一个标准的html结构
html复制代码<!DOCTYPE html>
<html>
<head>
<!-- 必须声明 utf-8 编码格式 -->
<meta charset="utf-8">
<!-- 页面标题不能为空 -->
<title>京东商城:商家后台</title>
<!-- 移动端必须使用 viewport 适配需要, PC 看场景需要使用 -->
<meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no">
<!-- 样式文件 以外链形式在此处引入 -->
<link href="//static.360buyimg.com/bus/test/shop1_3/UI2.0update.css" rel="stylesheet">
</head>
<body>
<!-- 页面主体 -->
<div class="warp">
<header>顶部内容区域,比如:菜单头</header>
<div class="content">主内容区域</div>
<footer>顶部页尾区域,比如:备案号</footer>
</div>
<!-- js文件 在此处引入 -->
<script type="text/javascript" src="//wl.jd.com/joya.js"></script>
</body>
</html>
避免多个框架混合使用,在同一个工程里面要保持主框架的一致性,多框架同时使用会造成代码混乱,后期会变得越来越难维护。
1、全局样式禁止使用!important
2、避免使用导入式引入css样式文件;
css复制代码<style type="text/css">
@import url(./demo.css);
</style>
历史页面会有一些功能下线,在去除页面初始化的js语句的同时,也要将依赖的js文件删除,避免资源加载浪费
开启Gzip压缩功能, 可以使网站的css、js 、xml、html 文件在传输时进行压缩,提高访问速度
在开发过程中,发现无用字段占传输比例30%以上时,请进行返回数据的删减,加快数据请求速度
上传图片之前一定要做图片的无损压缩,节省网络流量,推荐网站tinypng
html复制代码<!DOCTYPE html>
<html>
<head>
<!-- 必须声明 utf-8 编码格式 -->
<meta charset="utf-8">
<!-- keywords 关键词 和 Description 页面描述 便于搜索引擎检索,不强制使用 -->
<meta name="Keywords" Content=”关键词1,关键词2,关键词3,关键词4″>
<meta name="Description" Content=”页面描述″>
<!-- 移动端必须使用 viewport 适配需要, PC 看场景需要使用 -->
<meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no">
<!-- 推荐手动引入指定路径 favicon -->
<link rel="shortcut icon" href="path/to/favicon.ico">
<!-- 样式文件必须以外链形式在此处引入 -->
<link href="//static.360buyimg.com/bus/test/shop1_3/UI2.0update.css" rel="stylesheet">
<!-- 内联样式 -->
<style type="text/css">
.warp {
margin: 0;
padding: 0;
}
</style> -->
<!-- 页面标题不能为空 -->
<title>页面标题</title>
</head>
<body>
<!-- 页面主体 -->
<div class="warp">
<header>顶部内容区域,比如:菜单头</header>
<div class="content">主内容区域</div>
<footer>顶部页尾区域,比如:备案号</footer>
</div>
<!-- JavaScript 文件在此处引入 -->
<script type="text/javascript" src="//wl.jd.com/joya.js"></script>
</body>
</html>
原生 HTML 标签元素小写使用,自定义组件使用小驼峰命名(自定义标签避免和原生标签同名)
html复制代码<!-- 错误 ? -->
<DIV></DIV>
<SPAN></SPAN>
<!-- 正确 ? -->
<div></div>
<p></p>
<!-- 自定义组件 -->
<shareDialog><shareDialog/>
禁止在行内元素中嵌套块级元素??
html复制代码<!-- 错误的嵌套 ? -->
<span><div></div></span>
<i><p></p></i>
<!-- 正确的嵌套 ? -->
<div><span></span></div>
<p><i></i></p>
更多标签使用规则介绍请查看尾部附录
定义属性赋值时,使用双引号,禁止单双引号混用
html复制代码<!-- 错误的定义 ? -->
<input id="formTitle" type='text' placeholder="请输入标题">
<!-- 正确的定义 ? -->
<input id="formTitle" type="text" placeholder="请输入标题" data="formTitle">
除自闭合标签外,所有标签都需正确的编写闭合标签
常用自闭合标签: <br />、<col />、<img />、<input />、<link />、<meta />、<keygen />
ID 和 Class 取通用且有意义的名字;
使用连字符 - 作为 ID、Class 名称界定符 ,不要驼峰命名法和下划线;
避免选择器嵌套层级过多,尽量少于 3 级;
使用命名空间防止命名冲突,利于维护;
css复制代码/* 不推荐: 无意义 不易理解 */
#yee-1901 {}
#meunBtn {}
.login_input {}
/* 推荐: 明确详细 */
#gallery {}
#login {}
.login-input {}
.meun-btn {}
css复制代码/* 标准的声明顺序 */
.declaration-order {
/* 布局属性 */
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 100;
/* 盒模型属性 */
display: block;
box-sizing: border-box;
width: 100px;
height: 100px;
padding: 10px;
border: 1px solid #e5e5e5;
border-radius: 3px;
margin: 10px;
float: right;
overflow: hidden;
/* 文本属性 */
font: normal 13px "Helvetica Neue", sans-serif;
line-height: 1.5;
text-align: center;
/* 视觉属性 */
background-color: #f5f5f5;
color: #fff;
opacity: .8;
/* 其他属性 */
cursor: pointer;
}
<img/>标签守则
html复制代码<!-- 禁止 src 取值为空 -->
<img src="" />
<!-- 推荐 -->
<img src="xxxx" alt="xxx" style="width:100px;height:100px;" />
尺寸 小于 50 ×?50 的请使用 字体图标(iconfont)或者 将多个图标合成一张大图使用(雪碧图) 尺寸大于 50 ×?50 的图片,引入前先使用 在线压缩 对其进行压缩 ,图片大小尽量控制在 300kb 以内
PC端、移动端 推荐使用 2倍图 (@2x),避免设备分辨率过高,图片显示失真模糊 如有兼容 iPad 场景等特殊场景,可使用 3倍图(@3x)
html复制代码<img src="//logo@200x200.jpg" alt="xx" style="width:100px;height:100px;"/>
2倍图: 图片展示区域大小 : 图片实际尺寸=1 :2
无论使用几倍图,图片大小都需遵守上条限制
如遇图片倍图问题,可咨询 @UI童鞋
js复制代码/* 推荐用变量保存频繁使用的 DOM 元素*/
var ul=document.getElementsByTagName('ul')[0],
lis=document.getElementsByTagName('ul')[0].getElementsByTagName('p')
/* 推荐用变量保存频繁使用的 DOM 元素*/
var ul=document.getElementsByTagName('ul')[0],
lis=ul.getElementsByTagName('li')
1个页面中建议CSS文件不要超过3个(1个组件库样式文件、1个项目公共样式、1个页面样式); JS文件不要超过5个(1个框架文件、1个组件库文件、1个项目公共库文件、1个页面脚本文件、1个埋点文件)。
缩进使用 2个空格 样式建议引入 CSS reset 重置各浏览器自带样式差异 github.com/necolas/nor… JS 中字符串定义 使用 '' 单引号
保持一定的代码洁癖,尤其在大型项目中
性能检测工具 - Lighthouse简介 Lighthouse是一个Google开源的自动化工具,主要用于改进网络应用的质量。Lighthouse会对各个测试项的结果打分,并给出优化建议,这些打分标准和优化建议可以视为Google的网页最佳实践。
Chrome拓展程序 谷歌商店安装lighthouse后,在右上角或者菜单里点击图中图标,Options可以配置测试项目,点击Generate report即可测试。
命令行
js复制代码<!-- 安装 lighthouse 组件(Node.js V5.0 或以上版本) -->
npm install -g lighthouse
<!-- 启动测试 (测试过程中会自动打开 Chrome 完成后会在当前目录生成一个静态HTML文件) -->
lighthouse https://www.baidu.com/ --view
<!-- 帮助-->
lighthouse --help
检测结果
标签 | 语义 | 嵌套常见错误 | 常用属性 |
<a></a> | 超链接/锚 | a不可嵌套a | href,name,title,rel,target |
<div></div> | 块级容器 | ||
<p></p> | 段落 | 不能嵌套块级元素 | |
<span></span> | 内联容器(行内元素) | 不可嵌套块级容器 | |
<form></form> | 表单 | action,target,method,name | |
<input /> | 输入框 | 不可嵌套元素 | type,name,value,checked,disabled,maxlength,readonly,accesskey |
<textarea></textarea> | 多行文本输入控件 | name,accesskey,disabled,readonly,rows,cols | |
<img /> | 图像 | 不可嵌套元素 | alt,src,width,height |
<label></label> | 标签(常用input元素定义标注) | 不可嵌套块级容器 | for |
<table></table> | 表格 | 只可嵌套表格子元素 | width,align,background,cellpadding,cellspacing,summary,border |
<tbody></tbody> | 表格主体 | 只能嵌套在table内 | |
<thead></thead> | 表头 | 只能嵌套在table内 | |
<tr></tr> | 表格行 | 嵌套于table或thead、tbody、tfoot | |
<td></td> | 表格中的单元格 | 只用于tr | colspan,rowspan |
<th></th> | 表格中的标题单元格 | 只用于tr | colspan,rowspan |
<tfoot></tfoot> | 表格表尾 | 只用于table | |
<button></button> | 按钮 | 不可嵌套表单、表格等块级元素 | type,disabled |
<select></select> | 列表框或下拉框 | 只能嵌套option或optgroup | name,disabled,multiple |
<option></option> | select中的一个选项 | 只能嵌套在select内 | value,selected,disabled |
<ol></ol> | 有序列表 | 只能嵌套li | |
<ul></ul> | 无序列表 | 只能嵌套li | |
<li></li> | 无序列表项 | 只能嵌套在 ul 或 ol 内 | |
<iframe></iframe> | 内嵌一个网页 | frameborder,width,height,src,scrolling,name | |
<br /> | 换行 | ||
<link /> | 引用样式或icon | 不可嵌套任何元素 | type,rel,href |
<meta /> | 文档信息 | 只用于head内 | content,http-equiv,name |
<script></script> | 引用脚本 | 不可嵌套任何元素 | type,src |
<style></style> | 引用样式 | 不可嵌套任何元素 | type,media |
<title></title> | 文档标题 | 只用于head内 |
点赞收藏支持、手留余香、与有荣焉,动动你发财的小手哟,感谢各位大佬能留下您的足迹。
作者:StriveToY
链接:https://juejin.cn/post/7262378982255394873
*请认真填写需求信息,我们会在24小时内与您取得联系。