vanilla

在本教程中,您将学习如何使用纯JavaScript创建响应式全屏幻灯片。 要构建它,我们将经历几个不同的前端技巧。 另外,当我们将鼠标悬停在幻灯片上时,我们将更进一步,自定义光标的外观。

与往常一样,要初步了解我们将要构建的内容,请查看相关的CodePen演示(请查看较大的版本以获得更好的体验):

注意:本教程不会讨论如何使幻灯片放映更加方便(例如按钮)。 我们将主要关注CSS和JavaScript。

1.从页面标记开始

要创建幻灯片,我们需要一个带有slideshow类的元素。 在其中,我们将放置一张幻灯片列表以及导航箭头。

每张幻灯片将包含背景图像。 当然,如果您愿意,可以随时添加其他内容。

默认情况下,将显示第一张幻灯片。 但是,我们可以通过将is-active类附加到所需的幻灯片来配置该行为。

这是必需的标记:

<div class="slideshow">
<ul class="slides">
<li class="slide is-active">
<div class="cover" style="background-image: url(IMG_SRC);"></div>
</li>
<li class="slide">
<div class="cover" style="background-image: url(IMG_SRC);"></div>
</li>
<li class="slide">
<div class="cover" style="background-image: url(IMG_SRC);"></div>
</li>
</ul>
<div class="arrows">
<button class="arrow arrow-prev">
<span></span>
</button>
<button class="arrow arrow-next">
<span></span>
</button>
</div>
</div>
<main>...</main>

2.定义样式

准备好标记后,我们将继续幻灯片的主要样式。

堆叠幻灯片

默认情况下,所有幻灯片都将堆叠在另一个幻灯片上。 除了活动幻灯片之外,它们都将被隐藏。

以下是相关的样式:

.slideshow .slides {
display: grid;
}
.slideshow .slide {
grid-column: 1;
grid-row: 1;
opacity: 0;
transition: opacity 0.4s;
}
.slideshow .slide.is-active {
opacity: 1;
}

幻灯片中的每个div都会获得cover类。 这会将其背景图像转换为全屏背景图像:

.cover {
background-size: cover;
background-repeat: no-repeat;
background-position: center;
height: 100vh;
}

导航

导航按钮将绝对位于幻灯片内。 每个按钮应覆盖幻灯片放映宽度的一半,并且其高度应等于幻灯片放映高度。

最初,所有按钮都将被隐藏。 但是,当我们开始在幻灯片放映中移动光标时,将根据鼠标位置显示相应的按钮。

按钮内的每个span都会有一个箭头(向左或向右)作为背景图像。

默认情况下,这些箭头的颜色将为黑色。 但是,当我们在幻灯片放映中移动光标时,它们的颜色应该改变并与幻灯片图像形成对比。 创建此效果的技巧是在span s中添加mix-blend-mode: difference (或exclusion )和filter: invert(1)

继续,导航样式如下:

.slideshow {
cursor: none;
}
.slideshow .arrows {
position: absolute;
top: 0;
left: 0;
display: flex;
width: 100%;
height: 100%;
overflow: hidden;
}
.slideshow .arrows .arrow {
position: relative;
width: 50%;
cursor: inherit;
visibility: hidden;
overflow: inherit;
}
.slideshow .arrows .is-visible {
visibility: visible;
}
.slideshow .arrows span {
position: absolute;
width: 72px;
height: 72px;
background-size: 72px 72px;
mix-blend-mode: difference;
filter: invert(1);
}
.slideshow .arrow-prev span {
background-image: url(slider-prev-arrow.svg);
}
.slideshow .arrow-next span {
background-image: url(slider-next-arrow.svg);
}

3.添加JavaScript

现在让我们向幻灯片添加互动性!

对于此示例,幻灯片将带有三个默认选项,我们可以通过指定关联的自定义属性来自定义这些选项:

选项 默认值 描述
autoplay 使幻灯片放映自动播放。
autoplay-interval 4000 切换幻灯片之间的间隔时间以毫秒为单位。
stop-autoplay-on-hover 悬停时停止自动播放模式。

变数

在深入研究这些选项之前,首先,我们将定义一堆变量,稍后将使用它们:

const slideshow = document.querySelector(".slideshow");
const list = document.querySelector(".slideshow .slides");
const btns = document.querySelectorAll(".slideshow .arrows .arrow");
const prevBtn = document.querySelector(".slideshow .arrow-prev");
const prevBtnChild = document.querySelector(".slideshow .arrow-prev span");
const nextBtn = document.querySelector(".slideshow .arrow-next");
const nextBtnChild = document.querySelector(".slideshow .arrow-next span");
const main = document.querySelector("main");
const autoplayInterval = parseInt(slideshow.dataset.autoplayInterval) || 4000;
const isActive = "is-active";
const isVisible = "is-visible";
let intervalID;

初始化事物

当所有页面资产准备就绪时,我们将调用init函数。

