JavaScript【瀑布流-页面布局、动态设置内容居中、动态设置图片位置、页面触底、上拉加载、页面布局、动态切换、页面布局】(十五)

news2024/11/24 8:34:08

 

目录

DOM实操-瀑布流-页面布局

瀑布流特点

DOM实操-瀑布流-动态设置内容居中

 DOM实操-瀑布流-动态设置图片位置

DOM实操-瀑布流-页面触底

DOM实操-瀑布流-上拉加载

DOM实操-轮播图-页面布局

轮播图 

轮播图特点

DOM实操-轮播图-动态切换

 DOM实操-放大镜-页面布局

放大镜 

DOM实操-放大镜-业务逻辑

 DOM实操-回到顶部

回到顶部 


DOM实操-瀑布流-页面布局

瀑布流 

瀑布流是一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部

瀑布流特点

1 多列布局

2 每列等宽

3 上拉加载 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initialscale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./css/style.css">
</head>
<body>
    <div id="container">
        <div class="box">
            <div class="boximg">
                <img src="./img/1.jpeg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="boximg">
               <img src="./img/2.jpeg"  alt="">
            </div>
        </div>
        <div class="box">
            <div class="boximg">
                <img src="./img/3.jpeg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="boximg">
                <img src="./img/4.jpeg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="boximg">
                <img src="./img/5.jpeg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="boximg">
                <img src="./img/6.jpeg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="boximg">
                <img src="./img/7.jpeg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="boximg">
                <img src="./img/8.jpeg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="boximg">
                <img src="./img/9.jpeg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="boximg">
                <img src="./img/10.jpeg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="boximg">
                <img src="./img/11.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="boximg">
                <img src="./img/10.jpeg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="boximg">
                <img src="./img/11.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="boximg">
                <img src="./img/10.jpeg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="boximg">
                <img src="./img/11.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="boximg">
                <img src="./img/10.jpeg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="boximg">
                <img src="./img/11.jpg" alt="">
            </div>
        </div>
    </div>
    <script src="./js/index.js"></script>
 </body>
</html>
*{
    padding: 0;
    margin: 0;
}
#container{
    position: relative;
}
.box{
    padding: 5px;
    float: left;
}
.boximg{
    padding: 5px;
    box-shadow: 0 0 5px #ccc;
    border:1px solid #ccc;
    border-radius: 5px;
}
.boximg img{
    width: 250px;
    height: auto;
}

DOM实操-瀑布流-动态设置内容居中

1、 获取所有需要操作的元素

2 、获取屏幕的宽度

3、 获取一个图片元素容器的宽度

4 、动态计算页面横向最多可放置的图片数量

5 、动态设置样式,让内容左右居中 

function waterFlow(){
    var parentContainer = document.getElementById("container");
    var screenWidth = document.documentElement.clientWidth;
    var childWidth = allChild[0].offsetWidth;
    var rowsNum = Math.floor(screenWidth / childWidth);
    parentContainer.style.cssText = "width:" + childWidth * rowsNum + "px;margin:0 auto";
}
waterFlow();

 DOM实操-瀑布流-动态设置图片位置

获取一列中最小高度,后续每张图片都是放在一列中最小高度的下面

1 获取第一行图片高度,放入到数组中

2 获取后续图片,放入到数组高度最小的对应图片下面 

function getMinHeightOfCols(allChild,rowsNum){
    var colsHeightArr = [];
    for(var i = 0;i<allChild.length;i++){
        if(i < rowsNum){
            colsHeightArr[i] = allChild[i].offsetHeight;
       }else{
            var minHeightofCols = Math.min.apply(null,colsHeightArr);
            var minHeightOfIndex = colsHeightArr.indexOf(minHeightofCols);
            allChild[i].style.position = "absolute";
            allChild[i].style.top = minHeightofCols + "px";
            allChild[i].style.left = allChild[minHeightOfIndex].offsetLeft + "px";
            colsHeightArr[minHeightOfIndex] = colsHeightArr[minHeightOfIndex] + allChild[i].offsetHeight;
       }
   }
}

