js实现一个轮播效果示例

轮播这种组件是大部分网站都会存在的了,绝大部分都是 js 来实现逻辑控制的,它的原理就不多阐述了,因为我们现在要做的是不用 js 来实现一个轮播组件!

前提是只兼容现代浏览器。

原理

这里我们主要用的原理:

CSS3 element+element 选择器(相邻兄弟选择器),element+element 选择器用于选取第一个指定的元素之后(不是内部)紧跟的元素。

CSS3 element1~element2 选择器,element1~element2 选择 element1 之后出现的所有 element2。两种元素必须拥有相同的父元素,但是 element2 不必直接紧随 element1。

CSS3 :checked 选择器,:checked 选择器匹配每个选中的输入元素(仅适用于单选按钮或复选框)。

HTML5 label 标签的 for 属性。

我们能实现的效果:

轮播图片的前进后退
选择某张图片
图片切换的淡入淡出
我们实现不了的:

自动轮播
滑动的轮播切换
开干

首先对于一个轮播组件,我们需要每个图片的容器(废话):
<div class="carousel">
  <div class="carousel-inner">
    <div class="carousel-item">
      <img src="http://fakeimg.pl/2000x800/0079D8/fff/?text=Without">
    </div>
    <div class="carousel-item">
      <img src="http://fakeimg.pl/2000x800/DA5930/fff/?text=JavaScript">
    </div>
    <div class="carousel-item">
      <img src="http://fakeimg.pl/2000x800/F90/fff/?text=Carousel">
    </div>
  </div>
</div>
然后我们需要只显示一张图片,并且加点样式。
<div class="carousel">
  <div class="carousel-inner">
    <input class="carousel-open" type="radio" id="carousel-1" name="carousel" aria-hidden="true" hidden="" checked="checked">
    <div class="carousel-item">
      <img src="http://fakeimg.pl/2000x800/0079D8/fff/?text=Without">
    </div>
    <input class="carousel-open" type="radio" id="carousel-2" name="carousel" aria-hidden="true" hidden="">
    <div class="carousel-item">
      <img src="http://fakeimg.pl/2000x800/DA5930/fff/?text=JavaScript">
    </div>
    <input class="carousel-open" type="radio" id="carousel-3" name="carousel" aria-hidden="true" hidden="">
    <div class="carousel-item">
      <img src="http://fakeimg.pl/2000x800/F90/fff/?text=Carousel">
    </div>
  </div>
</div>
html, body {
  margin: 0px;
  padding: 0px;
  background: #fff;
}
.carousel {
    position: relative;
    box-shadow: 0px 1px 6px rgba(0, 0, 0, 0.64);
    margin-top: 26px;
}
.carousel-inner {
    position: relative;
    overflow: hidden;
    width: 100%;
}
.carousel-open:checked + .carousel-item {
    position: static;
    opacity: 100;
}
.carousel-item {
    position: absolute;
    opacity: 0;
    -webkit-transition: opacity 0.6s ease-out;
    transition: opacity 0.6s ease-out;
}
.carousel-item img {
    display: block;
    height: auto;
    max-width: 100%;
}
这里我们用到 CSS3 的 + 兄弟选择器和 :checked 选择器,在 radio 的 input 有个 :checked 为了,当它的 checked=true 时会匹配,所以我们给每一个 carousel-item 都配上了一个 radio,并且 name 都是一个,这样就只能一组 radio 中选一个了。

同时我们吧 radio 放在每一个 carousel-item 之前,这样就可以用 + 选择器来匹配了,首先所有的 carousel-item 的 opacity 默认为 0,position 为 absolute;

在它之前的那个 radio 被checked的时候,即 .carousel-open:checked + .carousel-item,把 opacity 变为 100,加上过渡的 transition;position 变为 static。

这样,在每次选择一个 radio 的时候他之后的第一个 carousel-item 就会淡入,而先前的会淡出。

