居中处理

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>JS盒子模型属性</title>
  6. <style>
  7. * {
  8. margin: 0;
  9. padding: 0;
  10. }
  11. html,
  12. body {
  13. height: 100%;
  14. }
  15. .box {
  16. box-sizing: border-box;
  17. padding: 15px;
  18. width: 300px;
  19. height: 300px;
  20. border: 10px solid lightblue;
  21. background: lightcyan;
  22. font-size: 18px;
  23. line-height: 30px;
  24. }
  25. /* 居中:定位 */
  26. /* .box {
  27. position: absolute;
  28. top: 50%;
  29. left: 50%;
  30. margin-left: -150px;
  31. margin-top: -150px;
  32. } */
  33. /* .box {
  34. position: absolute;
  35. top: 50%;
  36. left: 50%;
  37. /!* 基于CSS3变形属性中的位移,在不知道宽高的情况下也能实现效果 *!/
  38. transform: translate(-50%, -50%);
  39. } */
  40. /* .box {
  41. position: absolute;
  42. top: 0;
  43. left: 0;
  44. bottom: 0;
  45. right: 0;
  46. margin: auto;
  47. } */
  48. /* FLEX :http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html*/
  49. /* body {
  50. display: flex;
  51. /!* 设置元素在FLEX容器主轴和交叉轴方向上的对齐方式:CENTER居中对齐 *!/
  52. justify-content: center;
  53. align-items: center;
  54. } */
  55. </style>
  56. </head>
  57. <body>
  58. <div id="box" class="box">
  59. 夫君子之行,静以修身,俭以养德,非淡泊无以明志,非宁静无以致远。夫学须静也,才须学也,非学无以广才,非志无以成学。淫漫则不能励精,险躁则不能冶性,年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐,将复何及~~
  60. </div>
  61. <script>
  62. // JS实现居中:(一屏幕的宽度-盒子的宽度)/2 === LEFT
  63. let winW = document.documentElement.clientWidth,
  64. winH = document.documentElement.clientHeight,
  65. box = document.getElementById('box');
  66. box.style.position = 'absolute';
  67. box.style.left = (winW - 300) / 2 + 'px';
  68. box.style.top = (winH - 300) / 2 + 'px';
  69. </script>
  70. </body>
  71. </html>

回到顶部

  1. let time = 2000;
  2. // let timerId = null; 一般我们不用全局变量记录定时器id,一般使用自定义属性的方式来记录定时器的ID;
  3. btn.onclick = function () {
  4. // 1. 计算速度
  5. let winScrollTop = win('scrollTop'); // 点击时页面滚动条卷去的高度
  6. if (winScrollTop <= 0) return; // 如果卷去的高度为小于等于0,不开启动画
  7. let speed = winScrollTop / time; // 计算速度
  8. let curT = 0; // curT记录经过的时间
  9. if (this.timerId) {
  10. // 如果timerId不是null就说明之前已经有动画了,在开启新的动画之前把原来的动画清除掉
  11. clearInterval(this.timerId);
  12. }
  13. this.timerId = setInterval(() => {
  14. curT += 16; // 让时间累加
  15. if (curT >= time) { // 当到大于等于time时,应该滚动到底了
  16. clearInterval(this.timerId);
  17. curT = time;
  18. }
  19. let change = 16 * speed; // 在curT时间内走过的路程
  20. winScrollTop -= change; // 经过curT时间后,页面滚动条的位置
  21. win('scrollTop', winScrollTop); // 设置回去
  22. }, 16);
  23. };

延迟加载.png