window.addEventListener("load", init);

此功能将触发四个子功能:

function init() {
changeSlide();
autoPlay();
stopAutoPlayOnHover();
customizeArrows();
}

稍后我们将看到,这些功能中的每一个都将完成特定的任务。

循环浏览幻灯片

changeSlide函数将负责遍历幻灯片。

每次单击按钮时,我们将执行以下操作:

  1. 获取当前活动幻灯片的副本。
  2. 从活动幻灯片中删除is-active类。
  3. 检查以查看单击了哪个按钮。 如果这是下一个按钮,则将is-active类添加到幻灯片中,该类紧随活动幻灯片之后。 如果没有这样的幻灯片,则第一张幻灯片将获得此类课程。
  4. 另一方面,如果单击上一个按钮,我们会将is-active类添加到活动幻灯片的上一个幻灯片中。 如果没有这样的幻灯片,则最后一张幻灯片将获得此类。

这是此函数的签名:

// variables here
function changeSlide() {
for (const btn of btns) {
btn.addEventListener("click", e => {
// 1
const activeSlide = document.querySelector(".slide.is-active");
// 2
activeSlide.classList.remove(isActive);
// 3
if (e.currentTarget === nextBtn) {
activeSlide.nextElementSibling
? activeSlide.nextElementSibling.classList.add(isActive)
: list.firstElementChild.classList.add(isActive);
} else {
// 4
activeSlide.previousElementSibling
? activeSlide.previousElementSibling.classList.add(isActive)
: list.lastElementChild.classList.add(isActive);
}
});
}
}

自动播放

autoplay功能将负责激活自动播放模式。

默认情况下,我们必须手动循环浏览幻灯片。

要激活自动播放,我们将data-autoplay="true"属性添加到幻灯片中。

我们还可以通过将data-autoplay-interval="number" (默认值为4000ms)定义为第二个属性来调整切换幻灯片之间的间隔时间,如下所示:

<div class="slideshow" data-autoplay="true" data-autoplay-interval="6000">
...
</div>

这是此函数的签名:

// variables here
function autoPlay() {
if (slideshow.dataset.autoplay === "true") {
intervalID = setInterval(() => {
nextBtn.click();
}, autoplayInterval);
}
}

停止自动播放

当将stopAutoplayOnHover悬停在幻灯片上时, stopAutoplayOnHover函数将负责禁用自动播放模式。

要启用此功能,我们将data-stop-autoplay-on-hover="true"属性传递给幻灯片,如下所示:

<div class="slideshow" data-stop-autoplay-on-hover="true">
...
</div>

这是此函数的签名:

// variables here
function stopAutoPlayOnHover() {
if (
slideshow.dataset.autoplay === "true" &&
slideshow.dataset.stopAutoplayOnHover === "true"
) {
slideshow.addEventListener("mouseenter", () => {
clearInterval(intervalID);
});
// touch devices
slideshow.addEventListener("touchstart", () => {
clearInterval(intervalID);
});
}
}

自定义箭头

customizeArrows函数将负责操纵导航按钮的可见性及其span的位置。

如前所述,导航按钮最初将被隐藏。

当我们将鼠标移到幻灯片中时,根据鼠标位置的不同,一次只会出现其中一个。 其span元素的位置也将取决于鼠标指针的坐标。

离开幻灯片放映后,按钮将再次隐藏。

为了在各种屏幕/设备上满足这些要求,我们将使用两个鼠标事件以及两个触摸事件。

这是实现此功能的代码:

// variables here
function customizeArrows() {
slideshow.addEventListener("mousemove", mousemoveHandler);
slideshow.addEventListener("touchmove", mousemoveHandler);
slideshow.addEventListener("mouseleave", mouseleaveHandler);
main.addEventListener("touchstart", mouseleaveHandler);
}
function mousemoveHandler(e) {
const width = this.offsetWidth;
const xPos = e.pageX;
const yPos = e.pageY;
const xPos2 = e.pageX - nextBtn.offsetLeft - nextBtnChild.offsetWidth;
if (xPos > width / 2) {
prevBtn.classList.remove(isVisible);
nextBtn.classList.add(isVisible);
nextBtnChild.style.left = `${xPos2}px`;
nextBtnChild.style.top = `${yPos}px`;
} else {
nextBtn.classList.remove(isVisible);
prevBtn.classList.add(isVisible);
prevBtnChild.style.left = `${xPos}px`;
prevBtnChild.style.top = `${yPos}px`;
}
}
function mouseleaveHandler() {
prevBtn.classList.remove(isVisible);
nextBtn.classList.remove(isVisible);
}

结论

就是这样,伙计们! 在本教程中,我们通过编写纯JavaScript代码设法实现了灵活的全屏幻灯片显示。 希望您喜欢这个旅程并获得了一些新知识!

这提醒我们建立了什么:

您可以做很多事情来增强此幻灯片的功能。 这里有一些想法:

