让AI帮忙写个需求,AI写出来了,只是有bug而已

news2025/2/24 15:41:31

需求

使用原生JS和iframe,嵌入网页进行轮播,需要可以点击暂停、上一页、下一页。

AI的答案

<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <title>轮播图</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    .slider-wrapper {
      position: relative;
      width: 100%;
      height: 100vh;
      margin: 0 auto;
      overflow: hidden;
    }

    .slider-wrapper .iframe_box {
      position: absolute;
      width: 100%;
      height: 100%;
      border: none;
      opacity: 0;
      transition: opacity .5s ease-in-out;
    }

    .slider-wrapper iframe.active {
      opacity: 1;
    }

    .slider-prev,
    .slider-next {
      position: absolute;
      top: 50%;
      transform: translateY(-50%);
      width: 30px;
      height: 30px;
      border: solid #000;
      border-width: 0 3px 3px 0;
      cursor: pointer;
    }

    .slider-prev {
      left: 20px;
      transform: rotate(135deg) translateY(-50%);
    }

    .slider-next {
      right: 20px;
      transform: rotate(-45deg) translateY(-50%);
    }

    .slider-control {
      position: absolute;
      bottom: 20px;
      left: 50%;
      transform: translateX(-50%);
      z-index: 1;
      display: flex;
      justify-content: center;
      align-items: center;
    }

    .slider-control-item {
      width: 10px;
      height: 10px;
      border-radius: 50%;
      background-color: #ccc;
      margin: 0 10px;
      cursor: pointer;
    }

    .slider-control-item.active {
      background-color: #000;
    }

    .slider-toggle {
      position: absolute;
      top: 20px;
      right: 20px;
      z-index: 1;
      cursor: pointer;
    }

    .slider-toggle.active:before {
      content: "暂停";
    }

    .slider-toggle:before {
      content: "开始";
      background: green;
      font-size: 30px;
      padding: 10px;
      margin-right: 20px;
      border-radius: 10px;
    }
  </style>
</head>

<body>
  <div class="slider-wrapper">
    <iframe class="iframe_box" src="https://www.163.com" allow-same-origin></iframe>
    <iframe class="iframe_box" src="https://cn.vuejs.org/guide/introduction.html" allow-same-origin></iframe>
    <iframe class="iframe_box" src="https://www.suning.com" allow-same-origin></iframe>
    <div class="slider-prev"></div>
    <div class="slider-next"></div>
    <div class="slider-control"></div>
    <div class="slider-toggle"></div>
  </div>
  <script>
    window.onload = function () {
      var wrapper = document.querySelector(".slider-wrapper");
      var iframes = wrapper.querySelectorAll("iframe");
      var prev = wrapper.querySelector(".slider-prev");
      var next = wrapper.querySelector(".slider-next");
      var control = wrapper.querySelector(".slider-control");
      var toggle = wrapper.querySelector(".slider-toggle");
      var current = 0;
      var timer = null;
      var isPlaying = true;

      // 初始化
      iframes[current].classList.add("active");
      renderControl();

      // 上一页
      prev.onclick = function () {
        current--;
        if (current < 0) {
          current = iframes.length - 1;
        }
        render();
      }

      // 下一页
      next.onclick = function () {
        current++;
        if (current >= iframes.length) {
          current = 0;
        }
        render();
      }

      // 控制点
      control.onclick = function (e) {
        var index = getIndex(e.target);
        if (index !== -1 && index !== current) {
          current = index;
          render();
        }
      }

      // 开始/暂停
      toggle.onclick = function () {
        isPlaying = !isPlaying;
        toggle.classList.toggle("active");
        if (isPlaying) {
          start();
        } else {
          stop();
        }
      }

      // 渲染轮播图
      function render() {
        for (var i = 0; i < iframes.length; i++) {
          iframes[i].classList.remove("active");
        }
        iframes[current].classList.add("active");
        renderControl();
      }

      // 渲染控制点
      function renderControl() {
        control.innerHTML = "";
        for (var i = 0; i < iframes.length; i++) {
          var item = document.createElement("div");
          item.className = "slider-control-item" + (i === current ? " active" : "");
          control.appendChild(item);
        }
      }

      // 获取控制点的索引
      function getIndex(target) {
        if (target.classList.contains("slider-control-item")) {
          var items = control.querySelectorAll(".slider-control-item");
          for (var i = 0; i < items.length; i++) {
            if (items[i] === target) {
              return i;
            }
          }
        }
        return -1;
      }

      // 自动轮播
      function start() {
        stop();
        timer = setInterval(function () {
          current++;
          if (current >= iframes.length) {
            current = 0;
          }
          render();
        }, 2000);
      }

      function stop() {
        clearInterval(timer);
        timer = null;
      }

      start();
    }
  </script>