DOM实操-瀑布流-页面触底

1、 逻辑:滚动高度 + 视口高度 = 文档高度

2、 业务:滚动高度 + 视口高度 > 最后一个元素顶部距离顶部高度 

function checkReachBottom(){
    var scrollHeight = document.documentElement.scrollTop;
    var pageHeight = document.documentElement.clientHeight;
    var allChild = document.getElementsByClassName("box");
    var lastChildTop = allChild[allChild.length - 1].offsetTop;
    return lastChildTop < pageHeight + scrollHeight ? true : false;
}

DOM实操-瀑布流-上拉加载

1 动态创建元素

2 重新加入瀑布流效果 

window.onscroll = function () {
    if (checkReachBottom()) {
        var parentContainer = document.getElementById("container");
        for(var i = 0;i<dataImage.data.length;i++){
            var childBox = document.createElement("div");
          childBox.setAttribute("class","box");
          parentContainer.appendChild(childBox);
            var childImgBox = document.createElement("div");
          childImgBox.setAttribute("class","boximg");
          childBox.appendChild(childImgBox);
            var img = document.createElement("img");
            childImgBox.appendChild(img);
       }
        waterFlow();
   }
}

DOM实操-轮播图-页面布局

轮播图 

轮播图是用一套图片以一定时间间隔(如5秒)进行循环播放,一段 时间内呈现给用户不同的内容展示方式

轮播图特点

1 、自动循环播放

2、 指示器聚焦导航

<div class="box">
    <div class="imglist" id="imglist">
        <ul>
            <li class="current"><a href="#"> <img src="./img/1.jpg" alt=""></a></li>
            <li><a href="#"><img src="./img/2.jpg" alt=""></a></li>
            <li><a href="#"><img src="./img/3.jpg" alt=""></a></li>
            <li><a href="#"><img src="./img/4.jpg" alt=""></a></li>
            <li><a href="#"><img src="./img/5.jpg" alt=""></a></li>
        </ul>
    </div>
    <div class="btn">
        <span class="leftbtn" id="left"></span>
        <span class="rightbtn" id="right"></span>
    </div>
    <div class="circle" id="circle">
        <ul>
            <li class="current"></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
        </ul>
    </div>
</div>
*{
    margin: 0;
    padding: 0;
}

.box{
    width: 672px;
    height: 320px;
    border: 1px solid gray;
    margin: 100px auto;
    position: relative;
}

ul{
    list-style: none;
}

.imglist ul li{
    width: 672px;
    height: 320px;
    position: absolute;
    top:0;
    left: 0;
    display: none;
}

.imglist ul li.current{
    display: block;
}

.btn span{
    width: 55px;
    height: 55px;
    background: url("./images/sohu//slidebtnL.png");
    position: absolute;
    top: 50%;
    margin-top: -27px;
}

.btn span.leftbtn{
    left: 10px;
}

.btn span.rightbtn{
    right: 10px;
    background: url("./images/sohu/slidebtnR.png");
}

.circle{
    position: absolute;
    bottom: 10px;
    right: 10px;
}
.circle ul li{
    width: 10px;
    height: 10px;
    border-radius: 50%;
    background: rgba(0, 0, 0, 0.5);
    float: left;
    margin-right: 10px;
}
.circle ul li.current{
    background: rgba(255,255,255,1);
}

DOM实操-轮播图-动态切换