与往常一样,非常感谢您的阅读!

翻译自: https://webdesign.tutsplus.com/tutorials/simple-full-screen-slideshow-with-vanilla-javascript--cms-34624

vanilla

vanilla_如何使用Vanilla JavaScript构建简单的全屏幻灯片相关推荐

  1. vanilla_如何使用Vanilla JavaScript构建钢琴键盘

    vanilla Making a playable piano keyboard can be a great way to learn a programming language (besides ...

  2. 使用 Vanilla JavaScript 构建自定义 SPA 路由器

    介绍 在本文中,我将解释如何使用 Vanilla JavaScript 构建自定义 SPA 路由器.我必须在没有任何使用框架的情况下构建一个 UI 项目,并且必须弄清楚如何处理路由,并发现您可以轻松地 ...

  3. 如何仅使用HTML和JavaScript构建简单的URL缩短器

    by Palash Bauri 由Palash Bauri 如何仅使用HTML和JavaScript构建简单的URL缩短器 (How to build a simple URL shortener w ...

  4. 使用JavaScript使浏览器进入全屏或退出全屏

    使用JavaScript使浏览器进入全屏或退出全屏 首先使用fullscreenElement判断浏览器是否在全屏状态. 如果是:则调用exitFullscreen函数退出全屏,否则调用request ...

  5. html自动全屏js,js实现简单页面全屏

    本文实例为大家分享了js实现简单页面全屏,供大家参考,具体内容如下 全屏效果为传入div元素全屏: 代码块 js控制页面的全屏展示和退出全屏显示 js控制页面的全屏展示和退出全屏显示 #content ...

  6. JavaScript 触发浏览器页面全屏,某div区域全屏

    JavaScript Fullscreen API:全屏操作 全屏API可以控制浏览器的全屏显示,让一个Element节点(以及子节点)占满用户的整个屏幕.目前各大浏览器的最新版本都支持这个API(包 ...

  7. vue3简单处理全屏

    处理全屏 1. 尝试fullscreenchange事件 2. 使用keydown事件 3. 最后的收尾处理 1. 尝试fullscreenchange事件 // script setup ts im ...

  8. vanilla_如何在Vanilla JavaScript中操作DOM

    vanilla by carlos da costa 通过卡洛斯·达·科斯塔 如何在Vanilla JavaScript中操作DOM (How to manipulate the DOM in Van ...

  9. 用 html+JavaScript+CSS 写一个全屏时钟

    先上效果图 来看看代码和原理 首先,要能够直接双击运行,不依赖任何的环境或浏览器,就需要引进一个新概念--Microsoft ® HTML 应用程序主机. HTML应用程序 它位于Windows系统目 ...

最新文章

  1. 5加载stm32 keil_快速入门STM32单片机-软件篇
  2. 开源 Serverless 里程碑:Knative 1.0 来了
  3. 神策数据徐美玲:数字化运营,从 1 到 100 的跨越
  4. java中数组的定义
  5. treeselect 如何选中多个_转pdf后出现word没有的形状——对象选择窗格(同时选择多个形状、图形)...
  6. 多项式拟合怎么确定次数_PyTorch入门4 搭建多项式回归模型
  7. python 显示表格数据匹配_比较两个电子表格文件并提取机器匹配数据的最简单和最快的方法是什么?...
  8. sonar下载安装配置教程
  9. CS61A 2021Spring Lab: Cats
  10. 仿微信在线聊天源码 DuckChat聊天系统PHP采用 PHP 编写的聊天软件,简直就是一个完整的迷你版微信
  11. 【 FPGA 】玩玩带有异步复位,同步使能的D触发器的两种实现方式
  12. 深入探访支付宝双11十年路,技术凿穿焦虑与想象极限
  13. 大数据分析项目实例:Hadoop数据分析应用场景
  14. 蓝牙文件传输服务linux,openwrt蓝牙文件传输
  15. 计算机网络技术协议的三要素,通信网络协议三要素
  16. hadoop 读取数据
  17. 职场:如何判断自己的性格类型,DISC测评
  18. Java实现视频(mp4/flv/..)及图片(jpg/jpeg/png/..)给前端调用
  19. Wordpress建站-wp建站网站优化收录
  20. 哥伦比亚大学计算机工程专业研究生,哥伦比亚大学计算机工程研究生Offer及录取要求...

热门文章

  1. h3c查看光纤光功率
  2. 数据结构学习笔记 哈希表(一) 哈希表基础与哈希函数
  3. Java 输出杨辉三角
  4. Docker学习(四):Dockerfile
  5. Unnecessary escape character: \- no-useless-escape eslint
  6. Matlab/simulink采样仿真数据(时序)和时间序列的保存
  7. Python 的文件路径和操作(一)
  8. ResetTemplate封装
  9. 智能车竞赛技术报告 | 节能信标组 - 兰州交通大学 - 先锋队
  10. 图像处理QPixmap、Picture、QBitmap