</body>

</html>

但是可以发现:嵌入的网页,只有最后一个页面可以点击

我还以为在嵌入 iframe 的网页中,可能存在跨域访问的问题,导致无法点击。这是由于浏览器的同源策略所导致的。

后来使用 z-index 解决了。

<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <title>轮播图</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    .slider-wrapper {
      position: relative;
      width: 100%;
      height: 100vh;
      margin: 0 auto;
      overflow: hidden;
    }

    .slider-wrapper .iframe_box {
      position: absolute;
      width: 100%;
      height: 100%;
      border: none;
      opacity: 0;
      transition: opacity .5s ease-in-out;
	    z-index:0;
    }

    .slider-wrapper iframe.active {
      opacity: 1;
	    z-index: 10;
    }

    .slider-prev,
    .slider-next {
      position: absolute;
      top: 50%;
      transform: translateY(-50%);
      width: 30px;
      height: 30px;
      border: solid #000;
      border-width: 0 3px 3px 0;
      cursor: pointer;
      z-index:100;
    }

    .slider-prev {
      left: 20px;
      transform: rotate(135deg) translateY(-50%);
    }

    .slider-next {
      right: 20px;
      transform: rotate(-45deg) translateY(-50%);
    }

    .slider-control {
      position: absolute;
      bottom: 20px;
      left: 50%;
      transform: translateX(-50%);
      z-index: 100;
      display: flex;
      justify-content: center;
      align-items: center;
    }

    .slider-control-item {
      width: 10px;
      height: 10px;
      border-radius: 50%;
      background-color: #ccc;
      margin: 0 10px;
      cursor: pointer;
	    z-index:100;
    }

    .slider-control-item.active {
      background-color: #000;
	    z-index:100;
    }

    .slider-toggle {
      position: absolute;
      top: 20px;
      right: 20px;
      z-index: 1;
      cursor: pointer;
	    z-index:100;
    }

    .slider-toggle.active:before {
      content: "暂停";
	    z-index:100;
    }

    .slider-toggle:before {
	    z-index:100;
      content: "开始";
      background: green;
      font-size: 30px;
      padding: 10px;
      margin-right: 20px;
      border-radius: 10px;
    }
  </style>
</head>

<body>
  <div class="slider-wrapper">
    <iframe class="iframe_box" src="https://cn.vuejs.org/guide/introduction.html" allow-same-origin></iframe>
    <iframe class="iframe_box" src="https://www.suning.com" allow-same-origin></iframe>
    <iframe class="iframe_box" src="https://www.163.com" allow-same-origin></iframe>
    <div class="slider-prev"></div>
    <div class="slider-next"></div>
    <div class="slider-control"></div>
    <div class="slider-toggle"></div>
  </div>
  <script>
    window.onload = function () {
      var wrapper = document.querySelector(".slider-wrapper");
      var iframes = wrapper.querySelectorAll("iframe");
      var prev = wrapper.querySelector(".slider-prev");
      var next = wrapper.querySelector(".slider-next");
      var control = wrapper.querySelector(".slider-control");
      var toggle = wrapper.querySelector(".slider-toggle");
      var current = 0;
      var timer = null;
      var isPlaying = true;

      // 初始化
      iframes[current].classList.add("active");
      renderControl();

      // 上一页
      prev.onclick = function () {
        current--;
        if (current < 0) {
          current = iframes.length - 1;
        }
        render();
      }

      // 下一页
      next.onclick = function () {
        current++;
        if (current >= iframes.length) {
          current = 0;
        }
        render();
      }

      // 控制点
      control.onclick = function (e) {
        var index = getIndex(e.target);
        if (index !== -1 && index !== current) {
          current = index;
          render();
        }
      }

      // 开始/暂停
      toggle.onclick = function () {
        isPlaying = !isPlaying;
        toggle.classList.toggle("active");
        if (isPlaying) {
          start();
        } else {
          stop();
        }
      }

      // 渲染轮播图
      function render() {
        for (var i = 0; i < iframes.length; i++) {
          iframes[i].classList.remove("active");
        }
        iframes[current].classList.add("active");
        renderControl();
      }

      // 渲染控制点
      function renderControl() {
        control.innerHTML = "";
        for (var i = 0; i < iframes.length; i++) {
          var item = document.createElement("div");
          item.className = "slider-control-item" + (i === current ? " active" : "");
          control.appendChild(item);
        }
      }

      // 获取控制点的索引
      function getIndex(target) {
        if (target.classList.contains("slider-control-item")) {
          var items = control.querySelectorAll(".slider-control-item");
          for (var i = 0; i < items.length; i++) {
            if (items[i] === target) {
              return i;
            }
          }
        }
        return -1;
      }

      // 自动轮播
      function start() {
        stop();
        timer = setInterval(function () {
          current++;
          if (current >= iframes.length) {
            current = 0;
          }
          render();
        }, 2000);
      }

      function stop() {
        clearInterval(timer);
        timer = null;
      }

      start();
    }
  </script>
