居中处理
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JS盒子模型属性</title>
<style>
* {
margin: 0;
padding: 0;
}
html,
body {
height: 100%;
}
.box {
box-sizing: border-box;
padding: 15px;
width: 300px;
height: 300px;
border: 10px solid lightblue;
background: lightcyan;
font-size: 18px;
line-height: 30px;
}
/* 居中:定位 */
/* .box {
position: absolute;
top: 50%;
left: 50%;
margin-left: -150px;
margin-top: -150px;
} */
/* .box {
position: absolute;
top: 50%;
left: 50%;
/!* 基于CSS3变形属性中的位移,在不知道宽高的情况下也能实现效果 *!/
transform: translate(-50%, -50%);
} */
/* .box {
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
margin: auto;
} */
/* FLEX :http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html*/
/* body {
display: flex;
/!* 设置元素在FLEX容器主轴和交叉轴方向上的对齐方式:CENTER居中对齐 *!/
justify-content: center;
align-items: center;
} */
</style>
</head>
<body>
<div id="box" class="box">
夫君子之行,静以修身,俭以养德,非淡泊无以明志,非宁静无以致远。夫学须静也,才须学也,非学无以广才,非志无以成学。淫漫则不能励精,险躁则不能冶性,年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐,将复何及~~
</div>
<script>
// JS实现居中:(一屏幕的宽度-盒子的宽度)/2 === LEFT
let winW = document.documentElement.clientWidth,
winH = document.documentElement.clientHeight,
box = document.getElementById('box');
box.style.position = 'absolute';
box.style.left = (winW - 300) / 2 + 'px';
box.style.top = (winH - 300) / 2 + 'px';
</script>
</body>
</html>
回到顶部
let time = 2000;
// let timerId = null; 一般我们不用全局变量记录定时器id,一般使用自定义属性的方式来记录定时器的ID;
btn.onclick = function () {
// 1. 计算速度
let winScrollTop = win('scrollTop'); // 点击时页面滚动条卷去的高度
if (winScrollTop <= 0) return; // 如果卷去的高度为小于等于0,不开启动画
let speed = winScrollTop / time; // 计算速度
let curT = 0; // curT记录经过的时间
if (this.timerId) {
// 如果timerId不是null就说明之前已经有动画了,在开启新的动画之前把原来的动画清除掉
clearInterval(this.timerId);
}
this.timerId = setInterval(() => {
curT += 16; // 让时间累加
if (curT >= time) { // 当到大于等于time时,应该滚动到底了
clearInterval(this.timerId);
curT = time;
}
let change = 16 * speed; // 在curT时间内走过的路程
winScrollTop -= change; // 经过curT时间后,页面滚动条的位置
win('scrollTop', winScrollTop); // 设置回去
}, 16);
};
图片懒加载
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>图片延迟加载</title>
<style>
* {
margin: 0;
padding: 0;
}
img {
border: none;
}
img[src=""] {
display: none;
}
.imgBox {
box-sizing: border-box;
margin: 800px auto;
width: 300px;
height: 245px;
background: #CCC;
}
.imgBox img {
display: none;
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<!--
图片延迟加载 “图片懒加载”
1.结构中,我们用一个盒子包裹着图片(在图片不展示的时候,可以占据着这个位置,并且设置默认的背景图或
者背景颜色)
2.最开始,IMG的SRC中不设置任何的图片地址,把图片的真实地址设置给自定义属性DATA-SRC/TRUE-IMG(最
开始不展示图片:可以让图片隐藏)
3.当浏览器窗口完全展示到图片位置的时候,我们再去加载真实图片,并且让其显示出来(第一屏幕中的图片一
般都会延迟加载,来等待其它资源先加载完)
-->
<div class="imgBox">
<img src="" alt="" trueImg="images/IE3.jpg">
</div>
<!-- IMPORT JS -->
<script>
/*
* offset:获取当前元素距离 BODY 的左/上偏移(不论其父参照物是谁)
* @params
* curEle:current element当前要操作的元素
* @return
* [object]包含上/左偏移的信息 => {top:xxx,left:xxx}
*/
function offset(curEle) {
let par = curEle.offsetParent,
l = curEle.offsetLeft,
t = curEle.offsetTop;
while (par && par.tagName !== "BODY") {
if (!/MSIE 8\.0/.test(navigator.userAgent)) {
l += par.clientLeft;
t += par.clientTop;
}
l += par.offsetLeft;
t += par.offsetTop;
par = par.offsetParent;
}
return {
top: t,
left: l
};
}
/*
* 图片完全显示出来的条件
* A:盒子底边距离 BODY(页面最顶端)的距离:盒子的高度+盒子距 BODY 的上偏移
* B:浏览器底边距离 BODY 的距离:一屏幕的高度 + 卷去的高度
* A <= B:盒子就完全出现在用户的视野中
* 让图片显示
* 获取图片 TRUE-IMG 属性的值,赋值给 SRC 属性,当图片能正常加载出来后,让图片显示即可
*/
let imgBox = document.querySelector('.imgBox'),
_img = imgBox.querySelector('img');
// 显示图片
// curImg:要显示的图片
function lazyImg(curImg) {
// 给 SRC 赋值真实的图片地址
let trueImg = curImg.getAttribute("trueImg");
curImg.src = trueImg;
// 校验图片是否能够正常加载出来:IMG.ONLOAD 事件用来监听图片是否能加载
curImg.onload = function () {
curImg.style.display = 'block';
};
// 设置自定义属性:isLoad 存储当前图片已经加载过了
curImg.isLoad = true;
}
// 监听页面滚动事件(不论基于什么方式,只要页面滚动了,则触发事件)
window.onscroll = function () {
// 已经加载过就不要在重复加载了
if (_img.isLoad) return;
let HTML = document.documentElement,
B = HTML.clientHeight + HTML.scrollTop,
A = imgBox.offsetHeight + offset(imgBox).top; // 当前案例中,获取距离 BODY 的上偏移完全可以 imgBox.offsetTop,因为父参照物就是 BODY
if (A <= B) {
// 符合图片显示的条件了
lazyImg(_img);
}
};
</script>
</body>
</html>