CSS

1、前言

轮播图经常会在项目里用到,但是实际上用到的轮播图都是比较简单的,没有复杂的特效,这个时候如果去引入swiper那些库的话,未免就有点杀鸡焉用牛刀了。
所以不如自己手写一个,这里要分享的一种写法也是最近才发现的,发现写起来真的是很丝滑,只纯css就实现了呢!
可以先看看预览效果
预览地址:https://sunny-lucking.github.io/howToBuiMySwiper/myswiper.html
源码地址:https://github.com/Sunny-lucking/howToBuiMySwiper/blob/main/myswiper.html

2、HTML <label> 标签的 for 属性的用法及作用

for 属性规定 label 与哪个表单元素绑定,label的for属性要与绑定表单元素(input)的ID对应。绑定完成后可以通过点击label触发表单元素的默认属性。通俗的讲就是绑定完了点lebel就相当于点击表单元素(input)。

  1. <form>
  2. <label for="male">Male</label>
  3. <input type="radio" name="sex" id="male" />
  4. <br />
  5. <label for="female">Female</label>
  6. <input type="radio" name="sex" id="female" />
  7. </form>

3、开始实现吧

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>我的轮播图</title>
  6. <style>
  7. body {
  8. display: flex;
  9. justify-content: center;
  10. align-items: center;
  11. min-height: 100vh;
  12. }
  13. ul.slides {
  14. position: relative;
  15. width: 600px;
  16. height: 280px;
  17. list-style: none;
  18. margin: 0;
  19. padding: 0;
  20. background-color: #eee;
  21. }
  22. li.slide {
  23. margin: 0;
  24. padding: 0;
  25. width: inherit;
  26. height: inherit;
  27. position: absolute;
  28. top: 0;
  29. left: 0;
  30. display: flex;
  31. justify-content: center;
  32. align-items: center;
  33. font-family: Helvetica;
  34. font-size: 120px;
  35. color: #fff;
  36. transition: .5s transform ease-in-out;
  37. }
  38. .slide:nth-of-type(1) {
  39. background-color: #F2E205;
  40. }
  41. .slide:nth-of-type(2) {
  42. background-color: #F25C05;
  43. left: 100%;
  44. }
  45. .slide:nth-of-type(3) {
  46. background-color: #495F8C;
  47. left: 200%;
  48. }
  49. </style>
  50. </head>
  51. <body>
  52. <ul class="slides">
  53. <li class="slide">1</li>
  54. <li class="slide">2</li>
  55. <li class="slide">3</li>
  56. </ul>
  57. </body>
  58. </html>

纯CSS实现可点击切换的轮播图 - 图1
首先先写了所需要的三个子元素。分别给了三种颜色。
接下来。最外层加上overflow: hidden,让只显示一个slide子元素

  1. ul.slides {
  2. position: relative;
  3. width: 600px;
  4. height: 280px;
  5. list-style: none;
  6. margin: 0;
  7. padding: 0;
  8. background-color: #eee;
  9. overflow: hidden;
  10. }

纯CSS实现可点击切换的轮播图 - 图2
接下来,加上label和input起到控制切换的效果

html

  1. <body>
  2. <ul class="slides">
  3. <input type="radio" id="control-1" name="control" checked>
  4. <input type="radio" id="control-2" name="control">
  5. <input type="radio" id="control-3" name="control">
  6. <li class="slide">1</li>
  7. <li class="slide">2</li>
  8. <li class="slide">3</li>
  9. <div class="controls-visible">
  10. <label for="control-1"></label>
  11. <label for="control-2"></label>
  12. <label for="control-3"></label>
  13. </div>
  14. </ul>
  15. </body>

