iis服务器助手广告
返回顶部
首页 > 资讯 > 前端开发 > 其他 >实例详解如何给轮播图做自适应的高度
  • 254
分享到

实例详解如何给轮播图做自适应的高度

前端JavaScript 2023-05-14 22:05:56 254人浏览 泡泡鱼
摘要

本篇文章给大家带来了关于前端的相关知识,其中主要介绍了怎么给轮播图做一个自适应的高度,感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。不知道大家有没有遇到这样的需求或者说看到类似的效果,就是列表进去详情看轮播图的时候,当手指滚动轮播图时轮

本篇文章给大家带来了关于前端的相关知识,其中主要介绍了怎么给轮播图做一个自适应的高度,感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。

不知道大家有没有遇到这样的需求或者说看到类似的效果,就是列表进去详情看轮播图的时候,当手指滚动轮播图时轮播的高度容器会自适应,这样下面的内容就向上挤,滑动的过程会计算高度,释放的时候也会滚到下一张,也会计算对应图片的高度,然后做一个缓动的动画效果。就像下面这张图的样子。

1.gif

可以看到上面的图片内容文字,随着轮播的滑动高度也在变化。费话不多说直接上代码。

实现方法

可以通过监听鼠标mounse 或者手指的滑动 touch 事件来控制图片,这里本文只说一下轮播的功能实现思路,重点说的是怎么实现高度的自适应。

直接开始正文,先看 html 代码结构。

html 结构

<div class="container">
  <div class="wrapper">
    <div class="swiper">
      <div class="item">
        <img src="https://ci.xiaohongshu.com/776d1cc7-ff36-5881-ad8f-12a5cd1c3ab3?imageView2/2/w/1080/fORMat/jpg" alt="">
      </div>
      <div class="item">
        <img src="Https://ci.xiaohongshu.com/b8e16620-66a0-79a5-8a4b-5bfee1028554?imageView2/2/w/1080/format/jpg" alt="">
      </div>
      <div class="item">
        <img src="https://ci.xiaohongshu.com/e12013c2-3c46-a2cc-7fda-1e0b20b36f3D?imageView2/2/w/1080/format/jpg" alt="">
      </div>
    </div>
  </div>
  <div class="content">这是一段内容</div>
</div>

css 样式

.container {
  width: 100%;
  overflow: hidden;
}.wrapper {
  width: 100%;
}.swiper {
  font-size: 0;
  white-space: nowrap;
}.item {
  display: inline-block;
  width: 100%;
  vertical-align: top; // 一定要使用顶部对齐,不然会出现错位的情况
}.item img {
  width: 100%;
  height: auto;
  display: block;
}.content {
  position: relative;
  z-index: 9;
  font-size: 14px;
  text-align: center;
  padding-top: 20px;
  background-color: #fff;
  height: 200px;
}

值得注意的地方有几点;

  1. 在使用父级 white-space 时,子集元素设置 display: inline-block 会出现高度不同的排列错位,解决办法就是加上一句 vertical-align: top ,具体什么原因我也不细讲了。
  2. 另外父级还要设置 font-size: 0 ,如果没加上的话,就会出现两个子集有空隙出现,加上之后空隙就会去掉。
  3. img 图片最好设置成高度自适应,宽度100% 还要加上 display: block ,没有的话底部就会出现间隙。

写好上面的 html容器部分和 样式,下面就看一下 js 上是怎么处理的。

Js 实现

开始之前我们先思考一下去怎么实现这个轮播以及高度的自适应问题,分为几步操作;

  1. 鼠标按下时,需要记录当前的位置和一些其他初始化的信息,并且给当前的父元素添加相应的鼠标事件。
  2. 鼠标移动时,需要通过当前实时移动时点位和按下时点位的相减,得到移动的距离位置,然后再赋值给父元素设置其样式 transform 位置,中间还做其他的边界处理,当然还有高度的变化。
  3. 鼠标释放是,通过移动时记录的距离信息判断是左滑还是右滑,拿到其对应的索引,通过索引就可以计算到滚动下一张的距离,释放之后设置 transition 过渡动画即可。

按照我们试想的思路,开始正文;

初始化数据

const data = {
  ele: null,
  width: 0,
  len: 0,
  proportion: .3,
  type: false,
  heights: [500, 250, 375],
  currentIndex: 0,
  startOffset: 0,
  clientX: 0,
  distanceX: 0,
  duration: 30,
  touching: false
}

const wrapper = data.ele = document.querySelector('.wrapper')
const items = document.querySelectorAll('.item')
data.width = wrapper.offsetWidth
data.len = items.length - 1
wrapper.addEventListener('touchstart', onStart)
wrapper.addEventListener('mousedown', onStart)

注意,这里在做高度之前,我们需要等图片加载完成之后才能拿到每一个元素的高度,我这里为了省懒就没写具体代码,上面的 heights 对应的是每个图片在渲染之后的高度,一般情况下最好让后端传回来带宽高,这样就不需要用 onload 再去处理这个。

