发表于: 2019-07-13 23:09:36

1 896


今天完成了什么:

完成头部轮播图制作;

遇到了什么问题:

暂无;

收获了什么:

总结几种方法吧:


第一種demo:此种方法需要微调图片大小, 拥有左右箭头和底部的轮播小圆点,小圆点会随着图片的变化而变动,点击图片也会切换下一张;

<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<title>CSS3仿JS轮播图</title>
<link rel="stylesheet" href="lbimage.css" />

<Style>
@charset "utf-8";

body {
background-image: url("images/bbbefb51f8198618b654e23e48ed2e738ad4e69a.jpg");
background-size: cover;
}

img {
width: 850px;
height: 500px;
}

.photo {
width: 900px;
height: 550px;
border: 1px solid #555555;
margin: auto auto;
position: relative;
background: #ffffff;
box-shadow: 0 10px 80px rgba(0, 0, 0, .6)
}

.photo input {
display: none;
}

.image {
position: absolute;
top: 0px;
left: 0px;
width: 800px;
height: 450px;
margin: 25px 25px;
transform: scale(0);
opacity: 0;
transition: all 0.7s;
}

.image img {}

.nav label {
width: 150px;
height: 500px;
margin: 25px 25px;
position: absolute;
z-index: 10;
opacity: 0;
display: none;
cursor: pointer;
transition: opacity 0.2s;
color: #ffffff;
font-size: 50px;
line-height: 450px;
text-align: center;
text-shadow: 0 0 15px #555555);
}

.leftjianbian {
background: linear-gradient(right, rgba(250, 242, 239, 0) 1%, rgba(158, 148, 166, 0.5) 100%);
background: -o-linear-gradient(right, rgba(250, 242, 239, 0) 1%, rgba(158, 148, 166, 0.5) 100%);
background: -ms-linear-gradient(right, rgba(250, 242, 239, 0) 1%, rgba(158, 148, 166, 0.5) 100%);
background: -moz-linear-gradient(right, rgba(250, 242, 239, 0) 1%, rgba(158, 148, 166, 0.5) 100%);
background: -webkit-linear-gradient(right, rgba(250, 242, 239, 0) 1%, rgba(158, 148, 166, 0.5) 100%);
}

.rightjianbian {
background: linear-gradient(left, rgba(250, 242, 239, 0) 1%, rgba(158, 148, 166, 0.5) 100%);
background: -o-linear-gradient(left, rgba(250, 242, 239, 0) 1%, rgba(158, 148, 166, 0.5) 100%);
background: -ms-linear-gradient(left, rgba(250, 242, 239, 0) 1%, rgba(158, 148, 166, 0.5) 100%);
background: -moz-linear-gradient(left, rgba(250, 242, 239, 0) 1%, rgba(158, 148, 166, 0.5) 100%);
background: -webkit-linear-gradient(left, rgba(250, 242, 239, 0) 10%, rgba(158, 148, 166, 0.5) 100%);
}

.image:hover+.nav label {
opacity: 0.5;
}

.nav label:hover {
opacity: 1;
}

.nav .down {
right: 0;
}

input:checked+.control .image {
opacity: 1;
transform: scale(1);
transition: all 1s;
}

input:checked+.control .nav label {
display: block;
}

.dots {
width: 100%;
height: 20px;
position: absolute;
bottom: 30px;
text-align: center;
}

.dot {
width: 10px;
height: 10px;
margin: 0px 5px;
border-radius: 50%;
position: relative;
display: inline-block;
background: rgba(0, 0, 0, 0.3);
}

input#img1:checked~.dots label#dot1,
input#img2:checked~.dots label#dot2,
input#img3:checked~.dots label#dot3,
input#img4:checked~.dots label#dot4,
input#img5:checked~.dots label#dot5,
input#img6:checked~.dots label#dot6 {
background: rgba(0, 0, 0, 0.7);
}
</Style>

</head>

