原JS实现banner图的常用功能

yizhihongxing

下面我将详细讲解原JS实现banner图的常用功能的完整攻略。

1. 常用功能介绍

在实现banner图过程中,以下是一些常用的功能:

1.1 图片轮播

图片轮播是banner图的核心功能,它可以通过设置图片列表和定时器来实现。轮播过程可以采用两种方式:水平轮播和垂直轮播。图片轮播一般会包含以下功能:

  • 自动轮播:按照一定时间间隔自动切换图片
  • 手动切换:用户可以通过点击向左/右的按钮或者指示器,切换到其他图片
  • 切换动画:各种切换动画效果,例如渐变、滑动等等
  • 标题/描述信息:添加相应的文本描述信息,提高用户体验

1.2 轮播图优化

轮播图的性能优化也是一个非常重要的问题。为了提高页面的加载速度和用户体验,轮播图可以实现以下功能:

  • 懒加载:只在需要的时候才加载图片
  • 预加载:提前加载当前图片的下一张和上一张图片,提高用户切换体验
  • 自适应大小:适应不同的设备窗口大小
  • 鼠标悬停暂停:用户在鼠标移动到轮播区域时,自动停止轮播

2. 实现方式

接下来我们将介绍如何利用原生JS实现banner图。

2.1 图片轮播实现

2.1.1 图片轮播布局

首先,我们需要在HTML页面中创建一个轮播图盒子,在盒子中添加一组图片以及导航按钮(左右切换和指示器)。

<div class="banner-wrap">
  <ul class="banner-list">
    <li><a href=""><img src="img/1.jpg" alt=""></a></li>
    <li><a href=""><img src="img/2.jpg" alt=""></a></li>
    <li><a href=""><img src="img/3.jpg" alt=""></a></li>
    <li><a href=""><img src="img/4.jpg" alt=""></a></li>
    <li><a href=""><img src="img/5.jpg" alt=""></a></li>
  </ul>
  <a href="javascript:;" class="btn-prev"></a>
  <a href="javascript:;" class="btn-next"></a>
  <ul class="banner-nav">
    <li class="active">1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
  </ul>
</div>

2.1.2 图片轮播样式

然后,我们需要为轮播图盒子以及内部元素添加样式。

.banner-wrap {
  position: relative;
  width: 100%;
  height: 400px;
  overflow: hidden;
}

.banner-list {
  position: absolute;
  width: 500%;
  height: 100%;
  left: 0;
  top: 0;
}

.banner-list li {
  position: relative;
  float: left;
  width: 20%;
  height: 100%;
}

.banner-list img {
  display: block;
  width: 100%;
  height: 100%;
}

.btn-prev,
.btn-next {
  position: absolute;
  width: 60px;
  height: 60px;
  top: 50%;
  margin-top: -30px;
  background: url(img/icon.png) no-repeat;
  background-position: -64px -64px;
  cursor: pointer;
}

.btn-prev {
  left: 20px;
  background-position: 0 -64px;
}

.btn-next {
  right: 20px;
}

.banner-nav {
  position: absolute;
  width: 100%;
  height: 20px;
  bottom: 10px;
  left: 0;
  text-align: center;
  font-size: 0;
}

.banner-nav li {
  display: inline-block;
  width: 10px;
  height: 10px;
  margin: 0 5px;
  border-radius: 50%;
  background: #fff;
  cursor: pointer;
}

.banner-nav li.active {
  background: blue;
}

2.1.3 图片轮播逻辑实现

最后,我们需要运用原生JS为轮播图添加图片自动播放,手动切换,动画效果和文本信息等功能。以下是一个基于原生JS实现的代码示例:

// 获取元素
var bannerWrap = document.querySelector('.banner-wrap');
var bannerList = bannerWrap.querySelector('.banner-list');
var bannerNav = bannerWrap.querySelector('.banner-nav');
var btnPrev = bannerWrap.querySelector('.btn-prev');
var btnNext = bannerWrap.querySelector('.btn-next');
var navItems = bannerNav.querySelectorAll('li');

// 默认参数
var slideIndex = 1; // 当前显示图片的下标
var interval = 3000; // 轮播间隔
var timer = null; // 定时器句柄
var isAnimate = false; // 是否正在滑动
var animateTime = 600; // 动画过渡时间
var animateDistance = 100; // 滑动距离

// 初始位置
function setSlidePosition(slideIndex, distance) {
  bannerList.style.transition = distance ? 'none' : '';
  bannerList.style.transform = 'translate3d(' + (-slideIndex * 20) + '%, 0, 0)';
}

// 切换到或从第一张或最后一张图, 需要瞬间移动
function switchTo(slideIndex) {
  if (slideIndex <= 0) {
    setSlidePosition(slideIndex, animateDistance);
    slideIndex = navItems.length;
  } else if (slideIndex > navItems.length) {
    setSlidePosition(slideIndex, animateDistance);
    slideIndex = 1;
  }
  return slideIndex;
}