我们还需要把 radio 的 input 的 aria-hidden 设为 true,因为我们总不希望在页面上看到几个 radio 吧。

然而这样的话,我们如何点击操作 radio 呢?

前后控制
<div class="carousel">
  <div class="carousel-inner">
    <input class="carousel-open" type="radio" id="carousel-1" name="carousel" aria-hidden="true" hidden="" checked="checked">
    <div class="carousel-item">
      <img src="http://fakeimg.pl/2000x800/0079D8/fff/?text=Without">
    </div>
    <input class="carousel-open" type="radio" id="carousel-2" name="carousel" aria-hidden="true" hidden="">
    <div class="carousel-item">
      <img src="http://fakeimg.pl/2000x800/DA5930/fff/?text=JavaScript">
    </div>
    <input class="carousel-open" type="radio" id="carousel-3" name="carousel" aria-hidden="true" hidden="">
    <div class="carousel-item">
      <img src="http://fakeimg.pl/2000x800/F90/fff/?text=Carousel">
    </div>
    <label for="carousel-3" class="carousel-control prev control-1">‹</label>
    <label for="carousel-2" class="carousel-control next control-1">›</label>
    <label for="carousel-1" class="carousel-control prev control-2">‹</label>
    <label for="carousel-3" class="carousel-control next control-2">›</label>
    <label for="carousel-2" class="carousel-control prev control-3">‹</label>
    <label for="carousel-1" class="carousel-control next control-3">›</label>
  </div>
</div>
加点样式:

.carousel-control {
    background: rgba(0, 0, 0, 0.28);
    border-radius: 50%;
    color: #fff;
    cursor: pointer;
    display: none;
    font-size: 40px;
    height: 40px;
    line-height: 35px;
    position: absolute;
    top: 50%;
    -webkit-transform: translate(0, -50%);
    cursor: pointer;
    -ms-transform: translate(0, -50%);
    transform: translate(0, -50%);
    text-align: center;
    width: 40px;
    z-index: 10;
}

.carousel-control.prev {
    left: 2%;
}

.carousel-control.next {
    right: 2%;
}

.carousel-control:hover {
    background: rgba(0, 0, 0, 0.8);
    color: #aaaaaa;
}

#carousel-1:checked ~ .control-1,
#carousel-2:checked ~ .control-2,
#carousel-3:checked ~ .control-3 {
    display: block;
}
这里用到了 label 标签和它的 for 属性,这个属性可以指定 label 的指向,for 属性接受的是需要指向的 input radio 的 id,这样只要我们点击 label 就可以触发 input radio 的点击了。

这里我们给每个 radio 指定了一组前后的按钮,同时用 css 来排布,每次显示当前显示图片前后图片的 input radio 对应的 label。

更多的控制
我们还想要很多轮播下面都有的索引点,这样就可以选择某个索引的图片了:

<div class="carousel">
  <div class="carousel-inner">
    <input class="carousel-open" type="radio" id="carousel-1" name="carousel" aria-hidden="true" hidden="" checked="checked">
    <div class="carousel-item">
      <img src="http://fakeimg.pl/2000x800/0079D8/fff/?text=Without">
    </div>
    <input class="carousel-open" type="radio" id="carousel-2" name="carousel" aria-hidden="true" hidden="">
    <div class="carousel-item">
      <img src="http://fakeimg.pl/2000x800/DA5930/fff/?text=JavaScript">
    </div>
    <input class="carousel-open" type="radio" id="carousel-3" name="carousel" aria-hidden="true" hidden="">
    <div class="carousel-item">
      <img src="http://fakeimg.pl/2000x800/F90/fff/?text=Carousel">
    </div>
    <label for="carousel-3" class="carousel-control prev control-1">‹</label>
    <label for="carousel-2" class="carousel-control next control-1">›</label>
    <label for="carousel-1" class="carousel-control prev control-2">‹</label>
    <label for="carousel-3" class="carousel-control next control-2">›</label>
    <label for="carousel-2" class="carousel-control prev control-3">‹</label>
    <label for="carousel-1" class="carousel-control next control-3">›</label>
    <ol class="carousel-indicators">
      <li>
        <label for="carousel-1" class="carousel-bullet">•</label>
      </li>
      <li>
        <label for="carousel-2" class="carousel-bullet">•</label>
      </li>
      <li>
        <label for="carousel-3" class="carousel-bullet">•</label>
      </li>
    </ol>
  </div>