<body>
<div class="photo" id="photo">
<!--//1-->
<input type="radio" name="btn" id="img1" checked />
<div class="control">
<div class="image"><img src="images/img1.jpg" /></div>
<div class="nav">
<label for="img6" class="up leftjianbian">
<</label> <label for="img2" class="down rightjianbian">>
</label>
</div>
</div>
<!--//2-->
<input type="radio" name="btn" id="img2" />
<div class="control">
<div class="image"><img src="images/img2.jpg" /></div>
<div class="nav">
<label for="img1" class="up leftjianbian">
<</label> <label for="img3" class="down rightjianbian">>
</label>
</div>
</div>
<!--//3-->
<input type="radio" name="btn" id="img3" />
<div class="control">
<div class="image"><img src="images/img3.jpg" /></div>
<div class="nav">
<label for="img2" class="up leftjianbian">
<</label> <label for="img4" class="down rightjianbian">>
</label>
</div>
</div>
<!--//4-->
<input type="radio" name="btn" id="img4" />
<div class="control">
<div class="image"><img src="images/img4.jpg" /></div>
<div class="nav">
<label for="img3" class="up leftjianbian">
<</label> <label for="img5" class="down rightjianbian">>
</label>
</div>
</div>
<!--//5-->
<input type="radio" name="btn" id="img5" />
<div class="control">
<div class="image"><img src="images/img5.jpg" /></div>
<div class="nav">
<label for="img4" class="up leftjianbian">
<</label> <label for="img6" class="down rightjianbian">>
</label>
</div>
</div>
<!--//6-->
<input type="radio" name="btn" id="img6" />
<div class="control">
<div class="image"><img src="images/img6.jpg" /></div>
<div class="nav">
<label for="img5" class="up leftjianbian">
<</label> <label for="img1" class="down rightjianbian">>
</label>
</div>
</div>
<div class="dots">
<label for="img1" class="dot" id="dot1"></label>
<label for="img2" class="dot" id="dot2"></label>
<label for="img3" class="dot" id="dot3"></label>
<label for="img4" class="dot" id="dot4"></label>
<label for="img5" class="dot" id="dot5"></label>
<label for="img6" class="dot" id="dot6"></label>
</div>
</div>
</body>

</html>

第二种方法:有轮播焦点,但是不能控制播放速度,只能他自己变;

  • 通过css3的动画属性对轮播进行实现,缺点是不灵活,只能是写死的几张图片,另外无法拖动;


代码如下:


<body>
<section class="slider-container">
<!-- 轮播器 -->
<ul class="slider">
<li class="slider-item slider-item1"></li>
<li class="slider-item slider-item2"></li>
<li class="slider-item slider-item3"></li>
<li class="slider-item slider-item4"></li>
<li class="slider-item slider-item5"></li>
</ul>
<!-- 轮播焦点 -->
<div class="focus-container">
<ul class="floatfix">
<li>
<div class="focus-item focus-item1"></div>
</li>
<li>
<div class="focus-item focus-item2"></div>
</li>
<li>
<div class="focus-item focus-item3"></div>
</li>
<li>
<div class="focus-item focus-item4"></div>
</li>
<li>
<div class="focus-item focus-item5"></div>
</li>
</ul>
</div>
</section>

</body>

css:

* {
margin: 0;
padding: 0;
}

ul,
li {
list-style: none;
}

.slider-container {
width: 50%;
position: relative;
margin: 0 auto;
}

.slider,
.slider-item {
padding-bottom: 40%;
}

.slider-item {
position: absolute;
/* 父辈.slider默认继承了.slide-container的宽度 */
width: 100%;
/* 相当于background-size: 100% auto */
background-size: 100%;
animation: fade 20s linear;
animation-iteration-count: infinite;
}

/* 设置背景图片 */
.slider-item1 {
background-image: url(imgs/1.jpg);
}

.slider-item2 {
background-image: url(imgs/2.jpg);
}

.slider-item3 {
background-image: url(imgs/3.jpg);
}

.slider-item4 {
background-image: url(imgs/4.jpg);
}

.slider-item5 {
background-image: url(imgs/5.jpg);
}

/* 设置动画 */
@keyframes fade {
0% {
opacity: 0;
}

5% {
opacity: 1;
}

20% {
opacity: 1;
}

25% {
opacity: 0;
}

100% {
opacity: 0;
}
}

.slider-item {
opacity: 0;
}

.slider-item1 {
animation-delay: -1s;
}

.slider-item2 {
animation-delay: 3s;
}

.slider-item3 {
animation-delay: 7s;
}

.slider-item4 {
animation-delay: 11s;
}

.slider-item5 {
animation-delay: 15s;
}

.focus-container {
position: absolute;
bottom: 2%;
z-index: 7;
left: 50%;
margin-left: -45px;
}

.focus-container li {
width: 10px;
height: 10px;
border-radius: 50%;
float: left;
margin-right: 10px;
background: #fff;
}

.focus-item {
width: 100%;
height: 100%;
position: relative;
opacity: 0;
background: #51B1D9;
border-radius: inherit;
animation-duration: 20s;
animation-timing-function: linear;
animation-name: fade;
animation-iteration-count: infinite;
}

.focus-item1 {
animation-delay: -1s;
}

.focus-item2 {
animation-delay: 3s;
}

.focus-item3 {
animation-delay: 7s;
}

.focus-item4 {
animation-delay: 11s;
}