</body>

</html>

在这里插入图片描述

小结

代码是正常的,就是样式体验不好
首次打开的时候有点卡
都在一个页面上,它都会去访问那三个路径
一下子请求三个路径的页面
但是请求完了,轮播就不用请求了
如果只请求一个的话,每次轮播都要请求一次
都是有利有弊的
两种方案都一样
这个方案其实相对好一点,只请求一次
另一个方案就是轮播到谁就请求谁

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

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

相关文章

看板项目管理:如何可视化工作以提高生产力?

如果你一直关心优化工作流程&#xff0c;提高你或团队的生产力&#xff0c;你肯定听说过看板这个词。 看板是一种工作管理方法&#xff0c;可以将整个工作流程以及构成工作流程的每个单独活动可视化&#xff0c;从而可以识别瓶颈和优化整体流程。 在这方面&#xff0c;看板的…

Python基础(二)

目录 一、类型转换 1、为什么需要数据类型转换 2、数据类型转化的函数 3、str()函数类型转换使用 4、int()函数类型转换使用 4.1int()不能将str类型数据转换成int 4.2int()将bool类型转换成int 4.3int()将float转换成int 5、Float()函数类型转换使用 5.1Float()函数不…

ros imu可视化(ubantu)

可以用下面的链接安装ros 安装ros 在home下建立workspace&#xff0c;添加环境变量 export $ROS_PACKAGE_PATHROS_PACKAGE_PATH:/home/workspace在workspace下建立src文件夹&#xff0c;将fdilink_ahrs_ROS1解压在src目录下面 在workspace下运行以下命令&#xff1a; catkin_…

【牛客面试必刷TOP101】有效括号序列、滑动窗口的最大值

BM44 有效括号序列 点击进入该题 描述&#xff1a; 给出一个仅包含字符’(‘,’)‘,’{‘,’}‘,’[‘和’],的字符串&#xff0c;判断给出的字符串是否是合法的括号序列。 括号必须以正确的顺序关闭&#xff0c;"()“和”()[]{}“都是合法的括号序列&#xff0c;但”(]“…

(七)如何实现即时通信系统中用户的文字聊天功能?

文章目录 一、引言二、实现用户文字功能2.1 使用QTextEdit控件实现用户输入文字消息2.2 实现文字消息的发送和接收2.3 实现文字消息的展示和管理 三、解码接收到的文字消息3.1 接收数据并解码3.2 在客户端展示文字消息3.3 客户端关键代码展示3.4 服务端关键代码展示 四、效果展…

干货 | 如何做一个简单的访谈研究?

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐~ 心理学中研究中&#xff0c;大家常用的研究方法大多是实验法、问卷调查法等&#xff0c;这些均是定量研究。 其实&#xff0c;作为质性研究中常用的访谈法&#xff0c;可对个体的内心想法进…

【操作系统】从操作系统底层出发,成为更好的程序员

冯老爷子的模型 首先&#xff0c;我们从一个问题开始(&#xffe3;∇&#xffe3;)/ 为什么需要程序员&#xff1f; 早期的计算机程序是硬件化的&#xff0c;即使用各种门电路组装出一个固定的电路板&#xff0c;这个电路板只能用于执行某个特定的程序&#xff0c;如果需要修…

学生电费管理系统

随着现代化的发展和科技的进步&#xff0c;各种智能化的系统应运而生。其中&#xff0c;学生电费管理系统是一个非常实用的系统&#xff0c;它可以帮助学校管理电费&#xff0c;提高学生的电费管理意识&#xff0c;减少学校的电费支出。本文将着重介绍该系统的作用、特点以及优…

【hive】基于Qt5和libuv udp 的lan chat

