大家好,我是 Steven。
今集我们会尝试只用 HTML 和 CSS,实现基础的轮播图效果,当然会有一些功能的缺失,例如不能自动跳转,但我们来看看用 CSS 可以实现到多少。
这个教程的视频版本在 www.bilibili.com/video/BV1Bt… ,欢迎三连关注!
HTML 的部分
打开 CodePen 编辑器,先建立 HTML 的结构,轮播图我会用 <ul> 去制作,加入 <ul> 标签,class 是 slides。里面新增三个 <li> 标签,class 是 slide,三张 slide 分别填上 1, 2 和 3。
CSS 的部分
然后到 CSS 的部份,加入 body 选择器,将页面的内容置中,可以通过加入 display: flex,justify-content 与 align-items 设定为 center,min-height 设定为 100vh 达到。
然后加入 ul.slides 选择器,设定轮播图容器的样式,position 设定为 relative,宽度设定为 600px,高度设定为 280px。然后取消原本列表的属性,list-style 设定为 none。margin 和 padding 设定为 0,然后加入一个浅灰色的背景,方便看到它的大小。
再加入 li.slide,设定单张轮播图的样式,margin 与 padding 设定为 0,宽度与高度继承父容器的大小,设定为 inherit,然后 position 设定为 absolute。
top 和 left 设定为 0,现在可以见到三个数字重叠了。
加入三个选择器,分别设定三张轮播图的背景颜色,它们是 .slide:nth-of-type(1)、2 和 3,设定第一张 slide 的背景颜色是黄色 #F2E205,第二张是橙红色 #F25C05,第三张是蓝色 #495F8C。
再调整一下它们的位置,第二张图在第一张图的右边,在第二张图的设定里,加入 left: 100%,在第三张图的设定里加入 left: 200%,现在可以看到三张图已经横向并列在一起了。
回到 .slide 选择器的样式设定,加入 display: flex,justify-content 与 align-items 设定为 center,然后放大字体及设定颜色,font-family 设定为 Helvetica,文字大小设定为 120px,颜色设定为白色。
再到 slides 选择器加入 overflow: hidden 就可以将突出的第二和第三张轮播图隐藏。
实现轮播图切换
现在样式已经设定好了,下一步就加入按钮实现轮播图切换。可以同过表单元素 radio 按钮配合 CSS 选择器达到。
回到 HTML 的部份,在 <li> 标签之前加入三个 radio 按钮,分别定义 id 为 control-1、control-2 和 control-3,我们会在稍后透过 <label> 去引用到它。然后要定义相同的 name,这样就可以将它们归纳为同一组按钮,第一个 radio 按钮内再加上 checked,预设拣选了它。
目前 radio 按钮被三张轮播图遮住了,在 CSS 那边暂时加入 input[type="radio"] 选择器,设定 position: relative 和 z-index: 100,这样就可以看到 radio 按钮,方便我们了解接下来的部份。
在三张轮播图的下方,加入一个 <div>,class 是 controls-visible,里面加入三个 <label> 标签,<label> 的 for 属性指定为 radio 按钮的 id,所以分别是 control-1,control-2 和 control-3。
然后我们会将这三个 <label> 透过 CSS 调整成一个圆点的样式,在 CSS 的部份加入 .controls-visible 和 .controls-visible label 选择器,首先设定容器的样式,设定 position: absolute,宽度是 100%,设定 bottom 距离底部 12px,然后 text-align 设定为 center。
再到 label 的样式设定,加入 display: inline-block,宽度和高度设定为 10px,背景颜色设定为白色,圆角设定为 50%,就会变成一个圆形。然后 margin 设定为上下 0,左右 3px,最后,加入一个白色的框线 border: 2px solid #fff。
现在试试点击三个 label,看到它们可以控制到对应的 radio 按钮:
接下来有两个问题要解决:
- 第一,是调整被点击
label的样式,显示为已选择 - 第二,是进行轮播图的切换
这些都可以通过 CSS 选择器去达到。
我们先看看 HTML 的结构,三个 radio 按钮在上边,这个排序是很重要的,我们之所以要将 radio 写在上面,label 写在下边再控制上边的 radio,是因为可以透过 radio:checked 判断已选择的 radio 按钮,再透过 ~ 波浪符号找它同一层之后的元素。
而因为 CSS 只能找之后同一层的元素,不能找之前同一层的元素,所以 radio 按钮就写了在上边。
首先加入 .slides input[type="radio"]:nth-of-type(1):checked,判断当第一个 radio 按钮是已选择的状态,加入 ~ 波浪符号,找它同一层之后,.controls-visible 里面的 label:nth-of-type(1) ,选择到第一个 label,设定 background-color 是深灰色。现在就可以看到点击第一个 label 的时候,显示为选中的样式:
然后复制这段设定,再设定第二和第三个 label,这样 label 的样式设定就完成了。
最后,设定轮播图切换的效果,加入 .slides input[type="radio"]:nth-of-type(1):checked,~ 波浪符号 .slide。这个意思是,当选中了第一个 radio 按钮之后,后面三张 .slide 的样式。由于我们本身已经将三张 slide 横向排列好,所以只需要因应 radio 按钮,将三个 slide 向左移动特定的距离就可以。
- 当选择了第一个
radio按钮时,将transform设定为translatex(0%)。 - 当选中了第二个
radio按钮时,将transform设定为translatex(-100%),即是向左移动一倍的宽度,就可以将第二张轮播图显示出来。 - 当选中了第三个
radio按钮时,将translatex()设定为-200%,这样就可以了。
然后回到 .slide 选择器,加入动画过渡的设定,transition: .5s transform ease-in-out,以及将 radio 按钮的 display 设定为 none 将它隐藏。
我们来看看这个案例的完成效果
好了,这个就是用纯 CSS 制作出来的轮播图,大家会发现没有向左跳转和向右跳转的按钮,这个部份留给大家动手试试,原理和底下三个 label 的做法是类似的。
而答案在这里,大家可以参考一下:codepen.io/stevenlei/p…
至于为什么没有自动跳转的功能,这里应该就要用上 JavaScript 了,虽然用 @keyframes 是可以做到定时跳转,不过又配合不到手动跳转的情况。如果大家发现有其他做法的话,欢迎留言交流一下。
以上,就是用 CSS 实现轮播图效果的全部内容。
这个案例的源代码在 codepen.io/stevenlei/p…
你的支持是我的动力,请关注 CodingStartup 起码课,我们一起加油!
- B站: space.bilibili.com/451368848
- YouTube: youtube.com/codingstart…
- 掘金: juejin.cn/user/249773…