鼠标按下时

function onStart(event) {
  if (event.type === 'mousedown' && event.which !== 1) return
  if (event.type === 'touchstart' && event.touches.length > 1) return
  data.type = event.type === 'touchstart'
  const events = data.type ? event.touches[0] || event : event

  data.touching = true
  data.clientX = events.clientX
  data.startOffset = data.currentIndex * -data.width

  data.ele.style.transition = `none`
  window.addEventListener(data.type ? 'touchmove' : 'mousemove', onMove, { passive: false })
  window.addEventListener(data.type ? 'touchend' : 'mouseup', onEnd, false)
}

上面的代码里面我做了PC和移动端的兼容,跟计划的一样,保存一下 clientX 坐标和一个初始的坐标 startOffset 这个由当前索引和父级宽度计算得到,场景是当从第二张图片滚动到第三张图片时,会把之前的第一张图片的距离也要加上去,不然就计算错误,看下面滑动时的代码。

另外在做监听移动的时候加上了 passive: false 是为了在移动端兼容处理。

鼠标移动时

function onMove(event) {
  event.preventDefault()
  if (!data.touching) return
  const events = data.type ? event.touches[0] || event : event

  data.distanceX = events.clientX - data.clientX

  let translatex = data.startOffset + data.distanceX
  if (translatex > 0) {
    translatex = translatex > 30 ? 30 : translatex
  } else {
    const d = -(data.len * data.width + 30)
    translatex = translatex < d ? d : translatex
  }

  data.ele.style.transform = `translate3d(${translatex}px, 0, 0)`
  data.ele.style.WEBkitTransform = `translate3d(${translatex}px, 0, 0)`
}

做了一个边界处理的,超了 30 的距离就不让继续滑动了,加上之前保存的 startOffset 的值,得到的就是具体移动的距离了。

鼠标释放时

function onEnd() {
  if (!data.touching) return
  data.touching = false

  // 通过计算 proportion 滑动的阈值拿到释放后的索引
  if (Math.abs(data.distanceX) > data.width * data.proportion) {
    data.currentIndex -= data.distanceX / Math.abs(data.distanceX)
  }
  if (data.currentIndex < 0) {
    data.currentIndex = 0
  } else if (data.currentIndex > data.len) {
    data.currentIndex = data.len
  }
  const translatex = data.currentIndex * -data.width

  data.ele.style.transition = 'all .3s ease'
  data.ele.style.transform = `translate3d(${translatex}px, 0, 0)`
  data.ele.style.webkitTransform = `translate3d(${translatex}px, 0, 0)`

  window.removeEventListener(data.type ? 'touchmove' : 'mousemove', onMove, { passive: false })
  window.removeEventListener(data.type ? 'touchend' : 'mouseup', onEnd, false)
}

通过计算 proportion 滑动的阈值拿到释放后的索引,也就是超过父级宽度的三分之一时释放就会滚动到下一张,拿到索引之后就可以设置需要移动的最终距离,记得加上 transition 做一个缓动效果,最后也别忘记移除事件的监听。

至此上面的简单的轮播效果就大功告成了,但是还缺少一点东西,就是本篇需要讲的自适应高度,为了方便理解就单独拿出来说一下。

高度自适应

在移动时就可以在里面做相关的代码整理了, onMove 函数里加上以下代码,来获取实时的高度。

const index = data.currentIndex
const currentHeight = data.heights[index]
    
// 判断手指滑动的方向拿到下一张图片的高度
let nextHeight = data.distanceX > 0 ? data.heights[index - 1] : data.heights[index + 1]
let diffHeight = Math.abs((nextHeight - currentHeight) * (data.distanceX / data.width))
let realHeight = currentHeight + (nextHeight - currentHeight > 0 ? diffHeight : -diffHeight) 
 data.ele.style.height = `${realHeight}px`

这里是移动时的高度变化,另外还需要在释放时也要处理, onEnd 函数里加上以下代码。

// ... 因为上面已经拿到了下一张的索引 currentIndex
const currentHeight = data.heights[data.currentIndex]

data.ele.style.height = `${currentHeight}px`

因为上面已经拿到了下一张的索引 currentIndex 所以再滚动到下一张是就直接通过数据获取就可以了。

推荐学习:《web前端开发视频教程

以上就是实例详解如何给轮播图做自适应的高度的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 实例详解如何给轮播图做自适应的高度