作者已经不更新了,但是很棒 在线用户列表: 聊天窗口 主程序 单独的网络线程: network_thread data管理关联网络管理的 程序update升级更新 和消息收到 即可

【Java】面试常问知识点(数据库相关知识)

Redis Redis数据结构&#xff0c;跳表如何实现&#xff1f;跳表添加层级的时机&#xff1f; 布隆过滤器的底层原理 Redis数据结构 有5中数据结构&#xff0c;string&#xff08;字符串类型&#xff09;、list&#xff08;列表类型&#xff09;、hash&#xff08;哈希表类型…

Ubuntu 20.04 系统配置 OpenVINO 2022.3 环境

由于 OpenVINO 2021 版本在调用 IECore 时会出现 Segmentation fault 的问题&#xff0c;因此需要将其升级为 2022 版本的。 1. 卸载原来版本的 OpenVINO 进入OpenVINO的卸载目录&#xff0c;通常在 /opt/intel 文件夹下&#xff0c; cd /opt/intel/openvino_2021/openvino_…

SOA协议DDS和Some/IP对比

SOME/IP 和 DDS 均已被纳入AUTOSAR AP的平台标准中。 SOME/IP 和 DDS是在不同的应用场景和不同的需求下诞生的技术&#xff0c;所以它们之间注定有很大的区别。 SOME/IP SOME/IP的全称为&#xff1a;Scalable service-Oriented MiddlewarE over IP&#xff0c;是一种面向服务…

Codeforces Round 871 (Div. 4)【A、B、C、D、E、F、G、H】

文章目录 A. Love Story(模拟)B. Blank Space(模拟)C. Mr. Perfectly Fine&#xff08;模拟&#xff09;D. Gold Rush(小思维)E. The Lakes(DFS)F. Forever Winter(简单的图)G. Hits Different&#xff08;二维前缀和&#xff09;H. Dont Blame Me(状态压缩dp) 传送门 A. Love …

视频文本检索之CLIP4Clip

论文&#xff1a;CLIP4Clip: An Empirical Study of CLIP for End to End Video Clip Retrieval GitHub&#xff1a;https://github.com/ArrowLuo/CLIP4Clip 论文基于图片-文本检索模型CLIP (Contrastive Language-Image Pretraining)提出了视频-文本检索模型CLIP4Clip (CLIP …

【开源硬件篇】STM32F103C8T6主控板

STM32F103C8T6主控板 文章目录 STM32F103C8T6主控板设计目标一、STM32F103C8T6核心板外围引脚电路1.1 原理图设计1.2 PCB设计用例 二、ISP一键下载电路设计2.1 原理图设计2.2 原理分析2.2.1 CH340电路选择2.2.2 ISP一键下载原理 2.3 PCB设计示例 三、串口通信电路3.1 原理图设计…

Jackson2JsonRedisSerializer使用及问题

1、使用 public static RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {lettuceConnectionFactory.setShareNativeConnection(false);RedisTemplate<String, Object> rt new RedisTemplate<>();// 设置…

嵌入式软考备考_6 嵌入式程序设计

嵌入式程序设计 开发流程 要想某个功能要用硬件还是软件实现&#xff08;硬件快&#xff0c;但是耗资源&#xff09;&#xff1f;BSP&#xff1f;裸机还是OS&#xff1f; 硬件的设计与实现-》设备驱动软件的设计与实现-》os的选择&#xff0c;移植&#xff0c;api接口函数的…

openGL 环境搭建

刚入坑&#xff0c;每个包、每个项目都得重新配一遍&#xff0c;实在烦人&#xff0c;由于网上已有很多教程&#xff0c;故在此只简要介绍。 比较通用的安装方法如下&#xff1a; 优先下载&#xff0c;对应vs版本&#xff0c;32位&#xff0c;已经编译好的库。如果下载的是源代…

2023 年Java经典面试题,基础篇02(持续更新)

本篇文章主要讲的是 2023 年Java最新面试题&#xff0c;持续更新中 原文地址&#xff1a;https://github.com/Snailclimb/JavaGuide 面向对象基础 面向对象和面向过程的区别 两者的主要区别在于解决问题的方式不同&#xff1a; 面向过程把解决问题的过程拆成一个个方法&…

Git 配置多个SSH-Key

Git 全局配置 查看全局配置 git config --global --list git config --global user.name 删除全局配置 git config --global --unset user.name 1.生成ssh public key and private key open git base, 执行以下command&#xff0c;其中是keyname自己填&#xff1b;codeup…