记录--巧用 overflow-scroll 实现丝滑轮播图

这篇具有很好参考价值的文章主要介绍了记录--巧用 overflow-scroll 实现丝滑轮播图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

记录--巧用 overflow-scroll 实现丝滑轮播图

前言: 近期我在项目中就接到了一个完成轮播图组件的需求。最开始我也像大家一样,直接选择使用了知名的开源项目 "Swiper",但是后来发现它在移动端项目中某些测试环境下会白屏一段时间。无论如何调试都不能修复这个问题,于是就自己上手写了个轮播图组件,实现代码其实也只有 200 行,很少但是完美解决了我们项目的问题。

虽然已经 2023 年了,但是轮播图组件的实现仍然是考验前端基本功的经久不衰的题目,于是来分享一下实现思路。🎁

tips: 本文主要目的不是一上来就贴代码,而是会一步一步带你理清细节部分,即使你现在没有轮播图这个需求。

一. 使用 overflow-scroll 完成基础框架

  1. 大家在项目中肯定接触到溢出滚动的需求,其实就是用到了 overflow-auto 等相关属性。

记录--巧用 overflow-scroll 实现丝滑轮播图

  • 注意:样式方面,在这里我使用的是 UnoCSS ,将样式內联在了标签里,如果你还不了解这种写法,你可以点击下方的文章学习。不过即使你之前从未了解过 UnoCSS ,也不会影响你下面的阅读,因为样式不是本文的重点,并不影响整体阅读。
    🫱手把手教你如何创建一个代码仓库

  • 让我们快速制造一个溢出的场景来完成准备工作。其实非常简单,就是简单的创造一个容器,容器里放着三个和容器宽高相同的 div。然后给父容器一个 overflow-auto 属性,让它可以在内容溢出的时候发生滚动。

记录--巧用 overflow-scroll 实现丝滑轮播图

  1. 效果如下:
    记录--巧用 overflow-scroll 实现丝滑轮播图