本文链接: https://www.lsjlt.com/news/207200.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 实例详解如何给轮播图做自适应的高度
    本篇文章给大家带来了关于前端的相关知识,其中主要介绍了怎么给轮播图做一个自适应的高度,感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。不知道大家有没有遇到这样的需求或者说看到类似的效果,就是列表进去详情看轮播图的时候,当手指滚动轮播图时轮...
    99+
    2023-05-14
    前端 JavaScript
  • vue下的elementui轮播图自适应高度问题
    目录elementui轮播图自适应高度elementui轮播图自适应的最简单实现效果如下拉伸一下elementui轮播图自适应高度 翻了下api 没有找到对应的属性,所以这里用自定义...
    99+
    2024-04-02
  • 如何解决layui轮播图满屏是高度自适应的问题
    小编给大家分享一下如何解决layui轮播图满屏是高度自适应的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在做官网时,遇到轮...
    99+
    2024-04-02
  • 微信小程序如何实现swiper轮播图中的图片自适应高度
    这篇文章给大家分享的是有关微信小程序如何实现swiper轮播图中的图片自适应高度的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。小程序中的轮播图很简单,官方都有例子的,但是唯一的缺...
    99+
    2024-04-02
  • 小程序如何做自适应屏幕高度
    这篇文章主要讲解了“小程序如何做自适应屏幕高度”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“小程序如何做自适应屏幕高度”吧!以前将小程序图片宽度设置为屏幕宽度:imageLoad: func...
    99+
    2023-06-26
  • Vue2x如何实现响应式自适应轮播组件插件VueSliderShow功能
    这篇文章主要为大家展示了“Vue2x如何实现响应式自适应轮播组件插件VueSliderShow功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Vue2x如何实...
    99+
    2024-04-02
  • JS如何实现DIV高度自适应窗口
    这篇文章主要为大家展示了“JS如何实现DIV高度自适应窗口”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JS如何实现DIV高度自适应窗口”这篇文章吧。具体如下:...
    99+
    2024-04-02
  • 如何解决div不能自适应高度不能随图片的高度变化问题
    本篇内容主要讲解“如何解决div不能自适应高度不能随图片的高度变化问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决div不能自适应高度不能随图片的高度...
    99+
    2024-04-02
  • 如何解决Layui表格自适应高度的问题
    这篇文章将为大家详细讲解有关如何解决Layui表格自适应高度的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在写一个项目,发现成功将数据在页面显示后, 高度没有自适应...
    99+
    2024-04-02
  • CSS实现高度自适应铺满整屏的案例
    这篇文章主要介绍CSS实现高度自适应铺满整屏的案例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在自己写demo的过程中,想使用display:flex实现垂直居中,代码如下:<style> &...
    99+
    2023-06-08
  • IE7、IE8、Firefox中如何实现DIV自动适应高度
    这篇文章将为大家详细讲解有关IE7、IE8、Firefox中如何实现DIV自动适应高度,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。DIV+CSS在IE7、...
    99+
    2024-04-02
  • CSS中如何解决父div对象自适应高度
    本篇内容介绍了“CSS中如何解决父div对象自适应高度”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!解决子...
    99+
    2024-04-02
  • css如何设置单元格的高度宽度自适应
    这篇文章给大家分享的是有关css如何设置单元格的高度宽度自适应的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 设置单元格的高度宽度自适应的方法:1、给...
    99+
    2024-04-02
  • 纯Css如何实现Div高度根据自适应宽度调整
    这篇文章将为大家详细讲解有关纯Css如何实现Div高度根据自适应宽度调整,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在如今响应式布局的要求下,很多能自动调整尺寸的元素能够做到高宽自适应,如img,通过{...
    99+
    2023-06-08
  • 实例讲解如何使用CSS3实现一个图片轮播效果
    随着互联网的发展,网页设计越来越注重用户体验。而图片轮播也成为了网页设计中常见的一种元素,特别是在商业网站中,图片轮播更成为了展示产品、品牌、活动等信息的重要方式。本文将介绍如何使用CSS3来实现一个简单的图片轮播效果。HTML结构首先,我...
    99+
    2023-05-14
  • 网页设计中如何解决iframe自适应高度的问题
    小编给大家分享一下网页设计中如何解决iframe自适应高度的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!可能有人还没接触到这个问题过,先说明一下,什么是自适...
    99+
    2023-06-08
  • 小程序 image标签 默认宽高问题,如何实现高度自适应
    微信小程序的图片image有默认的宽高:width: 320px和height: 240px, 我遇到的业务场景是宽度100%高度自适应 所以 1.宽度设置成100%,.img{width: 100%;}2.设置mode属性 mode="w...
    99+
    2023-09-29
    小程序 微信小程序
  • Html5中如何实现让容器充满屏幕高度或自适应剩余高度的布局
    小编给大家分享一下Html5中如何实现让容器充满屏幕高度或自适应剩余高度的布局,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!让容器高度充满这个屏幕在容器内容很少的...
    99+
    2023-06-09
  • 基于JS如何实现仿百度百家主页的轮播图效果
    这篇文章将为大家详细讲解有关基于JS如何实现仿百度百家主页的轮播图效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。HTML    ...
    99+
    2024-04-02
  • 如何实现左右两列自适应中间列内容即随中间内容高度自适应的布局
    本篇内容主要讲解“如何实现左右两列自适应中间列内容即随中间内容高度自适应的布局”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何实现左右两列自适应中间列内容即随...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作