.focus-item5 {
animation-delay: 15s;
}

    .slider-container充当容器并将其设置为relative以充当一个定位,为了图片能够自适应轮播器的宽度,我们将图片通过background-image来进行设置,同时设置background-size为100%。另外,设置图片的高度显然是不合理的,上面我们通过设置padding-bottom来显示图片相应高度的区域(利用背景在padding中也可以呈现)。


    因为css不能设置每两张的一个间隔时间,对于我们要应用的动画,我们将每一张图片都考虑进去。对于每一张图片,都会经历这样一个过程,我们假设图片1s内从透明过渡为不透明,然后保持显示状态3秒,然后再通过1s从不透明过渡为透明,这样,我们在上面的图片中进行了每张图片的一个动画推演,图片2在图片1开始隐藏时开始动画过程,图片3在图片2开始隐藏时开始动画过程,以此类推,最后发现轮播完全部5张图片时,总共需要花费20秒,也就是说,每张图片在完成一个动画过程后还需要等待15s才会重新执行该动画过程。


第三种方法:此种触摸右下角会自动切换图片;通过css3的动画属性对轮播进行实现,缺点是轮播索引不能实时滚动,索引触发滚动后不能从当前轮播图片轮播,而是从第一张图片开始,同时也存在demo1中的缺点;

html:


<body>
<div id="carousel-box">
<!-- 表示图片顺序的索引 -->
<a id="a1" class="num">1</a>
<a id="a2" class="num">2</a>
<a id="a3" class="num">3</a>
<a id="a4" class="num">4</a>
<a id="a5" class="num">5</a>
<!-- 设定为五张图片 -->
<div id="carousel-item">
<img src="./imgs/1.jpg" alt="">
<img src="./imgs/3.jpg" alt="">
<img src="./imgs/4.jpg" alt="">
<img src="./imgs/5.jpg" alt="">
<img src="./imgs/2.jpg" alt="">

<!-- 五张图片的标题 -->
<ul id="showTag">
<li>图片一</li>
<li>图片二</li>
<li>图片三</li>
<li>图片四</li>
<li>图片五</li>
</ul>
</div>
</div>
</body>

css:

* {
margin: 0;
padding: 0;
}

#carousel-box {
position: relative;
width: 300px;
height: 200px;
border-radius: 5px;
margin: 0 auto;
overflow: hidden;
}

#carousel-item {
position: absolute;
width: calc(300px * 5);
}

/* 将轮播器中的每张图片平铺开来形成一张图片 */
#carousel-item img {
float: left;
width: 300px;
height: 200px;
}

#showTag {
position: absolute;
/* 调整标题项的垂直位置 */
top: 10px;
opacity: 0.5;
}

#showTag li {
/* 根据图片宽度来设定标题宽度,并让标题平铺以放置在对应的轮播图片中 */
width: 200px;
height: 20px;
line-height: 20px;
margin: 0 50px;
float: left;
text-align: center;
color: #fff;
border-radius: 10px;
background: #000;
}

/* 设定图片索引位置 */
.num {
width: 25px;
height: 25px;
color: #666;
text-align: center;
line-height: 25px;
cursor: pointer;
background: #fff;
border-radius: 50%;
position: absolute;
z-index: 10;
bottom: 10px;
right: 10px;
display: block;
opacity: 0.8;
}

/* 调整索引位置 */
.num:nth-child(4) {
margin-right: 30px;
}
.num:nth-child(3) {
margin-right: 60px;
}
.num:nth-child(2) {
margin-right: 90px;
}
.num:nth-child(1) {
margin-right: 120px;
}

/* 初试轮播动画 */
@keyframes initAnimation {
/* 0-4s */
0%, 20% {
margin-left: 0px;
}
/* 4-8s */
25%, 40% {
margin-left: -300px;
}
/* 8-12s */
45%, 60% {
margin-left: -600px;
}
/* 12-16s */
65%, 80% {
margin-left: -900px;
}
/* 16-20s */
85%, 100% {
margin-left: -1200px;
}
}

/* 动画部署 */
#carousel-item {
animation: initAnimation 20s ease-out infinite;
}

/* 索引悬浮高亮效果 */
.num:hover {
color: #fff;
cursor: pointer;
background: #f00;
}

/* 轮播悬浮暂停效果 */
#carousel-item:hover, .num:hover {
animation-play-state: paused;
}

/* 索引悬浮触发动画 */
@keyframes Anim1 {
100% {
margin-left: 0;
}
}

@keyframes Anim2 {
100% {
margin-left: -300px;
}
}
@keyframes Anim3 {
100% {
margin-left: -600px;
}
}
@keyframes Anim4 {
100% {
margin-left: -900px;
}
}
@keyframes Anim5 {
100% {
margin-left: -1200px;
}
}

/* 索引触发轮播效果 */
#a1:hover ~ #carousel-item {
animation: Anim1 .5s ease-out forwards;
}
#a2:hover ~ #carousel-item {
animation: Anim2 .5s ease-out forwards;
}
#a3:hover ~ #carousel-item {
animation: Anim3 .5s ease-out forwards;
}
#a4:hover ~ #carousel-item {
animation: Anim4 .5s ease-out forwards;
}
#a5:hover ~ #carousel-item {
animation: Anim5 .5s ease-out forwards;
}

明天计划:

继续任务;


返回列表 返回列表
评论

    分享到