带你手写一个轮播图之HTML结构和CSS布局设计
zhezhongyun 2024-12-26 17:42 47 浏览
在前端项目开发中,大家可能多少都有用到过轮播图。一般为了省事,我们会使用现成的库,比如swiper。当然,很多组件库也带有轮播图组件,比如element-ui的ElCarousel组件。但是,有多少童鞋曾思考过其实现原理呢?又有多少童鞋尝试过手写一个呢?
其实,实现一个轮播图相当简单,我打算出一个大约3节的连载教程,教大家怎样一步一步实现轮播图。今天,我们先讲解结构和布局的设计。
首先,我们创建一个项目文件夹carousel-demo,在该目录下新建images文件夹和index.html,main.js,style.css三个文件。然后,大家找3张相同尺寸的banner图和2个相同尺寸的小图标放入images文件夹。我用的banner图尺寸是1280*720,文件名分别是1.jpg,2.jpg,3.jpg;我用的图标尺寸是32*32,文件名分别是left.png和right.png。
最终,我们实现的轮播图界面长这样,大家说漂不漂亮?
接下来,我们打开index.html文件,先创建一个基本的骨架,并引入我们刚才创建的css和js文件,代码如下:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Carousel demo</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<script src="main.js"></script>
</body>
</html>
我们的轮播图需要一个外层容器元素,该元素包含一个banner列表,一个指示器和一组左右导航按钮。由于默认显示第一张图片,所以我们给第一个指示器项添加了一个active类。代码如下:
<div class="carousel-wrapper">
<ul class="slides">
<li class="slide-item">
<img src="images/1.jpg">
</li>
<li class="slide-item">
<img src="images/2.jpg">
</li>
<li class="slide-item">
<img src="images/3.jpg">
</li>
</ul>
<ul class="indicators">
<li class="indicator-item active"></li>
<li class="indicator-item"></li>
<li class="indicator-item"></li>
</ul>
<ul class="nav">
<li class="nav-left"></li>
<li class="nav-right"></li>
</ul>
</div>
现在,我们打开style.css文件,首先对默认样式做一些重置,将所有元素的内外边距设为0,盒模型设为边框盒。为了去掉li元素前面的小圆点,我们将li元素的list-style设为none。样式如下:
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
li {
list-style: none;
}
接下来,我们从外到内,从上到下为元素定义样式。
首先,我们定义外层容器元素的样式。为了使布局更灵活,我们先给它指定一个最大宽度,并让其在水平方向居中。由于它的子元素需要堆叠,我们给它设置相对定位,让子元素相对于它来定位。由于我们的banner列表有多张图片,可以左右滚动,每次仅一张图片可见,所以需要将不可见的图片裁掉。样式如下:
.carousel-wrapper {
max-width: 800px;
margin: auto;
position: relative;
overflow: hidden;
}
接下来,我们定义banner列表和其子元素样式。我们的banner列表有3张图片,可以左右滚动,每次仅显示一张,所以banner的宽度与容器一样,banner列表宽度是容器的3倍。
我们将banner列表元素显示为弹性盒,以让所有banner在一行排列显示。由于弹性盒子元素会均分空间,而我们的banner图宽度相同,所以不需要设置banner的宽度,仅将banner内的img元素宽度设为100%即可。
我们也为banner列表添加了过渡属性,当使用JS动态改变变换值的时候会有动画效果。样式如下:
.slides {
width: 300%;
display: flex;
transition: transform .3s;
}
.slide-item img {
display: block;
width: 100%;
}
下面,我们定义指示器样式。我们的指示器需要在banner列表上层底部居中显示,我们使用left和X轴平移变换结合实现水平居中,全部样式如下:
.indicators {
position: absolute;
bottom: 10px;
left: 50%;
transform: translateX(-50%);
display: flex; // 弹性盒,让子元素在一行显示
padding: 5px;
border-radius: 10px;
background-color: rgba(255, 255, 255, .3);
pointer-events: none; // 阻止指示器容器成为指针事件目标
}
.indicator-item {
pointer-events: all; // 让指示器子元素可以成为指针事件目标
cursor: pointer;
width: 30px;
height: 6px;
margin: 0 4px;
border-radius: 6px;
background-color: #999;
}
.indicator-item.active { // 为活动指示器项设置一个不同的样式
background-color: #ccc;
}
最后,我们定义导航按钮样式。我们的导航按钮需要在banner列表上层两边垂直方向居中显示,我们使用top和Y轴平移变换结合实现垂直居中,全部样式如下:
.nav li {
cursor: pointer;
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 40px;
height: 40px;
background-color: rgba(255, 255, 255, .3);
background-repeat: no-repeat;
background-position: center;
background-size: 24px;
}
.nav-left {
left: 0;
background-image: url(images/left.png);
}
.nav-right {
right: 0;
background-image: url(images/right.png);
}
以上就是本文的全部内容了,童鞋们都理解了吗?还有什么不懂的欢迎评论区提问,感谢阅读!
相关推荐
- 3 分钟!AI 从零开发五子棋全过程曝光,网友:这效率我服了
-
<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8...
- 一行代码实现display"过渡动画"原理
-
作者:Peter谭老师转发链接:https://mp.weixin.qq.com/s/XhwPOv62gypzq5MhhP-5vg写本文的起因上篇文章,提到如何让display出现过渡动画,却没有仔...
- 脑洞:琼恩·雪诺、蝙蝠侠和魔形女的灵魂宠物了解一下
-
AlekseiVinogradovisaRussianfreelancedigitalartistwhoshareshisskillsandtalentwith120k...
- 浏览器的渲染机制、重绘、重排
-
1、什么是重排和重绘网页生成过程:HTML被HTML解析器解析成DOM树css则被css解析器解析成CSSOM树结合DOM树和CSSOM树,生成一棵渲染树(RenderTree)生成布局(flo...
- 托福写作高频考题写作思路&词汇丨考虫独家
-
科技话题与媒体话题是托福写作的常考话题很多考生对这两类话题里的专有词汇表达也许很不了解所以今天就跟随考虫托福写作老师刘云龙老师一起来学习在这些话题的写作里你可以使用哪些有用的表达。希望大家有收获!记得...
- 在优麒麟上使用 Electron 开发桌面应用
-
使用Web标准来创建桌面GUI,上手快、成本低、跨平台、自适应分辨率,这些都是Electron的优势。作者/来源:优麒麟Electron是由Github开发,用HTML、CSS和...
- php手把手教你做网站(三十八)jquery 转轮盘抽奖,开盲盒
-
抽奖和开盲盒性质一样的都是通过ajax读取后台的随机数据。1、转轮盘本来是想直接绘图实现轮盘,但是没有找到怎么填充文字,只好把轮盘弄成了背景图,通常用于游戏抽道具,商城积分抽奖,公司年末员工抽奖点击抽...
- 用 CSS 整活!3D 轮播图手把手教学,快乐代码敲出来
-
兄弟们,今天咱来搞点好玩的——用CSS整一个3D轮播图!咱野生程序员就是要在代码里找乐子,技术和快乐咱都得要!代码是写不完的,但咱能自己敲出快乐来,走起!一、先整个容器,搭个舞台咋先写一个...
- 实现一个超酷的 3D 立体卡片效 #前端开发
-
今天我们来实现一个超酷的3D立体卡片效果。正常情况下就是一个普通的图片展示卡片,鼠标悬停的时候图片会跳出卡片,并将影子投射到背景卡片上,在视觉上有一个3D立体感。html主要分成3个部分:容器→背景层...
- Vue 3 Teleport与Suspense:解决UI难题的两个"隐藏大招"
-
模态框的"层级噩梦"与Teleport的救赎"这个模态框怎么又被父容器截断了?"团队协作开发后台系统时,小张第N次遇到这个问题。多层嵌套的组件结构里,弹窗被overfl...
- 让交互更加生动!有意思的鼠标跟随 3D 旋转动效
-
今天,群友问了这样一个问题,如下所示的鼠标跟随交互效果,如何实现:简单分析一下,这个交互效果主要有两个核心:借助了CSS3D的能力元素的旋转需要和鼠标的移动相结合本文,就将讲述如何使用纯CSS...
- 填坑:transform元素导致zindex失效终极方法
-
今天遇到了使用css3动画的元素层级被放大置顶的问题,ios浏览器上没问题,安卓原生浏览器和安卓微信上有问题。使用了css3动画的元素z-index失效,兄弟元素设置多高的z-index都盖不住解决办...
- 诡异的层级错乱:一个被transform隐藏的CSS陷阱
-
周五下午三点十七分,设计部突然发来紧急截图——原本应该悬浮在顶部的导航菜单,此刻正诡异地被下方的轮播图遮挡。我盯着屏幕上错乱的层级关系,手指下意识地敲下z-index:9999,心里清楚这不过是程序...
- 动画篇--碎片动画
-
本文授权转载,作者:Sindri的小巢(简书)前言从最开始动笔动画篇的博客,至今已经过去了四个多月。这段时间回头看了看自己之前的动画文章,发现用来讲解动画的例子确实不那么的赏心悦目。于是这段时间总是想...
- Nature:大洋转换断层处的拉张构造与两阶段地壳增生
-
Nature:大洋转换断层处的拉张构造与两阶段地壳增生转换断层是三种基本的板块边界之一,全球总长度超过48000km(Bird,2003),它们的发现为板块构造理论的建立奠定了重要的基础(Wil...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 教程 (33)
- HTML 简介 (35)
- HTML 实例/测验 (32)
- HTML 测验 (32)
- JavaScript 和 HTML DOM 参考手册 (32)
- HTML 拓展阅读 (30)
- HTML文本框样式 (31)
- HTML滚动条样式 (34)
- HTML5 浏览器支持 (33)
- HTML5 新元素 (33)
- HTML5 WebSocket (30)
- HTML5 代码规范 (32)
- HTML5 标签 (717)
- HTML5 标签 (已废弃) (75)
- HTML5电子书 (32)
- HTML5开发工具 (34)
- HTML5小游戏源码 (34)
- HTML5模板下载 (30)
- HTTP 状态消息 (33)
- HTTP 方法:GET 对比 POST (33)
- 键盘快捷键 (35)
- 标签 (226)
- HTML button formtarget 属性 (30)
- CSS 水平对齐 (Horizontal Align) (30)
- opacity 属性 (32)