二. 实现合适位置自动切换

  1. 现在我们仅仅实现了一个可以滚动的容器而已,但是轮播图最主要的事情就是用户滚动的位置不合适,那么我们也要自动调整到合适的位置显示。

  2. 更具体来讲,就是当我们拖动图片到了中间这样的位置松手时,轮播图最重要一个功能就是可以自动切换到上一张或者下一张,准确的显示合适的内容给用户。(因为展示内容区域展示一半一半的内容毫无意义嘛。)
    记录--巧用 overflow-scroll 实现丝滑轮播图

  3. 这里就需要用到两个至关重要的 CSS 属性,

    • snap-type
    • snap-align

    我们先看 snap 这个单词的意思。在这里它的意思我认为 “咔嚓一声,折断” 更符合这个属性的含义,不要着急,你可以暂时先带着这个模糊的概念来慢慢理解接下来的内容。
    记录--巧用 overflow-scroll 实现丝滑轮播图

  4. 我们先看 snap-type 是用来干什么的。
    记录--巧用 overflow-scroll 实现丝滑轮播图
    这里 MDN 的解释不是特别好懂,接下来我会用人话翻译一下它想表达的含义。

  5. 回到我们的代码部分,我们创建了一个容器 div,并且这个容器因为溢出,并且设置了 overflow-滚动 相关属性。
    记录--巧用 overflow-scroll 实现丝滑轮播图
    其实我们的 scroll-type 是用来给滚动容器的!这里特别注意,它一定是用在设置了 overflow-auto 等属性的那个元素上的。

  6. 关于属性值,我们采用 snap-type: x mandatory
    记录--巧用 overflow-scroll 实现丝滑轮播图
    在这里 x 的含义代表着横轴发生的滚动,那么聪明的你可以猜到,它也有一个 y 属性,代表着竖轴发生滚动时的设置。

  7. 这里还有一个关键字 mandatory 代表着强制的意思。因为在某些情况下,浏览器会认为用户滑到下面这种位置是自愿的,但是我们的场景是不需要考虑这种情况的,所以要告诉浏览器我们需要你帮我 “强制咔嚓折断”记录--巧用 overflow-scroll 实现丝滑轮播图

  8. 至于 proximity ,这个属性的算法有点奇怪,我也没太搞懂它的含义,不过我们的需求不需要用到这个关键字,大家有兴趣也可以自行查阅。

  9. 接下来给我们的容器设置这个属性,让我们先看看效果。
    记录--巧用 overflow-scroll 实现丝滑轮播图
    记录--巧用 overflow-scroll 实现丝滑轮播图

  10. 什么情况?怎么没效果呢?目前为止我们仅仅给容器设置了滚动的需求还是不够的,还得告诉子元素滚动到什么位置停下才行。这里就需要用到 snap-align 属性了。它是给滚动容器的子元素设置的。

  11. snap-align ,这个属性有三个值可以设置,nonecenterend
    记录--巧用 overflow-scroll 实现丝滑轮播图
    其实从这个属性的名字就可以猜到,它其实设置的是子元素的位置是相对于滚动容器的左边对齐还是右边对齐。

  12. 怎么理解呢?我们将滚动容器的宽度调大,让它可以漏出一点点其它元素的内容。并且只给数字2的元素设置 scroll-align 相关属性。(tips: 这里需要重点注意,我们只给了一个元素设置了这个属性,另外两个元素是没有设置这个属性的。)

    • snpa-align: start (元素2无论如何都会在松开鼠标的时候紧贴着滚动容的左边,也就是滚动容器的 start 位置 记录--巧用 overflow-scroll 实现丝滑轮播图

    • snap-align: center (元素2无论如何都会紧贴着滚动容器中间位置 记录--巧用 overflow-scroll 实现丝滑轮播图

    • snap-align: end (元素2的右边无论如何都会紧贴着滚动容器 记录--巧用 overflow-scroll 实现丝滑轮播图

  13. 知道了这三个属性的区别,那么接下来复原我们的容器样子,因为我们实际上轮播图的每一项的宽高和滚动容器的内容区是恰好相等的,所以我们给子元素无论设置怎样的三个值的效果都是一样的。
    记录--巧用 overflow-scroll 实现丝滑轮播图
    让我们看一下效果:
    记录--巧用 overflow-scroll 实现丝滑轮播图
    看起来效果还不错~

三. 实现上一项和下一项切换功能

  1. 我们准备两个按钮,当用户点击这两个按钮的时候,可以进行手动的切换上一张和下一张。
    记录--巧用 overflow-scroll 实现丝滑轮播图

  2. 这里我们需要用到滚动容器的 scroll 事件,需要给滚动容器绑定相对的回调函数。
    记录--巧用 overflow-scroll 实现丝滑轮播图
    这里通过 e.target 就可以拿到我们滚动容器本身。容器自身存在一个 scollLeft 属性,你需要知道一个知识点其实发生滚动的本质就是 scrollLeft 值的变化
    记录--巧用 overflow-scroll 实现丝滑轮播图
    注意观看下面滚动容器的 scrollLeft 属性值的变化。
    记录--巧用 overflow-scroll 实现丝滑轮播图

  3. 知道了这个关键点,那么我们的 prenext 函数就可以很明确的书写了。 首先通过 ref 拿到元素本身。
    记录--巧用 overflow-scroll 实现丝滑轮播图

  4. 然后在 pre 函数内部获取当前滚动元素的 scollLeft 值。
    记录--巧用 overflow-scroll 实现丝滑轮播图

  5. 紧接着,你需要知道的是,这个值即是一个可读属性,也是一个可写属性。那么我们就可以进行判断,如果当前照片不是第一张的话。,那么我就让 scrollLeft 的值 -300。这里有两个关键的知识点。

      1. 第一张对应的 scrollLeft 等于0
      1. 这里的 300 是我们写死的宽度,你可以根据后面自己的项目优化这个值。

    记录--巧用 overflow-scroll 实现丝滑轮播图

  6. 让我们看一下效果,先让我们手动滚动到第三张,然后点击上一张切换。
    记录--巧用 overflow-scroll 实现丝滑轮播图

  7. 这里好像有一点点不对劲,我们不是平缓过度到上一张的而是直接切换到上一张的,这里很简单,需要给滚动容器设置一个 scroll-behavior:smooth 即可。
    记录--巧用 overflow-scroll 实现丝滑轮播图
    我们看一下效果:
    记录--巧用 overflow-scroll 实现丝滑轮播图

  8. 下一张按钮的实现同理,这里不过多赘述,代码如下:
    记录--巧用 overflow-scroll 实现丝滑轮播图

  9. 最终的效果:
    记录--巧用 overflow-scroll 实现丝滑轮播图

四. 源码

<script setup lang="ts">
import { ref, computed } from "vue";


const box = [
  {
    number: 1,
    bg: "blue",
  },

  {
    number: 2,
    bg: "pink",
  },

  {
    number: 3,
    bg: "red",
  },
];

const containerEl = ref<HTMLDivElement>();

function scrollEvent(e: UIEvent) {
  const containerEl = e.target as HTMLDivElement;
}

// 上一张
function pre() {
  const el = containerEl.value;
  if (!el) return;

  const scrollLeft = el?.scrollLeft;

  if (scrollLeft > 0) {
    el.scrollLeft = scrollLeft - 300;
  }
}

function next() {
  const el = containerEl.value;
  if (!el) return;

  const scrollLeft = el?.scrollLeft;

  const max = (box.length - 1) * 300; //轮播图的数量 -1

  if (scrollLeft < max) {
    el.scrollLeft = scrollLeft + 300;
  }
}
</script>

<template>
  <div
    class="w-100vw h-100vh text-14px text-black flex justify-center items-center"
  >
    <div
      @click.stop="pre"
      class="w-60px h-60px rounded-full bg-black flex items-center justify-center"
    >
      <span class="text-white">上一张</span>
    </div>

    <div
      ref="containerEl"
      @scroll="scrollEvent"
      class="w-300px h-300px overflow-auto flex snap-x snap-mandatory scroll-smooth"
    >
      <div
        v-for="(item, index) in box"
        class="w-300px h-300px shrink-0 leading-300px text-center snap-center"
        :style="{ backgroundColor: item.bg }"
      >
        <span class="text-100px text-white">{{ item.number }}</span>
      </div>
    </div>

    <div
      @click="next"
      class="w-60px h-60px rounded-full bg-black flex items-center justify-center"
    >
      <span class="text-white">下一张</span>
    </div>
  </div>
</template>

本文转载于:

https://juejin.cn/post/7248655627927601207

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 记录--巧用 overflow-scroll 实现丝滑轮播图文章来源地址https://www.toymoban.com/news/detail-501012.html

到了这里,关于记录--巧用 overflow-scroll 实现丝滑轮播图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue 实现图片监听鼠标滑轮滚动实现图片缩小放大功能

    前言 其实想要实现功能很简单,就是在一张图片上监听鼠标滑轮滚动的事件,然后根据上滚还是下滚实现图片的缩放。 效果: 注:该配图使用《漫画|有趣的了解一下赋值、深浅拷贝》文章图片,不存在侵权问题。 实现思路 在js中,onmousewheel是鼠标滑轮滚动事件,可以通过

    2024年02月01日
    浏览(42)
  • vscode恢复被误删的文件(巧用本地历史记录)

      背景: (希望永远不要有这个背景)使用vscode开发项目时,新建了文件,且文件没有git add、没有git stash、没有git commit。但是不小心点中了撤销更改(新文件的撤销更改,其实就是删除该新文件),导致文件或者文件中部分代码被删除。   诉求: 找回已删除的代码片段或

    2024年02月11日
    浏览(44)
  • Pycharm通过设置实现ctrl+滚动鼠标滑轮缩放字体大小

    正常情况下,pycharm里面的字体大小需要设置才会改变,而不能直接用ctrl和鼠标滑轮来控制字体大小,这很不方便,这里和大伙分享通过设置就能利用ctrl+鼠标滑轮改变字体大小的方法。 首先,选择文件,设置  选择按键映射,然后在搜索框输入  increase,然后再增大字体大小

    2024年02月11日
    浏览(83)
  • 记录--CSS 滚动驱动动画 scroll()

    animation-timeline 通过 scroll() 指定可滚动元素与滚动轴来为容器动画提供一个匿名的 scroll progress timeline . 通过元素在顶部和底部(或左边和右边)的滚动推进 scroll progress timeline . 并且元素滚动的位置会被转换为百分比, 滚动开始被转化为 0% , 滚动结束被转化为 100% 如果 scroll() 指定

    2024年02月10日
    浏览(40)
  • unity通过脚本实现漫游功能 wasd控制玩家移动,空格跳跃,鼠标控制视野旋转,滑轮控制镜头伸缩

    将场景中的摄像机删除,在玩家的控制面板中添加Camera组件,和rigibody组件   using System.Collections; using System.Collections.Generic; using UnityEngine; public class move : MonoBehaviour {     public float speed;     Rigidbody rigid;     void Start()     {                 rigid = GetComponentRigidbody();     }  

    2024年02月10日
    浏览(33)
  • Unity2D 实现UGUI滚动鼠标滑轮以鼠标位置点为中心缩放图片

     先放参考文章: Unity3d UGUI以鼠标位置点为中心缩放图片(含项目源码) https://blog.csdn.net/qq_33789001/article/details/117749837 再放实现效果: 说说事情缘由,项目需要用到这个效果,所以上网找了个参考文章,后来不知道为什么失效了,所以想着自己改改,看看是什么毛病。 贴原

    2024年02月11日
    浏览(40)
  • 【vue-seamless-scroll bug问题记录以及解决】

    vue-seamless-scroll 的使用方式,请查看网站链接: 组件官方示例。 问题1:无法自动滚动 解决方案: ①排查limitMoveNum 函数(开始无缝滚动的数据量) 不管动态数据还是静态数据,limitMoveNum 必须小于等于 数据数组长度。若大于则不会自动滚动。 ②排查动态数据问题。 后端返回

    2024年02月16日
    浏览(32)
  • 使用overflow实现多行文本的溢出部分处理

    测试结果

    2024年02月12日
    浏览(32)
  • 巧用CountDownLatch实现多线程并行工作

    【前言】       CountDownLatch 是JDK提供的一个同步工具,它可以让一个或多个线程挂起等待,一直等到其他线程执行完成才会继续执行。常用方法有 countDown 方法和 await 方法, CountDownLatch 在初始化时,需要指定一个整数n作为计数器。当调用 countDown 方法时,计数器会被减1;

    2024年02月13日
    浏览(28)
  • Windows巧用git实现笔记自动备份

    今天突然发现,可以 使用Gitee加上Windows定时任务 实现Windows端的笔记 自动备份,多端同步,历史回溯 ,效果非常不错。下面介绍一下: 安装git:https://git-scm.com/downloads: 注册并登录gitee,本地生成ssh key(详情百度),然后添加到gitee里: 新建仓库: 填写保存的文件夹名称为

    2024年02月04日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包