// 1. 获取元素
var imglis = document.getElementById("imglist").querySelectorAll("li");
var leftBtn = document.getElementById("left");
var rightBtn = document.getElementById("right");
var circlelis = document.getElementById("circle").querySelectorAll("li");
// idx控制图片显示
var idx = 0;
leftBtn.onclick = function () {
    idx++
    console.log(idx);
    changePic();
}
rightBtn.onclick = function () {
    idx--
    console.log(idx);
    changePic();
}
// 2. 控制页面图片显示与隐藏
function changePic() {
    // idx边界处理
    if (idx > imglis.length - 1) {
        idx = 0;
   }
    if (idx < 0) {
        idx = imglis.length - 1;
   }
    // 先把所有的current都移除,然后给对一个的那个元素添加显示就行了
    for (var i = 0; i < imglis.length; i++)
    {
         imglis[i].removeAttribute("class");
   }
    imglis[idx].setAttribute("class", "current");
    for (var i = 0; i < circlelis.length; i++) {
      circlelis[i].removeAttribute("class");
   }
    // 设置指示器高亮
    circlelis[idx].setAttribute("class","current")
}
// 点击指示器切换图片
for(var i = 0;i<circlelis.length;i++){
     (function(i){
        circlelis[i].onclick = function(){
            idx = i;
            changePic();
       }
   })(i)
}
// for (var i = 0; i < circlelis.length; i++) {
//     // 自定义属性的方式处理
//     circlelis[i].idxx = i;
//     circlelis[i].onclick = function () {
//         // 不就是获取不到i的值
//         idx = this.idxx;
//         changePic();
//     }
// }

 DOM实操-放大镜-页面布局

放大镜 

通过鼠标滑动,对页面某个部分的区域放大

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initialscale=1.0">
    <title>Document</title>
    <style>
       *{
            margin: 0;
            padding: 0;
       }
        .smallpic{
            width: 450px;
            height: 450px;
            border: 1px solid gray;
            position: absolute;
            top: 100px;
            left: 100px;
       }
        .zoom{            width: 300px;
            height: 300px;
            background: yellow;
            opacity: 0.5;
            position: absolute;
            top: 0;
            left: 0;
            display: none;
       }
        .bigpic{
            width: 550px;
            height: 550px;
            background: url("./images/jd/da.jpg");
            border: 1px solid gray;
            position: absolute;
            top: 100px;
            left: 552px;
            display: none;
       }
    </style>
</head>
<body>
    <div class="smallpic" id="small">
        <img src="./images/jd/xiao.jpg" alt="">
        <div class="zoom" id="zoom"></div>
    </div>
    <div class="bigpic" id="big"></div>
</body>
</html>

DOM实操-放大镜-业务逻辑

var small = document.getElementById("small");
var zoom = document.getElementById("zoom");
var big = document.getElementById("big");
small.onmouseover = function(){
    zoom.style.display = "block";
    big.style.display = "block";
}
small.onmouseout = function(){
    zoom.style.display = "none";
    big.style.display = "none";
}
var rate = 800 / 450;
small.onmousemove = function(e){
    var zoomX = e.clientX - small.offsetLeft - 150;
    var zoomY = e.clientY - small.offsetTop - 150;
    if(zoomX < 0){
        zoomX = 0;
   }
    if(zoomX >= 150){
        zoomX = 150;
   }
    if(zoomY <0){
        zoomY = 0;
   }
    if(zoomY >= 150){
        zoomY = 150;
   }
    zoom.style.left = zoomX + "px";
    zoom.style.top = zoomY + 'px';
    big.style.backgroundPositionX = -zoomX * rate + "px";
    big.style.backgroundPositionY = -zoomY * rate + "px";
}

 DOM实操-回到顶部

回到顶部 

回到顶部是页面常见效果,一般当页面太长的时候都会给你一个按钮,点击可以回到顶部

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initialscale=1.0">
    <title>Document</title>
    <style>
        div{
            height: 500px;
       }
        #btn{
            width: 35px;
            height: 45px;
            position: fixed;
            right: 50px;
            bottom: 50px;
            background: #333;
            text-decoration: none;
            color: #fff;
            text-align: center;
            padding: 10px;
            display: none;
       }
    </style>
</head>
<body>
    <div>内容1</div>
    <div>内容2</div>
    <div>内容3</div>
    <div>内容4</div>
    <div>内容5</div>
    <div>内容6</div>
    <a href="javaScript:void(0)" id="btn">回到顶部</a>
    <script>
        var btn = document.getElementById("btn");
        var clientHeight = document.documentElement.clientHeight;
        window.onscroll = function(){
            var scrollHeight = document.documentElement.scrollTop;
            if(scrollHeight > clientHeight){
                btn.style.display = "block"
           }else{
                btn.style.display = "none"
           }
       }
        btn.onclick = function(){
          document.documentElement.scrollTop = 0; //回到顶部
       }
    </script>