图片懒加载

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>图片延迟加载</title>
  6. <style>
  7. * {
  8. margin: 0;
  9. padding: 0;
  10. }
  11. img {
  12. border: none;
  13. }
  14. img[src=""] {
  15. display: none;
  16. }
  17. .imgBox {
  18. box-sizing: border-box;
  19. margin: 800px auto;
  20. width: 300px;
  21. height: 245px;
  22. background: #CCC;
  23. }
  24. .imgBox img {
  25. display: none;
  26. width: 100%;
  27. height: 100%;
  28. }
  29. </style>
  30. </head>
  31. <body>
  32. <!--
  33. 图片延迟加载 “图片懒加载”
  34. 1.结构中,我们用一个盒子包裹着图片(在图片不展示的时候,可以占据着这个位置,并且设置默认的背景图或
  35. 者背景颜色)
  36. 2.最开始,IMGSRC中不设置任何的图片地址,把图片的真实地址设置给自定义属性DATA-SRC/TRUE-IMG(最
  37. 开始不展示图片:可以让图片隐藏)
  38. 3.当浏览器窗口完全展示到图片位置的时候,我们再去加载真实图片,并且让其显示出来(第一屏幕中的图片一
  39. 般都会延迟加载,来等待其它资源先加载完)
  40. -->
  41. <div class="imgBox">
  42. <img src="" alt="" trueImg="images/IE3.jpg">
  43. </div>
  44. <!-- IMPORT JS -->
  45. <script>
  46. /*
  47. * offset:获取当前元素距离 BODY 的左/上偏移(不论其父参照物是谁)
  48. * @params
  49. * curEle:current element当前要操作的元素
  50. * @return
  51. * [object]包含上/左偏移的信息 => {top:xxx,left:xxx}
  52. */
  53. function offset(curEle) {
  54. let par = curEle.offsetParent,
  55. l = curEle.offsetLeft,
  56. t = curEle.offsetTop;
  57. while (par && par.tagName !== "BODY") {
  58. if (!/MSIE 8\.0/.test(navigator.userAgent)) {
  59. l += par.clientLeft;
  60. t += par.clientTop;
  61. }
  62. l += par.offsetLeft;
  63. t += par.offsetTop;
  64. par = par.offsetParent;
  65. }
  66. return {
  67. top: t,
  68. left: l
  69. };
  70. }
  71. /*
  72. * 图片完全显示出来的条件
  73. * A:盒子底边距离 BODY(页面最顶端)的距离:盒子的高度+盒子距 BODY 的上偏移
  74. * B:浏览器底边距离 BODY 的距离:一屏幕的高度 + 卷去的高度
  75. * A <= B:盒子就完全出现在用户的视野中
  76. * 让图片显示
  77. * 获取图片 TRUE-IMG 属性的值,赋值给 SRC 属性,当图片能正常加载出来后,让图片显示即可
  78. */
  79. let imgBox = document.querySelector('.imgBox'),
  80. _img = imgBox.querySelector('img');
  81. // 显示图片
  82. // curImg:要显示的图片
  83. function lazyImg(curImg) {
  84. // 给 SRC 赋值真实的图片地址
  85. let trueImg = curImg.getAttribute("trueImg");
  86. curImg.src = trueImg;
  87. // 校验图片是否能够正常加载出来:IMG.ONLOAD 事件用来监听图片是否能加载
  88. curImg.onload = function () {
  89. curImg.style.display = 'block';
  90. };
  91. // 设置自定义属性:isLoad 存储当前图片已经加载过了
  92. curImg.isLoad = true;
  93. }
  94. // 监听页面滚动事件(不论基于什么方式,只要页面滚动了,则触发事件)
  95. window.onscroll = function () {
  96. // 已经加载过就不要在重复加载了
  97. if (_img.isLoad) return;
  98. let HTML = document.documentElement,
  99. B = HTML.clientHeight + HTML.scrollTop,
  100. A = imgBox.offsetHeight + offset(imgBox).top; // 当前案例中,获取距离 BODY 的上偏移完全可以 imgBox.offsetTop,因为父参照物就是 BODY
  101. if (A <= B) {
  102. // 符合图片显示的条件了
  103. lazyImg(_img);
  104. }
  105. };
  106. </script>
  107. </body>
  108. </html>