// 添加指示器按钮事件
for (var i = 0, length = navItems.length; i < length; i++) {
  navItems[i].index = i + 1;
  navItems[i].addEventListener('click', function() {
    if (isAnimate) return;
    isAnimate = true;
    var targetIndex = this.index;
    slideIndex = targetIndex;
    setActiveNav(targetIndex);
    slide(targetIndex - slideIndex, animateTime);
  });
}

// 添加上一页按钮事件
btnPrev.addEventListener('click', function() {
  if (isAnimate) return;
  isAnimate = true;
  slideIndex = switchTo(slideIndex - 1);
  setActiveNav(slideIndex);
  slide(1, animateTime);
});

// 添加下一页按钮事件
btnNext.addEventListener('click', function() {
  if (isAnimate) return;
  isAnimate = true;
  slideIndex = switchTo(slideIndex + 1);
  setActiveNav(slideIndex);
  slide(-1, animateTime);
});

// 切换到指定图片
function slide(offset, time) {
  var currentLeft = -slideIndex * 20;
  var targetLeft = currentLeft + offset * 20;
  setSlidePosition(slideIndex + offset, animateDistance);
  setTimeout(function() {
    setSlidePosition(slideIndex + offset);
    isAnimate = false;
  }, time);
}

// 设置当前位置标记
function setActiveNav(index) {
  slideIndex = switchTo(index);
  for (var i = 0, length = navItems.length; i < length; i++) {
    if (navItems[i].classList.contains('active')) {
      navItems[i].classList.remove('active');
      break;
    }
  }
  navItems[slideIndex - 1].classList.add('active');
}

// 自动轮播功能
function autoPlay() {
  timer = setInterval(function() {
    btnNext.click();
  }, interval);
}
autoPlay();
bannerWrap.addEventListener('mouseenter', function() {
  clearInterval(timer); 
});
bannerWrap.addEventListener('mouseleave', function() {
  autoPlay(); 
});

2.2 轮播图优化实现

2.2.1 图片懒加载实现

图片懒加载的实现主要是利用原生JS中的IntersectionObserver API。该API可以监听指定元素与视口的交叉状态,并执行相应的动作。以下是一个基于原生JS实现图片懒加载的代码示例:

var observer = new IntersectionObserver(function(entries) {
  entries.forEach(function(entry) {
    if (entry.isIntersecting) {
      var img = entry.target;
      img.src = img.dataset.src;
      observer.unobserve(img);
    }
  });
});
document.querySelectorAll('.lazyload').forEach(function(img) {
  observer.observe(img);
});

以上代码中,我们首先创建一个IntersectionObserver实例,然后调用该实例的observe方法,绑定需要懒加载的图片元素。当图片元素与视口交叉时,将data-src属性值赋给src属性,实现图片懒加载功能。

2.2.2 图片预加载实现

图片预加载同样可以利用原生JS实现。以下是一个基于原生JS实现图片预加载的代码示例:

function preloadImg(imgSrc) {
  var img = new Image();
  img.src = imgSrc;
  if (img.complete) {
    console.log(imgSrc + ' 已经被缓存过了');
  } else {
    img.onload = function() {
      console.log(imgSrc + ' 加载完成');
    }
    img.onerror = function() {
      console.log(imgSrc + ' 加载失败');
    }
  }
}
preloadImg('http://example.com/img/1.jpg');
preloadImg('http://example.com/img/2.jpg');

以上代码中,我们可以定义一个函数preloadImg,传入需要预加载的图片src地址。然后创建一个图片对象,将图片src地址赋值给img元素的src,使用onload和onerror事件监听图片加载完成和加载失败事件。

2.2.3 自适应大小实现

自适应大小可以通过百分比和媒体查询来实现。以下是一个基于原生JS实现自适应大小的代码示例:

function resizeBanner() {
  var clientWidth = document.documentElement.clientWidth;
  var bannerList = document.querySelector('.banner-list');
  var bannerItem = bannerList.querySelectorAll('li');

  for (var i = 0, length = bannerItem.length; i < length; i++) {
    bannerItem[i].style.width = clientWidth + 'px';
  }
  bannerList.style.width = clientWidth * bannerItem.length + 'px';
}
window.onresize = function() {
  resizeBanner();
}
resizeBanner();

以上代码中,我们声明一个resizeBanner函数,在该函数中获取页面的clientWidth,并将其赋值给轮播图中的每一个图片li元素的宽度。然后将bannerList的宽度也设置为li元素宽度之和。

最后,在窗口大小变化时,调用resizeBanner函数,即可实现轮播图的自适应大小效果。

2.2.4 鼠标悬停暂停实现

鼠标悬停暂停可以利用原生JS中的setInterval和clearInterval实现。以下是一个基于原生JS实现鼠标悬停暂停的代码示例:

var bannerWrap = document.querySelector('.banner-wrap');
var timer = null;
var interval = 3000;

function autoPlay() {
  timer = setInterval(function() {
    btnNext.click();
  }, interval);
};

