如何在CSS Grid容器中实现JavaScript轮播图?排查显示异常
JavaScript轮播图在CSS Grid容器中无法显示的排查方案
我把W3Schools的轮播图示例放到CSS Grid容器里就显示不出来,但在Grid外面能正常运行。我是前端新手,想排查下原因,比如是不是CSS设置错了、嵌套结构有问题,或者轮播图在Grid容器里有特殊要求,还有哪些可能?
可能的问题原因排查
- JS文件加载失败:HTML里引入JS的标签写错了,
<script scr="../template.js">里的scr应该是src,这会导致轮播的核心JS代码完全没加载,直接失效。 - 轮播结构不完整:W3Schools的原示例包含切换按钮(prev/next)和底部指示器dots,但你的HTML里没有这些元素,JS代码却在尝试操作
dots元素,运行到dots[slideIndex - 1].className += " active"时会报错,中断整个轮播逻辑。 - Grid布局空间问题:检查
main区域的Grid分配是否正确,有没有被其他Grid项挤占空间,或者main没有设置overflow: auto或合适的高度,导致轮播容器被隐藏。 - CSS样式冲突:你给所有main下的元素加了
box-sizing: border-box,这本身没问题,但要确认slideshow-container的margin: auto是否在Grid布局里正常生效,或者有没有其他样式覆盖了轮播元素的显示设置。 - 图片路径错误:如果图片文件的路径不对,即使轮播逻辑正常,也只会显示空白区域,要确认图片是否和HTML文件在正确的位置。
你的代码
HTML代码
<!DOCTYPE html> <html> <head> <script scr="../template.js"></script> <link rel="stylesheet" type="text/css" href="../template.css"> </head> <body> <div class="grid"> <nav> <ul> <li> <!-- System Assebmly --> <div class="dropdown"> <button class="dropbtn">Assembly</button> <div class="dropdown-content"> <!--Links here--> </div> </div> </li> <li> <!-- Logging In--> <div class="dropdown"> <button class="dropbtn">Loging In</button> <div class="dropdown-content"> <a href="Logging_In/AtUSDAOffice/AtUSDAOffice.html">At USDA Office</a> <a href="Logging_In/Remote/Remote.html">Remote</a> </div> </div> </li> <li> <!-- Basic Applications --> <div class="dropdown"> <button class="dropbtn">Basic Applications Setup</button> <div class="dropdown-content"> <a href="Basic_Applications/Outlook/Outlook.html">Outlook</a> <!-- Links here--> </div> </div> </li> <li> <!-- Agency Appications --> <div class="dropdown"> <button class="dropbtn">Agency Applications Setup</button> <div class="dropdown-content"> <!--Links Here --> </div> </div> </li> </ul> </nav> <header> <h1>Welcome </h1> </header> <main> <div class="slideshow-container"> <div class="mySlides fade"> <div class="numbertext">1 / 23</div> <img src="1_Instructions.jpeg"> <div class="text">Instructions</div> </div> <div class="mySlides fade"> <div class="numbertext">2 / 23</div> <img src="2_Computer.jpeg"> <div class="text">Inventory NRCS Computer</div> </div> <div class="mySlides fade"> <div class="3_numbertext">3 / 23</div> <img src="DockTopDown.jpeg"> <div class="text">Inventory Dock</div> </div> <div class="mySlides fade"> <div class="numbertext">4 / 23</div> <img src="4_Keyboard.jpeg"> <div class="text">Inventory Keyboard</div> </div> </div> <script> currentSlide(1); </script> </main> <div id="checkboxes">checkboxes</div> <footer> Copyright © <script type="text/javascript"> document.write(new Date().getFullYear());</script> reserved. </footer> </div> </body> </html>
CSS代码
.grid { display: grid; height: 100vh; grid-template-columns: 1fr 1fr 1fr 1fr; grid-template-rows: .25fr 1.75fr 1.75fr .25fr; grid-template-areas: "header header header header" "nav main main checkboxes" "nav main main checkboxes" "footer footer footer footer"; /*grid-gap: 0.2em */ ; } /* Navagation section */ /* nav section removed */ main { /*background: #BF3F7F; */ grid-area: main; } main * { box-sizing: border-box; } main .slideshow-container { max-width: 1000px; position: relative; margin: auto; } main .mySlides { display: none; } main .prev, main .next { cursor: pointer; position: absolute; top: 50%; width: auto; margin-top: -22px; padding: 16px; color: white; font-weight: bold; font-size: 18px; transition: 0.6s ease; border-radius: 0 3px 3px 0; user-select: none; } main .next { right: 0; border-radius: 3px 0 0 3px; } main .prev:hover, main .next:hover { background-color: rgba(0, 0, 0, 0.8); } main .text { color: #f2f2f2; font-size: 15px; padding: 8px 12px; position: absolute; bottom: 8px; width: 100%; text-align: center; } main .numbertext { color: #f2f2f2; font-size: 12px; padding: 8px 12px; position: absolute; top: 0; } main .active { background-color: #717171; } main .fade { animation-name: fade; animation-duration: 1.5s; } @keyframes fade { from { opacity: .4; } to { opacity: 1; } }
JavaScript代码
let slideIndex = 0; showSlides(slideIndex); // Next/previous controls function plusSlides(n) { showSlides(slideIndex += n); } // Thumbnail image controls function currentSlide(n) { showSlides(slideIndex = n); } function showSlides(n) { let i; let slides = document.getElementsByClassName("mySlides"); let dots = document.getElementsByClassName("dot"); if (n > slides.length) { slideIndex = 1 } if (n < 1) { slideIndex = slides.length } for (i = 0; i < slides.length; i++) { slides[i].style.display = "none"; } for (i = 0; i < dots.length; i++) { dots[i].className = dots[i].className.replace(" active", ""); } slides[slideIndex - 1].style.display = "block"; dots[slideIndex - 1].className += " active"; }
内容的提问来源于stack exchange,提问作者drhunn
相关产品推荐
相关产品推荐