</body>
</html>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/868552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode-每日一题【剑指 Offer 25. 合并两个排序的链表】

题目 输入两个递增排序的链表&#xff0c;合并这两个链表并使新链表中的节点仍然是递增排序的。 示例1&#xff1a; 输入&#xff1a;1->2->4, 1->3->4输出&#xff1a;1->1->2->3->4->4 限制&#xff1a; 0 < 链表长度 < 1000 解题思路 1…

Java对象内存结构、对象在内存是什么样的

我们知道Java对象分配在堆内存中&#xff0c;一个对象在堆内存中的存储布局可以分为三部分&#xff1a; 对象头Header实例数据对齐填充 1. 对象头Header 对象头部分又包含两部分&#xff1a; 第一部分是用于存储对象自身运行时数据&#xff0c;例如哈希码、GC分代年龄等第二…

时序预测 | MATLAB基于扩散因子搜索的GRNN广义回归神经网络时间序列预测(多指标,多图)

时序预测 | MATLAB基于扩散因子搜索的GRNN广义回归神经网络时间序列预测(多指标,多图) 目录 时序预测 | MATLAB基于扩散因子搜索的GRNN广义回归神经网络时间序列预测(多指标,多图)效果一览基本介绍程序设计学习小结参考资料效果一览

Spring5 AOP 默认使用 JDK

这是博主在使用dubbo实现远程过程调用的时候遇到的问题&#xff1a; 我们如果在服务提供者类上加入Transactional事务控制注解后&#xff0c;服务就发布不成功了。原因是事务控制的底层原理是为服务提供者类创建代理对象&#xff0c;而默认情况下Spring是基于JDK动态代理方式创…

LeetCode面向运气之Javascript—第121题-买卖股票的最佳时机-97.77%

LeetCode第121题-买卖股票的最佳时机 题目要求 给定一个数组prices &#xff0c;它的第i个元素prices[i]表示一支给定股票第i天的价格。 你只能选择某一天买入这只股票&#xff0c;并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回…

Martin_DHCP_V3.0 (DHCP自动化泛洪攻击GUI)

Github>https://github.com/MartinxMax/Martin_DHCP_V3.0 首页 Martin_DHCP_V3.0 自动化DHCP洪泛攻击 Martin_DHCP_V3.0 使用方法 安装三方库 #python3 1.RunMe_Install_Packet.py 攻击路由器 #python3 Martin_DHCP_Attack.py 填写网卡 填写攻击次数 开始运行

语音芯片的型号有哪些?为什么强烈推荐使用flash型可擦写的

一、语音芯片的简介 语音芯片的型号有哪些&#xff1f;为什么强烈推荐使用flash型可擦写的芯片。这里我们简单描述一下如下常见类容&#xff1a; 1、他们都有什么特点&#xff1f;以及发展的历程简介 2、常见的语音芯片有哪些&#xff1f; 3、为什么推荐使用flash型可以重复…

Scractch3.0_Arduino_ESP32_学习随记_显示网络天气(二)

这里写目录标题 目的器材程序联系我们 目的 通过C02获取网络天气。并在屏上显示 器材 硬件: 齐护机器人C02 购买地址 软件: scratch3.0 下载地址:官网下载 程序 使用的是公开免费的API&#xff0c;对请求间隔和次数有限制&#xff0c;如果连续获取可能会被封IP&#xff…

机器学习讲解!(多种算法示例 全网最详细!)

机器学习 机器学习是人工智能的一个分支&#xff0c;它研究计算机如何通过自身的学习和经验来提高其性能&#xff0c;而不需要明确的被编程。机器学习算法可以从大量的数据中学习&#xff0c;并能根据这些数据做出预测或分类。机器学习目前已经被广泛应用于许多领域&#xff0…