css

  1. input[type="radio"] {
  2. position: relative;
  3. z-index: 100;
  4. display: none;
  5. }
  6. .controls-visible {
  7. position: absolute;
  8. width: 100%;
  9. bottom: 12px;
  10. text-align: center;
  11. }
  12. .controls-visible label {
  13. display: inline-block;
  14. width: 10px;
  15. height: 10px;
  16. background-color: #fff;
  17. border-radius: 50%;
  18. margin: 0 3px;
  19. border: 2px solid #fff;
  20. }
  21. .slides input[type="radio"]:nth-of-type(1):checked ~ .controls-visible label:nth-of-type(1) {
  22. background-color: #333;
  23. }
  24. .slides input[type="radio"]:nth-of-type(2):checked ~ .controls-visible label:nth-of-type(2) {
  25. background-color: #333;
  26. }
  27. .slides input[type="radio"]:nth-of-type(3):checked ~ .controls-visible label:nth-of-type(3) {
  28. background-color: #333;
  29. }

这里利用input和label来模拟轮播图的pagination分页功能。label模拟的是圆点,然后把radio输入框隐藏了。radio放在最前面的目的是为了用了控制后面的slides 和controls的 样式
纯CSS实现可点击切换的轮播图 - 图3
现在实现点击label切换轮播图的效果

  1. .slides input[type="radio"]:nth-of-type(1):checked ~ .slide {
  2. transform: translatex(0%);
  3. }
  4. .slides input[type="radio"]:nth-of-type(2):checked ~ .slide {
  5. transform: translatex(-100%);
  6. }
  7. .slides input[type="radio"]:nth-of-type(3):checked ~ .slide {
  8. transform: translatex(-200%);
  9. }

可以看到已经非常地简单就实现了点击lebel切换轮播图的效果。
纯CSS实现可点击切换的轮播图 - 图4
当然,要实现一个上下页切换的功能也非常简单
纯CSS实现可点击切换的轮播图 - 图5
添加三组navigator,一页页面对应一组

  1. <body>
  2. <ul class="slides">
  3. <input type="radio" id="control-1" name="control" checked>
  4. <input type="radio" id="control-2" name="control">
  5. <input type="radio" id="control-3" name="control">
  6. <div class="navigator slide-1">
  7. <label for="control-3">
  8. </label>
  9. <label for="control-2">
  10. </label>
  11. </div>
  12. <div class="navigator slide-2">
  13. <label for="control-1">
  14. </label>
  15. <label for="control-3">
  16. </label>
  17. </div>
  18. <div class="navigator slide-3">
  19. <label for="control-2">
  20. </label>
  21. <label for="control-1">
  22. </label>
  23. </div>
  24. <li class="slide">1</li>
  25. <li class="slide">2</li>
  26. <li class="slide">3</li>
  27. <div class="controls-visible">
  28. <label for="control-1"></label>
  29. <label for="control-2"></label>
  30. <label for="control-3"></label>
  31. </div>
  32. </ul>
  33. </body>

要把不属于当前的那一页的navigator隐藏掉,所以用display:none,当选中对应的页面的时候,再让它显示出来,所以可以这样实现

  1. .navigator {
  2. position: absolute;
  3. top: 50%;
  4. transform: translatey(-50%);
  5. width: 100%;
  6. z-index: 100;
  7. padding: 0 20px;
  8. display: flex;
  9. justify-content: space-between;
  10. box-sizing: border-box;
  11. display: none;
  12. }
  13. .navigator {
  14. font-size: 32px;
  15. color #333333;
  16. }
  17. .slides input[type="radio"]:nth-of-type(1):checked~.navigator:nth-of-type(1) {
  18. display: flex;
  19. }
  20. .slides input[type="radio"]:nth-of-type(2):checked~.navigator:nth-of-type(2) {
  21. display: flex;
  22. }
  23. .slides input[type="radio"]:nth-of-type(3):checked~.navigator:nth-of-type(3) {
  24. display: flex;
  25. }

纯CSS实现可点击切换的轮播图 - 图6
可以看到,又轻而易举就实现了点击切换上下页的功能。