使用H5+CSS+JS实现简版轮播图

 HTML部分:

大家可以自行选择图片进行测试,更改一下图片地址和css的宽高即可;

<div class="outer">
        <ul class="img-list">
            <li class="current">
                <a href="#">
                    <img src="./images/1.png" />
                </a>
            </li>
            <li>
                <a href="#">
                    <img src="./images/2.png" />
                </a>
            </li>
            <li>
                <a href="#">
                    <img src="./images/3.png" />
                </a>
            </li>
            <li>
                <a href="#">
                    <img src="./images/4.png" />
                </a>
            </li>
            <li>
                <a href="#">
                    <img src="./images/5.png" />
                </a>
            </li>
        </ul>

        <!-- 左右切换按钮 -->
        <div class="prev-next">
            <a id="prev" href="javascript:;">&lt;</a>
            <a id="next" href="javascript:;">&gt;</a>
        </div>

        <!-- 导航点 -->
        <div class="dot">
            <a class="active" href="javascript:;"></a>
            <a href="javascript:;"></a>
            <a href="javascript:;"></a>
            <a href="javascript:;"></a>
            <a href="javascript:;"></a>
        </div>
    </div>

 CSS部分:

<style>
        * {
            margin: 0;
            padding: 0;
        }

        img {
            vertical-align: top;
        }

        ul {
            list-style: none;
        }

        .outer {
            width: 640px;
            height: 390px;
            margin: 100px auto;
            position: relative;
        }

        .img-list {
            height: 390px;
        }

        .img-list li {
            position: absolute;
            opacity: 0;
            transition: opacity 1s;
        }

        li.current {
            z-index: 1;
            opacity: 1;
        }

        /* 设置两个箭头的样式 */
        .prev-next a {
            font-size: 60px;
            color: #fff;
            font-weight: bold;
            text-decoration: none;
            position: absolute;
            height: 70px;
            top: 0;
            bottom: 0;
            margin: auto;
            z-index: 2;
            opacity: 0.7;
        }

        .prev-next a:hover {
            opacity: 1;
        }

        #next {
            right: 0;
        }

        /* 导航点样式 */
        .dot {
            position: absolute;
            display: flex;
            justify-content: center;
            z-index: 3;
            left: 0;
            right: 0;
            bottom: 5px;
            margin: auto;
        }

        .dot a {
            width: 20px;
            height: 20px;
            margin: 5px;
            border-radius: 50%;
            background-color: #fff;
            opacity: 0.5;
        }

        .dot a:hover,
        .dot .active {
            opacity: 1;
        }
    </style>

JS部分:

<script>
        //获取左箭头
        const prev = document.getElementById("prev")
        //获取右箭头
        const next = document.getElementById("next")
        //获取整个outer 为了实现鼠标进入图片事件生效
        const outer = document.getElementsByClassName("outer")[0]
        //全局获取所有图片数组
        const imgArr = Array.from(document.querySelectorAll(".img-list li"))
        //全局获取所有导航点数组
        const dots = Array.from(document.querySelectorAll(".dot a"))

        //利用冒泡给document添加事件,同时判断只有在点击导航点的时候生效
        document.addEventListener("click", (event) => {
            const index = dots.indexOf(event.target)
            if (index !== -1) {
                //切换图片 切换active
                getPrevOrNext(index);
            }
        })

        //定时器自动播放图片,使用闭包保证timer数据安全不被其他变量访问
        const autoChange = (function () {
            let timer = null;
            return () => {
                if (timer === null) {
                    timer = setTimeout(function auto() {
                        getPrevOrNext("next")
                        timer = setTimeout(auto, 2000)
                    }, 2000)
                } else {
                    clearTimeout(timer)
                    timer = null;
                }
            }
        })()

        //判断是向前还是向后翻图片
        function getPrevOrNext(dir) {
            //获取当前展示照片
            const current = document.getElementsByClassName("current")[0]
            //存放下一张或上一张的照片
            let prevOrNext;
            //向上翻
            if (dir === "prev") {
                prevOrNext = current.previousElementSibling || imgArr.at(-1)
                //向下翻
            } else if (dir === "next") {
                prevOrNext = current.nextElementSibling || imgArr[0]
                //切换图片和导航点
            } else {
                prevOrNext = imgArr[dir]
            }
            //给这张照片的current删除,同时给下一个要展示的照片添加current
            const index = imgArr.indexOf(prevOrNext)
            current.classList.remove("current")
            prevOrNext.classList.add("current")
            //这里两次删除添加采用了两种方式,哪一种都可以,效果一样
            //给本导航点的active删除,给下一个要展示的导航点添加active
            const activeUse = document.getElementsByClassName("active")[0];
            activeUse.removeAttribute("class")
            dots[index].className = "active"
        }

        //鼠标进入图片停止自动播放
        outer.onmouseenter = function () {
            autoChange();
        }
        //鼠标离开图片开始自动播放
        outer.onmouseleave = function () {
            autoChange();
        }

        //向前翻图片
        prev.onclick = () => {
            getPrevOrNext("prev")
        }

        //向后翻图片
        next.onclick = () => {
            getPrevOrNext("next")
        }
    </script>

建议大家在测试时,将鼠标进入图片的事件先关闭,因为可能会造成误差! 

其中大部分代码都有注释,逻辑较为简单,值得一看!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个基本的搜索框下拉列表的实现步骤: 1. HTML结构:在HTML中创建一个输入框和一个下拉列表的容器,下拉列表的容器初始设置为隐藏状态。 ```html <div class="search-container"> <input type="text" placeholder="请输入搜索关键字"> <div class="search-list-container"> <ul class="search-list"></ul> </div> </div> ``` 2. CSS样式:设置输入框的样式和下拉列表容器的样式,下拉列表容器的初始状态设置为 `display:none` 。 ```css .search-container { position: relative; } input[type="text"] { width: 300px; height: 30px; padding: 5px; border: 1px solid #ccc; border-radius: 5px; } .search-list-container { position: absolute; top: 35px; left: 0; z-index: 99; width: 300px; max-height: 200px; overflow-y: auto; background: #fff; border: 1px solid #ccc; border-radius: 5px; display: none; } ``` 3. JS交互:监听输入框的键盘输入事件,在输入框中输入内容时,向后台发送请求获取匹配的搜索结果,将结果渲染到下拉列表中,并将下拉列表容器设置为显示状态。 ```javascript const input = document.querySelector('input[type="text"]'); const searchListContainer = document.querySelector('.search-list-container'); const searchList = document.querySelector('.search-list'); input.addEventListener('input', function(e) { const keyword = e.target.value; if (keyword.trim()) { // 发送请求获取匹配的搜索结果 const searchResults = getSearchResults(keyword); renderSearchList(searchResults); searchListContainer.style.display = 'block'; } else { searchList.innerHTML = ''; searchListContainer.style.display = 'none'; } }); function getSearchResults(keyword) { // 向后台发送请求获取搜索结果 const results = ['搜索结果1', '搜索结果2', '搜索结果3']; return results; } function renderSearchList(results) { let html = ''; results.forEach(result => { html += `<li>${result}</li>`; }); searchList.innerHTML = html; } ``` 以上就是一个简单的搜索框下拉列表的实现方法,您可以根据自己的需求进行样式和交互的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值