轻量级 Spring Task 任务调度可视化管理

Spring Task/Spring Scheduler 傻傻分不清 首先做一下“名词解释”&#xff0c;分清楚这两者的区别&#xff1a; Spring Task Spring Task 是 Spring 框架自带的一个任务调度模块&#xff0c;提供了基本的任务调度功能。它是通过 Java 的 Timer 和 TimerTask 类来实现的&…

Qt扫盲-QWidget理论使用总结

QWidget理论使用总结 一、概述二、顶层 控件 和子 控件三、复合控件四、自定义控件和绘制五、大小提示和大小策略六、事件七、一组函数和属性八、QWidget样式表九、透明度和双缓冲十、创建半透明窗口 一、概述 widget 是用户界面的最小单位&#xff1a;它从window系统接收鼠标…

STM32F429IGT6使用CubeMX配置串口通信

1、硬件电路 2、设置RCC&#xff0c;选择高速外部时钟HSE,时钟设置为180MHz 3、配置USART1引脚 4、生成工程配置 5、部分代码 //重定向printf函数 int fputc(int ch, FILE *f) {HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);return ch; } /* USER CODE BE…

初学vue3时应该注意的几个问题

初学vue3时应该注意的几个问题 声明响应式 响应式数据的声明在vue2的时候很简单&#xff0c;在data中声明就行了。但现在可以使用多个方式。 reactive用于声明Object, Array, Map, Set; ref用于声明String, Number, Boolean 使用reactive来声明基础数据类型&#xff08;Str…

华为OD机试真题 Java 实现【寻找相同子串】【2023 B卷 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

Leetcode-每日一题【剑指 Offer 26. 树的子结构】

题目 输入两棵二叉树A和B&#xff0c;判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构&#xff0c; 即 A中有出现和B相同的结构和节点值。 例如: 给定的树 A: 3 / \ 4 5 / \ 1 2 给定的树 B&#xff1a; 4 / 1 返回 true&#xff0…

超全的数据可视化大屏设计组件库 sketch格式

随着大屏可视化设计需求的发展&#xff0c;可视化sketch矢量素材变得越来越受欢迎&#xff0c;它可以为设计师提供丰富的设计元素&#xff0c;帮助他们更高效更快速的完成设计任务。 大屏可视化sketch数量素材是B端可视化设计师们最佳设计资源&#xff0c;它可以帮助设计师轻松…

iOS开发-实现二维码扫一扫Scan及识别图片中二维码功能

iOS开发-实现二维码扫一扫Scan及识别图片中二维码功能 在iOS开发中&#xff0c;会遇到扫一扫功能&#xff0c;扫一扫是使用摄像头扫码二维码或者条形码&#xff0c;获取对应二维码或条形码内容字符串。通过获得的字符串进行跳转或者打开某个页面开启下一步的业务逻辑。 https…

C++ 管理系统实战

C 管理系统实战 1. 目录结构 2. workClass.h /********************************************************************************* file : employee.h* author : zhong* brief : None* attention : None* date : 2023/8/10*****…

使用阿里云服务器搭建ThinkPHP框架全流程_新手入门

阿里云百科分享使用lay服务器搭建ThinkPHP全流程&#xff0c;ThinkPHP是一款免费、开源、快速、简单、面向对象的轻量级PHP开发框架&#xff0c;遵循Apache2开源协议发布&#xff0c;是为了敏捷Web应用开发和简化企业应用开发而诞生的。本篇教程介绍如何使用云市场镜像快速搭建…

学术论文GPT源码解读:从chatpaper、chatwithpaper到gpt_academic

前言 之前7月中旬&#xff0c;我曾在微博上说准备做“20个LLM大型项目的源码解读” 针对这个事&#xff0c;目前的最新情况是 已经做了的&#xff1a;LLaMA、Alpaca、ChatGLM-6B、deepspeedchat、transformer、langchain、langchain-chatglm知识库准备做的&#xff1a;chatpa…