autoPlay();
bannerWrap.addEventListener('mouseenter', function() {
  clearInterval(timer); 
});
bannerWrap.addEventListener('mouseleave', function() {
  autoPlay(); 
});

以上代码中,我们声明一个autoPlay函数,该函数利用setInterval方法定时切换图片。然后,在轮播图盒子上绑定mouseenter和mouseleave事件,分别在鼠标悬停和离开时,暂停和恢复自动轮播。

总结

本文主要介绍了原生JS实现banner图的常用功能和实现方式。其中,图片轮播是banner图的核心功能,而轮播图的性能优化,则可以提高页面的加载速度和用户体验。我相信,理解了本文的内容,在实现banner图时,就会更加得心应手。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:原JS实现banner图的常用功能 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • css 中多种边框的实现小窍门

    下面是关于“css 中多种边框的实现小窍门”的完整攻略。 1. 常规边框样式 在 CSS 中,我们可以使用 border 属性来设置元素的边框样式。常规边框样式包括: solid:实线样式 dotted:点状样式 dashed:虚线样式 double:双线样式 groove:3D 浮雕样式(向内凹陷) ridge:3D 浮雕样式(向外凸起) inset:3D…

    css 2023年6月9日
    00
  • jQuery Validate表单验证插件的基本使用方法及功能拓展

    jQuery Validate表单验证插件基本使用方法 jQuery Validate是一款小巧而功能强大的表单验证插件。它可以提供简单易用的验证规则,并且支持自定义检验函数和错误信息。下面是详细的使用方法。 安装jQuery Validate 在使用jQuery Validate之前,要先在页面中引入jQuery库和jQuery Validate插件。假设…

    css 2023年6月9日
    00
  • html在线编辑器的更新[2006-05]

    HTML在线编辑器的更新[2006-05] 本次更新主要针对HTML在线编辑器进行改进,旨在让用户在编写HTML页面时更加方便和快捷。以下是本次更新的具体内容: 插入代码功能增强 在编辑HTML页面时,用户可以使用“插入代码”功能快速生成代码块,但该功能以前只支持部分基础HTML标签。为了让用户更灵活地使用该功能,我们对该功能进行了增强。现在,用户可以在“插…

    css 2023年6月9日
    00
  • 彻底弄明白CSS3的Media Queries(跨平台设计)

    下面就为大家详细讲解“彻底弄明白CSS3的Media Queries(跨平台设计)”的完整攻略。 什么是 Media Queries Media Queries 是 CSS3 中的一个新特性,它允许我们在不同的设备、分辨率以及屏幕方向下,对网页的样式进行不同的设计和呈现。Media Queries 的出现,使得我们可以更加精细的设计网站,让网页在不同的设备上…

    css 2023年6月10日
    00
  • Flash cs6怎么使用网页格式改变文本颜色?

    针对“Flash cs6怎么使用网页格式改变文本颜色?”,以下是标准的markdown格式文本的攻略: Flash cs6怎么使用网页格式改变文本颜色? 步骤一:选中需要修改的文本 在Flash中打开需要修改颜色的文本位置,选择需要改变颜色的文本。 步骤二:打开颜色面板 在Flash中点击顶部菜单栏的“窗口” -> “颜色”,打开颜色面板。 步骤三:选…

    css 2023年6月9日
    00
  • 详解css栅格系统在项目中的灵活运用

    详解css栅格系统在项目中的灵活运用 什么是CSS栅格系统? CSS栅格系统是一种基于网格的布局系统,它将页面的整个宽度分为若干个等宽的列,开发者可以选择在其中的某些列来放置内容。CSS栅格系统使页面开发更加简单并且可以适应不同大小的屏幕。 如何使用CSS栅格系统? 在使用CSS栅格系统时,最好使用一些已经成熟的框架,如Bootstrap、Foundatio…

    css 2023年6月11日
    00
  • XSS绕过技术 XSS插入绕过一些方式总结

    XSS(Cross-Site Scripting,跨站脚本攻击)是指恶意攻击者在目标网站注入恶意脚本,使得用户在访问该网站时被攻击者控制。XSS攻击是目前最常见的Web安全问题之一,攻击者通过XSS攻击可以窃取用户的敏感信息,如账号密码、Cookie等,或者利用XSS攻击进行其它恶意行为。为了防止XSS攻击,web开发中应该采用严格的输入过滤和输出转义等措施…

    css 2023年6月9日
    00
  • 防止网页被搜索引擎爬虫和网页采集器收录的方法汇总

    我来为你讲解一下。 防止网页被搜索引擎爬虫和网页采集器收录的方法汇总 防止网页被搜索引擎爬虫和网页采集器收录是网站安全的一项重要工作。以下是一些方法: 1. robots.txt 协议 robots.txt 就是所谓的协议或标准,它的作用是告诉搜索引擎的爬虫哪些页面可以访问,哪些不可以访问。网站的根目录(比如 https://www.example.com)…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部