前端改原生组件遇到的一个神奇的现象

简介: 前端改原生组件遇到的一个神奇的现象

草帽小子-蒙奇·D·路飞

image.png

前言

公司的一个 Vue2Web端的项目,项目功能完成了对应阶段目标后,给客户演示了一波,现场的客户对功能比较认可,直接提出我们做的页面太素了,整体项目的颜色比较浅,某些地方的字体可能也偏小,有些字的显示对于客户群体来讲可能看起来都有点吃力,项目使用的 Element UI 库,默认都是用的官方的主题、颜色、字体大小、比例等

演示结束后,根据反馈做了测试,项目在在笔记本上看着效果还行,在某些投屏的显示器、非高清、非超清的电脑外接显示器色彩方面的效果看着就打折扣了

接着UI设计弄了一堆修改点,共同组件封装的统一改,单独设计的页面单独改,直接来了一堆样式优化修改的需求任务

我这边接了关于 Element UI 库的输入框、选择器等原生组件的选中样式进行选中加深,然后调整边框,这么一个原生组件调整,我以为统一调整一波就行了,没想到中间出了神奇的现象

神奇的现象

日期范围,select选择器

官方的文档中日期范围的组件选中时 class 里面有 is-active 属性,失去焦点后 is-active 移除

image.png

select 选择器组件选中时 class 里面有 is-focus 属性,失去焦点后 is-focus 移除

image.png

从浏览器控制台上找到对应的元素,找到 is-activeis-focus 的地方,把那里的 css 代码直接复制过来,然后放到项目全局样式对应的位置,根据蓝湖设计图上的样式进行调整,使用 ::v-deep 直接覆盖原来的地方就行了

select选择器修改边框颜色和加深边框阴影效果

<el-select v-model="form.breed" placeholder="请选择">
  <el-option
    v-for="item in list"
    :key="item.value"
    :label="item.name"
    :value="item.id"
  >
  </el-option>
</el-select>

css 修改选中样式

::v-deep .el-select .el-input.is-focus .el-input__inner {
  border-color: #1a66ff !important;
  box-shadow: 0 0 0 1px #409eff !important;
}

上面是在单独 el-select 的调整,根据项目需求调整的最终代码如下情况,下面代码是提取到公共全局 scss 文件中的

::v-deep .el-range-editor.is-active,
.el-range-editor.is-active:hover,
.el-date-editor.is-active,
.el-date-editor.is-active:hover,
.el-select .el-input.is-focus .el-input__inner {
  border-color: #1a66ff !important;
  box-shadow: 0 0 0 1px #409eff !important;
}
::v-deep .el-select .el-input.is-focus .el-input__inner {
  border-color: #1a66ff !important;
  box-shadow: 0 0 0 1px #409eff !important;
}

简单粗暴一通操作后,调整后的效果如下,相对原来的选中效果,调整后的颜色视觉效果更明显了

image.png

在项目上测试调整后的样式效果时发现,其他的组件样式都调整了,选择年份的那个不好使,测试的几个页面其他页面的都好使,唯独那个不行,这也太神奇了吧

单独查看选择年份的 class 属性,把 el-date-editor--year 属性单独设置 is-activeis-focus 属性也不行

image.png

组件排查分析

由于项目中多人多部门协作的方式,以及大量自定义修改,项目里很可能存在代码污染的情况,直接看 element ui 库的官方示例效果,发现 选择日,其他日期单位 这里面的组件选中后没有发现 is-activeis-focusclass 属性

image.png

当前的 element ui 库的版本为 v2.15.16,根据官方的不同效果来看,官方的不同组件的选中效果在实现时使用了不同的方式

问题解决思路

既然官方没有通过 class 属性的方式来设置选中后的样式,我们是否可以尝试在项目代码中找到对应元素,手动给对应的元素添加 focus 之类的属性,以实现项目的实际需求

第一步,先修改的默认显示边框(border),能改动说明正确获取了元素

第二步,使用 ::v-deep 添加 focus 属性进行选中后样式覆盖,目标完成,直接上代码

<style lang="scss">
.el-date-editor {
  .el-input__inner:focus {
    border-color: #1a66ff !important;
    box-shadow: 0 0 0 1px #409eff !important;
  }
}
</style>

