当前位置: 首页 > news >正文

元素设置了sticky粘性布局后,关于滚动后怎么样让这个元素自动添加阴影,我用自定义指令实现

前言

在写h5或者pc站的时候,顶部总会固定一些东西。然后我们会设置顶部的容器为粘性布局固定在顶部。但滚动之后会很僵硬。例如下面这样:
在这里插入图片描述

我们看看element的表格的效果:
在这里插入图片描述

再来看看最后我们实现的效果:
在这里插入图片描述

其实网上也有纯css实现的方案,大概意思就是两个伪元素,底下是阴影,上面是一个空白,滚动的时候空白格移除就显示出了阴影。但我懒得写,突发奇想写了一个自定义指定来实现。其实实现原理很简单,思路大家都知道,无非就是监听滚动添加样式。但总不能每个页面都写吧,代码不复杂,直接分享一下:

具体实现

// 在main.js中注册该指令全局使用
app.directive('scrollShadow', (el) => {nextTick(() => {const parentScrollTop = el.parentElement.scrollTopel.style.transition = 'box-shadow 0.1s ease-in-out';if (parentScrollTop > 5) {el.style.boxShadow = '0 5px 10px rgba(0,0,0,.12)';} else {el.style.boxShadow = 'none';}})
})

在html代码中,设置好你的元素sticky相关属性之后,加上v-scrollShadow就可以生效了

<div class="container" v-scrollShadow></div>
.container{position: sticky;z-index: 1;background-color: #fff;top: 0;
}

该写法的缺陷

这个写法只能用于刚开始就在顶部的元素,对于在页面中间的元素会提前展示阴影,接下来我们解决这个问题
在这里插入图片描述

代码改进

思路就是在元素挂载的时候拿到距离顶部的距离和距离顶部多少距离sticky生效。优化后代码如下:

app.directive('scrollShadow', {mounted(el) {/** 距离顶部多少距离粘性布局生效 */const top = parseInt(getComputedStyle(el).top)/** 初始化时距离顶部距离 */const offsetTop = el.offsetTopconst updateShadow = () => {el.parentElement.addEventListener('scroll', () => {const parentScrollTop = el.parentElement.scrollTopel.style.transition = 'box-shadow 0.1s ease-in-out';const isSticky = parentScrollTop - offsetTop + top > 5el.style.boxShadow = isSticky ? '0 5px 10px rgba(0,0,0,.12)' : 'none'})}nextTick(() => {updateShadow()})},unmounted(el) {el.parentElement.removeEventListener('scroll');}
})

在这里插入图片描述

总结

在网上至今没有看过相关的实现方式,今天刷vue文档看到自定义指令突发奇想写了这么一个简单的指令,思路很简单大家可能都知道怎么实现,但论优雅,我还是选指令方式实现

相关文章:

  • 4.3 数据操作语言(DML):增删改查操作
  • 牛客网SQL进阶135 :每个6/7级用户活跃情况
  • 【c++】通过Privilege类来保护数据
  • 【layui】layer弹出图片层(开启图片旋转 放大 缩小 还原)
  • PostgreSQL常用命令,启动连接,pg_dump导入导出
  • Python模块篇(五)
  • 2408d,加@GC作为函数属性
  • Java基于数据库、乐观锁、悲观锁、Redis、Zookeeper分布式锁的简单案例实现(保姆级教程)
  • 面试题:MQ
  • seata的使用(SpringBoot项目整合seata)
  • RabbitMQ-消息队列延迟队列一
  • Dockerfile搭建LNMP
  • Linux安装jdk8,tomcat和mysql
  • 【layUI】只能选某个特定区间的日历
  • 24/8/18算法笔记 目标导向强化学习
  • [数据结构]链表的实现在PHP中
  • 345-反转字符串中的元音字母
  • CSS实用技巧干货
  • React系列之 Redux 架构模式
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • tab.js分享及浏览器兼容性问题汇总
  • Tornado学习笔记(1)
  • 初识 webpack
  • 分布式熔断降级平台aegis
  • 搞机器学习要哪些技能
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 基于遗传算法的优化问题求解
  • 日剧·日综资源集合(建议收藏)
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 微信小程序:实现悬浮返回和分享按钮
  • 硬币翻转问题,区间操作
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 带你开发类似Pokemon Go的AR游戏
  • ​configparser --- 配置文件解析器​
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ###C语言程序设计-----C语言学习(6)#
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (JS基础)String 类型
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (十八)Flink CEP 详解
  • (转)3D模板阴影原理
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (转)项目管理杂谈-我所期望的新人
  • .net core Swagger 过滤部分Api
  • .net MySql
  • @html.ActionLink的几种参数格式
  • @test注解_Spring 自定义注解你了解过吗?
  • @软考考生,这份软考高分攻略你须知道