</div>
完整的css:

html, body {
  margin: 0px;
  padding: 0px;
  background: url("yun_qi_img/white_wood_4500x3000_lo_res.jpg");
}

.carousel {
    position: relative;
    box-shadow: 0px 1px 6px rgba(0, 0, 0, 0.64);
    margin-top: 26px;
}

.carousel-inner {
    position: relative;
    overflow: hidden;
    width: 100%;
}

.carousel-open:checked + .carousel-item {
    position: static;
    opacity: 100;
}

.carousel-item {
    position: absolute;
    opacity: 0;
    -webkit-transition: opacity 0.6s ease-out;
    transition: opacity 0.6s ease-out;
}

.carousel-item img {
    display: block;
    height: auto;
    max-width: 100%;
}

.carousel-control {
    background: rgba(0, 0, 0, 0.28);
    border-radius: 50%;
    color: #fff;
    cursor: pointer;
    display: none;
    font-size: 40px;
    height: 40px;
    line-height: 35px;
    position: absolute;
    top: 50%;
    -webkit-transform: translate(0, -50%);
    cursor: pointer;
    -ms-transform: translate(0, -50%);
    transform: translate(0, -50%);
    text-align: center;
    width: 40px;
    z-index: 10;
}

.carousel-control.prev {
    left: 2%;
}

.carousel-control.next {
    right: 2%;
}

.carousel-control:hover {
    background: rgba(0, 0, 0, 0.8);
    color: #aaaaaa;
}

#carousel-1:checked ~ .control-1,
#carousel-2:checked ~ .control-2,
#carousel-3:checked ~ .control-3 {
    display: block;
}

.carousel-indicators {
    list-style: none;
    margin: 0;
    padding: 0;
    position: absolute;
    bottom: 2%;
    left: 0;
    right: 0;
    text-align: center;
    z-index: 10;
}

.carousel-indicators li {
    display: inline-block;
    margin: 0 5px;
}

.carousel-bullet {
    color: #fff;
    cursor: pointer;
    display: block;
    font-size: 35px;
}

.carousel-bullet:hover {
    color: #aaaaaa;
}

#carousel-1:checked ~ .control-1 ~ .carousel-indicators li:nth-child(1) .carousel-bullet,
#carousel-2:checked ~ .control-2 ~ .carousel-indicators li:nth-child(2) .carousel-bullet,
#carousel-3:checked ~ .control-3 ~ .carousel-indicators li:nth-child(3) .carousel-bullet {
    color: #428bca;
}

#title {
    width: 100%;
    position: absolute;
    padding: 0px;
    margin: 0px auto;
    text-align: center;
    font-size: 27px;
    color: rgba(255, 255, 255, 1);
    font-family: 'Open Sans', sans-serif;
    z-index: 9999;
    text-shadow: 0px 1px 2px rgba(0, 0, 0, 0.33), -1px 0px 2px rgba(255, 255, 255, 0);
}
原理还是 label 的 for 属性,然后用 css 做了样式以及布局。

时间: 2024-09-27 04:19:21

js实现一个轮播效果示例的相关文章

用JS实现图片轮播效果代码(一)_javascript技巧