这时候年份的日期选择器的样式默认选中样式也修改好了

注意! 上面的 scss 代码是在 <style lang="scss"></style> 中实现的,没有 scoped

最终实现的效果

image.png

思考扩展

像这种更改UI库底层原生样式的时候,一定要慎重,改完的代码多测测,防止误伤其他组件样式;还有就是尽量用官方原生的属性和能力,这样代码会更简洁优雅,毕竟谁也不想在一堆 ::v-deep 里面改东西

目录
相关文章
|
1月前
|
监控 前端开发 数据可视化
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
@icraft/player-react 是 iCraft Editor 推出的 React 组件库,旨在简化3D数字孪生场景的前端集成。它支持零配置快速接入、自定义插件、丰富的事件和方法、动画控制及实时数据接入,帮助开发者轻松实现3D场景与React项目的无缝融合。
115 8
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
|
4月前
|
JavaScript 前端开发 开发者
哇塞!Vue.js 与 Web Components 携手,掀起前端组件复用风暴,震撼你的开发世界!
【8月更文挑战第30天】这段内容介绍了Vue.js和Web Components在前端开发中的优势及二者结合的可能性。Vue.js提供高效简洁的组件化开发,单个组件包含模板、脚本和样式,方便构建复杂用户界面。Web Components作为新兴技术标准,利用自定义元素、Shadow DOM等技术创建封装性强的自定义HTML元素,实现跨框架复用。结合二者,不仅增强了Web Components的逻辑和交互功能,还实现了Vue.js组件在不同框架中的复用,提高了开发效率和可维护性。未来前端开发中,这种结合将大有可为。
177 0
|
1月前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
45 0
|
1月前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
44 1
|
2月前
|
缓存 前端开发 JavaScript
前端serverless探索之组件单独部署时,利用rxjs实现业务状态与vue-react-angular等框架的响应式状态映射
本文深入探讨了如何将RxJS与Vue、React、Angular三大前端框架进行集成,通过抽象出辅助方法`useRx`和`pushPipe`,实现跨框架的状态管理。具体介绍了各框架的响应式机制,展示了如何将RxJS的Observable对象转化为框架的响应式数据,并通过示例代码演示了使用方法。此外,还讨论了全局状态源与WebComponent的部署优化,以及一些实践中的改进点。这些方法不仅简化了异步编程,还提升了代码的可读性和可维护性。
|
2月前
|
前端开发 JavaScript
CSS样式穿透技巧:利用scoped与deep实现前端组件样式隔离与穿透
CSS样式穿透技巧:利用scoped与deep实现前端组件样式隔离与穿透
254 1
|
2月前
|
前端开发 JavaScript 开发者
Web组件:一种新的前端开发范式
【10月更文挑战第9天】Web组件:一种新的前端开发范式
73 2
|
2月前
|
前端开发 JavaScript Go
前端开发趋势:从响应式设计到Web组件的探索
【10月更文挑战第1天】前端开发趋势:从响应式设计到Web组件的探索
43 3
|
3月前
|
SpringCloudAlibaba JavaScript 前端开发
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
分布式组件、nacos注册配置中心、openfegin远程调用、网关gateway、ES6脚本语言规范、vue、elementUI
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
|
4月前
|
Android开发 iOS开发 C#
Xamarin:用C#打造跨平台移动应用的终极利器——从零开始构建你的第一个iOS与Android通用App,体验前所未有的高效与便捷开发之旅
【8月更文挑战第31天】Xamarin 是一个强大的框架,允许开发者使用单一的 C# 代码库构建高性能的原生移动应用,支持 iOS、Android 和 Windows 平台。作为微软的一部分,Xamarin 充分利用了 .NET 框架的强大功能,提供了丰富的 API 和工具集,简化了跨平台移动应用开发。本文通过一个简单的示例应用介绍了如何使用 Xamarin.Forms 快速创建跨平台应用,包括设置开发环境、定义用户界面和实现按钮点击事件处理逻辑。这个示例展示了 Xamarin.Forms 的基本功能,帮助开发者提高开发效率并实现一致的用户体验。
179 0