一.实现原理 (1)将所有图片放在一个父容器div里面,通过display属性来设置图片的出现与隐藏: (2)轮播图分为手动轮播和自动轮播: 手动轮播的重点是每次点击图片下方的小圆圈,获得它的索引号,并让与之对应索引号的图片显示,并且此时的小圆圈为高亮显示: 自动轮播:利用定时器setInterval(),来每隔一定的时间来播放一次图片. (3)所有的基础知识:dom操作,定时器,事件运用. 二.轮播图页面布局: <div id="content"> <!-- 总的父

js实现图片轮播效果_javascript技巧

本文实例讲解了js实现图片轮播效果代码,分享给大家供大家参考,具体内容如下 运行代码如下 具体代码如下 插件是基于jQuery写的,主要实现的功能:自动播放.鼠标悬停.左右箭头控制+禁止点击 CSS样式: <style> .cooperation-box { position: relative; height: 91px; border-bottom: 1px solid #E0DED9; overflow: hidden; } .cooperation { position: relati

BootStrap的JS插件之轮播效果案例详解_javascript技巧

Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的. 案例 下面展示的就是此插件和相关组件制作的轮播案例. <div id="carousel-example-generic" class="carousel slide" data-ride="carousel"> <!-- Indicators --> <ol class

基于vue.js实现图片轮播效果_javascript技巧

轮播图效果: 1.html <template> <div class="shuffling"> <div class="fouce fl"> <div class="focus"> <ul class="showimg"> <template v-for='sd in shufflingData'> <li v-if='shufflingId==$

注释-css +js 实现轮播效果?、

问题描述 css +js 实现轮播效果?. 利用计时器 css 等实现 简单的照片轮播效果,求大神 指点指点 再讲讲 如何实现 加点注释 谢谢 我是 菜鸟 解决方案 js实现图片轮播效果CSS+JS实现的静态页面翻页效果图片轮播JS效果 解决方案二: 无非就是设置scrollLeft,scrollTop,opacity等实现移动和透明转换效果之类的jquery焦点图模仿淘宝,拍拍图片效果 解决方案三: 通过定时器更换指定图片的显示或隐藏即可. 解决方案四: 你可以写一个定时器,将图片进行定时的显

js图片轮播效果实现代码_javascript技巧

首先给大家看一看js图片轮播效果,如下图 具体思路: 一.页面加载.获取整个容器.所有放数字索引的li及放图片列表的ul.定义放定时器的变量.存放当前索引的变量index 二.添加定时器,每隔2秒钟index递增一次.调用一次切换图片函数提示: 1. index不能一直无限制的递增下去,需做判断 2.调用切换图片函数时需将递增之后的index作为参数传过去 三.定义图片切换函数提示:   1.遍历所有放数字索引的li,将每个li上的类去掉.   2.根据传递过来的index值找到对应的li给它添

jquery实现简单的banner轮播效果【实例】_jquery

朋友给我看了一个轮播效果,把js下载一看,丫丫的一个这么简单的效果,这么的就能写个几百行的,严重影响浏览器加载速度嘛,以为人家宽带流量不要钱玩的哦..无奈之下给他写了个简单的,把所有代码放上去都没有超过70行,还有圆角的那个CSS,不是每个浏览器都是圆角的,不过不影响美观,嘻嘻. <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>无标题页</title> <scri

JQuery实现图片轮播效果_jquery

[原理简述] 这里大概说一下整个流程: 1,将除了第一张以外的图片全部隐藏, 2,获取第一张图片的alt信息显示在信息栏,并添加点击事件 3,为4个按钮添加点击侦听,点击相应的按钮,用fadeOut,fadeIn方法显示图片 4,设置setInterval,定时执行切换函数 [代码说明] filter(":visible") :获取所有可见的元素 unbind():从匹配的元素中删除绑定的事件 siblings:取得一个包含匹配的元素集合中每一个元素的所有唯一同辈元素的元素集合 例:找

javascript实现图片轮播效果_javascript技巧

本文实例介绍了javascript实现图片轮播效果的详细代码,分享给大家供大家参考,具体内容如下 效果图: 具体代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style type="text/css"> *{ margin: 0