CSS 实现带tooltip的slider
现代 CSS
强大的令人难以置信
这次我们来用 CSS
实现一个全功能的滑动输入器,也就是各大组件库都有的slider
,效果如下
还可以改变一下样式,像这样
特别是在拖动时,tooltip
还能跟随拖动的方向和速度呈现不同的倾斜角度,这些是如何通过CSS
实现的呢?一起来看看吧~
一、自定义input range
首先来看滑动输入器的最原始形态
<input type="range">
效果如下
要自定义样式,一般要修改这几个伪元素
::-webkit-slider-container{/*容器*/
}
::-webkit-slider-runnable-track{/*轨道*/
}
::-webkit-slider-thumb{/*手柄*/
}
这里可以很轻松的改变轨道的宽高,拖拽手柄的大小等等
[type="range"] {-webkit-appearance: none;appearance: none;margin: 0;outline: 0;background-color: transparent;width: 400px;overflow: hidden;height: 20px;
}
[type="range"]::-webkit-slider-runnable-track {height: 4px;background: #eee;border-radius: 4px;
}
[type="range"]::-webkit-slider-thumb {-webkit-appearance: none;appearance: none;width: 20px;height: 20px;border-radius: 50%;background-color: #9747FF;transform: translateY(-50%);margin-top: 2px;
}
效果如下
相信大家很容易做到这一步,因为只需要自定义这几个伪元素就行了。
这里还有一个难点,就是左边滑过的区域,如何也自定义颜色呢?毕竟没有专门的选择器(Firefox有,这里主要讨论Chrome),接下来请继续看
二、自定义滑过区域的颜色
在之前,曾经通过border-image
实现过类似的效果,主要原理是border-image
可以在绘制元素之外,在拖拽手柄左侧绘制一个足够长的条条就行了
不过这种实现有一个局限,由于是通过超出隐藏的方式裁剪掉多出的部分,使得滑动条边缘是“一刀切”的,无法实现圆角
有兴趣的可以回顾之前这篇文章:纯 CSS 美化滑动输入条 input range
回到这里,可以想想,要实现自定义左边滑过区域的样式,本质是需要知道当前的滑动进度,假设进度是--progress
,那么轨道滑过区域的背景色可以这样来表示
[type="range"]::-webkit-slider-runnable-track {height: 4px;background: linear-gradient(#9747FF 0 0) 0 0/calc(var(--progress) * 1%) 100% no-repeat #eee;border-radius: 4px;
}
那么,如何实时获取这个进度呢?
在以往,可以借助 JS
实时更新这样一个自定义变量,这也是目前最好的实现方式
而现在,有了更好的方式来彻底实现这样一个功能,那就是滚动驱动动画。
CSS 滚动驱动动画终于正式支持了~
有些同学可能无法理解,这里又没有滚动,怎么会和这个特性有关呢?别急,滚动驱动有两种类型,一个是 scroll()
、还有一个是view()
,我们这里要用到的就是view()
,其实也就是利用这一点来监听元素在视区的位置。
具体怎么做呢?
首先,通过@property
定义一个CSS
变量,整数类型
@property --progress {syntax: "<integer>";initial-value: 0;inherits: true;
}
然后定一个动画,从0
到100
就行了,表示进度
@keyframes slider {to {--progress: 100;}
}
由于是需要监听拖拽手柄,也就是::-webkit-slider-thumb
的位置,所以要给这个伪元素添加view-timeline
,但是我们需要通过::-webkit-slider-thumb
改变父级轨道::-webkit-slider-runnable-track
的样式,所以需要用到time-scope
(可以跨层级关联),具体实现如下
[type="range"]{timeline-scope: --slider;animation: slider linear 3s reverse;animation-timeline: --slider;
}
[type="range"]::-webkit-slider-thumb {/**/view-timeline: --slider inline;
}
这样一来,拖拽手柄的位置就通过动画实时映射到了input
上,效果如下
这样就是实现了自定义滑动区域的样式,是不是非常神奇?
三、实时显示滑动进度
由于前面实现了--progress
的实时变化,现在展示出来就比较容易了,需要用CSS
计数器
为了方便表示,我们可以单独用一个标签来展示进度,结构如下
<label class="slider"><input type="range"><output class="tooltip"></output>
</label>
然后将--progress
通过伪元素呈现出来
.tooltip::before{content: counter(num);counter-reset: num var(--progress);
}
效果如下
数字已经可以正常显示了,但是有个问题,起始点不对,不是0
和100
,我们把拖拽手柄透明度降低,可以看到进度其实是这样的
这是由于默认的animation-range
是cover
,除了这种方式,还有其他几种方式
很明显,我们这里应该需要contain
,因为滑块是始终在轨道内的
.slider{position: relative;timeline-scope: --slider;animation: slider linear 3s reverse;animation-timeline: --slider;animation-range: contain; /*设置animation-range*/
}
效果如下
这样进度就正常了
四、tooltip自动跟随滑块
首先美化一下,小三角可以用另一个伪元素实现
.tooltip{position: absolute;margin: 0 0 20px;box-shadow: 0 2px 6px rgba(0, 0, 0, 0.25);font-size: 14px;border-radius: 4px;padding: 10px;color: #f0f0f0;background-color: #333;transform-origin: center bottom;filter: drop-shadow(4px 4px 4px rgba(50, 50, 50, 0.3));
}
.tooltip::after{content: "";position: absolute;top: 100%;left: 50%;margin-left: -5px;border-width: 5px;border-style: solid;border-color: black transparent transparent transparent;
}
效果如下
那么,如何让这个tooltip
自动跟随滑块呢?
一种方式是直接通过--progress
来计算left
值
.tooltip{position: absolute;left: calc(var(--progress) * 1%);
}
不过这种计算是有偏差的,这是因为定位是相对于轨道位置的,而不是滑块中心
为了修复这个问题,我们可以给input
一个负的margin
[type="range"] {/* */margin: 0 -10px;
}
这样就可以了
不过这样还有有尺寸方面的问题的,如下
除了这种方式,还可以用锚点定位的方式实现,有兴趣可以参考之前这篇文章:CSS 锚点定位终于来了!
实现非常简单,只需要给滑块一个anchor-name
[type="range"]::-webkit-slider-thumb {/**/anchor-name: --thumb;
}
然后给tooltip
设置锚点定位
.tooltip{position: absolute;position-anchor: --thumb;inset-area: top;
}
这样就完美实现了,也不用担心定位偏差的问题
五、自动跟随拖拽方向
还有最后一个效果,可以自动跟随拖拽方向,这是如何实现的呢?其实在之前这篇文章中有详细讲解
纯 CSS 检测滚动的速度和方向
具体原理可以回顾这篇文章,这里简单介绍一下
重新定义一个CSS
变量
@property --progress2 {syntax: "<integer>";initial-value: 0;inherits: true;
}
然后给这个变量设置为--progress
,但是要给一个过渡时间
.tooltip{--progress2: var(--progress);transition: --progress2 .1s ease-out;
}
由于有过渡时间,所以这两个变量就会有一个差值,类似于这样
根据这个差值,我们不就可以知道拖动方向和速度了吗,然后给一个旋转角度
.tooltip{transform-origin: center bottom;rotate: calc((var(--progress2) - var(--progress))*2deg);
}
这样就实现了文章开头所示效果
完整代码可以查看以下链接
- CSS slider (codepen.io)')点击预览
还可以改变一下样式
[type="range"]::-webkit-slider-runnable-track {height: 20px;background: linear-gradient(#9747FF 0 0) 0 0/calc(var(--progress) * 1% + 20px * (50 - var(--progress))/100) 100% no-repeat #eee;border-radius: 24px;
}
[type="range"]::-webkit-slider-thumb {-webkit-appearance: none;appearance: none;width: 20px;height: 20px;border-radius: 50%;background-color: #fff;border: 3px solid #9747FF;view-timeline: --slider inline;anchor-name: --thumb;
}
这样可以得到下面的效果
完整代码可以查看以下链接
- CSS custom slider (codepen.io)')点击预览
六、兼容性和总结
这个实现主要依赖于滚动驱动动画,所以兼容性要求Chrome 115+
,如果需要tooltip
的锚点定位,则需要Chrome 125+
,下面总结一下
Chrome
没有专门的选择器来自定义滑过区域的样式- 通过
border-image
可以自定义滑过区域的样式,但是不能实现圆角 - 滚动驱动动画的视图滚动可以监听滑块的位置
- 通过
CSS
变量和滚动驱动动画可以将实时进度传递给轨道,从而通过线性渐变绘制滑过区域颜色 - 借助
CSS
计数器和伪元素可以将CSS
变量显示在页面
当然,不兼容的浏览器也可以采用回退措施,比如不支持滚动驱动动画,我们可以用JS来动态赋值--progress
变量,不支持锚定定位,我们可以用绝对定位,配合left
也能实现,虽然复杂一点,但也是现阶段比较好的处理方式了,剩下的就交给时间吧。
相关文章:
CSS 实现带tooltip的slider
现代 CSS 强大的令人难以置信 这次我们来用 CSS 实现一个全功能的滑动输入器,也就是各大组件库都有的slider,效果如下 还可以改变一下样式,像这样 特别是在拖动时,tooltip还能跟随拖动的方向和速度呈现不同的倾斜角度,…...
【LeetCode每日一题】——220.存在重复元素 III
文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时空频度】九【代码实现】十【提交结果】 一【题目类别】 数组 二【题目难度】 困难 三【题目编号】 220.存在重复元素 III 四【题目描述】 给你一个…...
Git命令
目录 一、创建版本库 二、pwd 命令是用于显示当前的目录 三、通过命令 git init 把这个目录变成git可以管理的仓库 四、ll 五、添加文件和修改提交文件 1.创建文件test.txt --- 此刻文件在工作区(WorkSpace) 2.使用命令 git add test.txt添加到暂…...
2024第十六届蓝桥杯模拟赛(第二期)-Python
# 2024第十六届蓝桥杯模拟赛(第二期)-Python题解 # 自己改注释# -----------------------1------------------------ # def prime(x): # if x < 2: # return 0 # for i in range(2, int(x ** 0.5) 1): # if x % i 0: # …...
数据结构:Win32 API详解
目录 一.Win32 API的介绍 二.控制台程序(Console)与COORD 1..控制台程序(Console): 2.控制台窗口坐标COORD: 3.GetStdHandle函数: (1)语法: (2)参数: 4.GetConsoleCursorInf…...
Hive-4.0.1数据库搭建(可选配置用户名密码远程连接,涵盖切换为tez引擎)
一、hive搭建(所依赖的Hadoop集群参照文章:最新版hadoop-3.4.0集群安装和配置(目前论坛的都是老古董了,看我的准没错!!!)这里以三台服务器为例_hadoop 3.4安装-CSDN博客)…...
【从零开始入门unity游戏开发之——C#篇13】命名规范——驼峰命名法和帕斯卡命名法,函数(方法)的使用介绍
文章目录 一、命名规范1、**驼峰命名法(Camel Case)**用途: 2、**帕斯卡命名法(Pascal Case)**用途: 3、**C# 中命名约定的最佳实践**3.1 **类、结构体、接口、枚举、委托**3.2 **方法、属性、事件**3.3 **…...
Android 写排行榜,顶部前三
activity_step_rank.xml <?xml version"1.0" encoding"UTF-8"?> <FrameLayout android:layout_height"match_parent" android:layout_width"match_parent" android:id"id/fragment_parent" android:orientation…...
sql server一些冷知识
1. Sql Server冷知识 (1) 删除表内容的方法 truncate table 表名 (清除表记录,这个快) (2) 列出所有数据库 sp_redatabases (3) 存储过程的参数命名 参数一定要以开头&am…...
【功能安全】随机硬件失效导致违背安全目标的评估(FMEDA)
目录 01 随机硬件失效介绍 02 FMEDA介绍 03 FMEDA模板 01 随机硬件失效介绍 GBT 34590 part5...
【Qt】信号、槽
目录 一、信号和槽的基本概念 二、connect函数:关联信号和槽 例子: 三、自定义信号和槽 1.自定义槽函数 2.自定义信号函数 例子: 四、带参的信号和槽 例子: 五、Q_OBJECT宏 六、断开信号和槽的连接 例子: …...
二叉树、平衡二叉树、红黑树、BTree、B+Tree的区别
一、二叉查找树 二叉树具有以下性质:左子树的键值小于根的键值,右子树的键值大于根的键值。 如下图所示就是一棵二叉查找树, 对该二叉树的节点进行查找发现深度为1的节点的查找次数为1,深度为2的查找次数为2,深度为n…...
【Rust自学】3.1. 变量与可变性
3.1.0. 写在正文之前 欢迎来到Rust自学的第三章,一共有6个小节,分别是: 变量与可变性(本文)数据类型:标量类型数据类型:复合类型函数和注释控制流:if else控制流:循环 通过第二章…...
如何使用生成式AI实现跨领域内容生成
文章目录 引言生成式AI的基本概念定义与分类技术发展现状 跨领域内容生成的技术实现数据准备模型选择与设计训练策略 应用案例分析教育培训新闻媒体文化创意产业 实践建议确定明确的目标构建合适的团队持续迭代改进遵守法律法规 结论 引言 在当今数字化时代,信息的…...
ubuntu无网络图标无法上网解决方案
1.打开/etc/resolv.conf,在其中添加需要配置的DNS地址,根据自己的电脑情况配置IP和网关 # interfaces(5) file used by ifup(8) and ifdown(8) auto lo iface lo inet loopback#网卡2,双网卡的话eth0、eth1 auto eth1 iface eth1 inet stat…...
手写Redis分布式锁+RedisUtil二次封装
文章目录 1.手写Redis分布式锁1.RedisShareLockUtil2.使用方式 2.RedisUtil二次封装1.RedisUtil2.使用案例 1.手写Redis分布式锁 1.RedisShareLockUtil package com.sunxiansheng.redis.util;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springfra…...
APP测试中ios和androis的区别,有哪些注意点
一、运行机制不同 IOS采用的是沙盒运行机制,安卓采用的是虚拟机运行机制。 1、沙盒机制: 概念:沙盒是一种安全机制,用于防止不同应用之间互相访问 作用:就是存储数据,每个沙盒就相当于每个每个应用的系…...
Qt编译MySQL数据库驱动
目录 Qt编译MySQL数据库驱动 测试程序 Qt编译MySQL数据库驱动 (1)先找到MySQL安装路径以及Qt安装路径 C:\Program Files\MySQL\MySQL Server 8.0 D:\qt\5.12.12 (2)在D:\qt\5.12.12\Src\qtbase\src\plugins\sqldrivers\mysql下…...
Springboot中使用Retrofit
Retrofit官网 https://square.github.io/retrofit/ 配置gradle implementation("com.squareup.okhttp3:okhttp:4.12.0")implementation ("com.squareup.retrofit2:retrofit:2.11.0")implementation ("com.squareup.retrofit2:converter-gson:2.11.0…...
字体子集化实践探索
最近项目rust生成PDF组件printpdf需要内嵌完整字体导致生成的PDF很大,需要做压缩,但是rust的类库allsorts::subset::subset不支持windows,所以做了一些windows下字体子集化的尝试 方案一:node.js做子集化 fontmin 缺点是也需要集…...
统计一个目录下的文件及目录数量-linux010
要统计一个目录下的文件数量(包括子目录中的文件),可以使用以下命令: 1. 统计所有文件数量(包括子目录) 在终端中运行以下命令: find /path/to/directory -type f | wc -l 解释:…...
【计算机网络】期末考试预习复习|上
作业讲解 物理层作业 共有4个用户进行CDMA通信。这4个用户的码片序列为: A: (–1 –1 –1 1 1 –1 1 1);B: (–1 –1 1 –1 1 1 1 –1) C: (–1 1 –1 1 1 1 –1 –1);D: (–1 1 –1 –1 –1 –1 1 –1) 现收到码片序列:(–1 1 –…...
构建一个rust生产应用读书笔记四(实战3)
从这一节开始,我们将继续完善邮件订阅生产级应用,根据作者的选型sqlx作为数据库操作的类库,它有如下优点: 它旨在提供高效、安全且易于使用的数据库交互体验。sqlx 支持多种数据库,包括 PostgreSQL、MySQL 和 SQLite&…...
idea无法识别文件,如何把floder文件恢复成model
前景: 昨天,我在之前的A1214模块包下新增了一个demo类,然后又新建了一个A1216模块,写了算法题,后面打算用git提交,发现之前的A1214模块下的demo类和新建的模块源文件都已经被追踪了,都是绿色的&…...
更新数据时Redis的操作
一般做法是在数据库更新后删除Redis中对应的缓存数据,而非更新数据。那么为什么要这么做呢? 以下是一些拙见 场景使用 金融交易系统:在金融领域,数据的准确性至关重要。任何数据不一致都可能导致严重的财务损失。因此࿰…...
Flink CDC 读取oracle库数据性能优化
通过综合考虑Oracle数据库配置、Flink作业配置以及其他优化措施,可以显著提升Flink CDC读取Oracle库数据的性能和效率。可以从以下几个方面进行: 一、Oracle数据库配置优化 开启归档日志: 通过执行sqlplus /assysdba或sqlplus/nolog命令…...
学习记录:js算法(一百二十三):不同路径 II
文章目录 不同路径 II思路一 不同路径 II 给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角(即 grid[0][0])。机器人尝试移动到 右下角(即 grid[m - 1][n - 1])。机器人每次只能向下或者向右移动一步。 网格中的障碍物…...
mybatis 的动态sql 和缓存
动态SQL 可以根据具体的参数条件,来对SQL语句进行动态拼接。 比如在以前的开发中,由于不确定查询参数是否存在,许多人会使用类似于where 1 1 来作为前缀,然后后面用AND 拼接要查询的参数,这样,就算要查询…...
You need to call SQLitePCL.raw.SetProvider()
在.NET环境中使用Entity Framework Core(EF Core)连接SQLite数据库时,报错。 使用框架 .NET8 错误信息: Exception: You need to call SQLitePCL.raw.SetProvider(). If you are using a bundle package, this is done by calling…...
MYSQL执行一条update语句,期间发生了什么
客户端先通过连接器建立连接,连接器自会判断用户身份; 因为这是一条 update 语句,所以不需要经过查询缓存,但是表上有更新语句,是会把整个表的查询缓存清空的,所以说查询缓存很鸡肋,在 MySQL 8…...
《安全工程师自我防护指南:直面数字威胁的有效策略与实践》
一、法律层面的保护 获取授权 在对目标系统进行任何测试之前,确保已经获得了合法的授权。这可以是来自目标组织(如企业的信息安全部门)的书面授权或者合同协议。例如,一家公司聘请外部安全团队来测试其网络安全防御能力ÿ…...
SpringBoot2+Vue2开发工作管理系统
项目介绍 在工作中使用的管理系统,可以随手记录一些笔记、可以汇总一些常用网站的链接、可以管理自己负责的项目、可以记录每日日报和查看历史日报、可以记录加班情况、可以记录报销内容、可以编写文章文档。 系统功能 我的笔记快捷入口项目管理今日日报我的日报…...
华为HarmonyOS实现跨多个子系统融合的场景化服务 -- 7 地图选点Button
场景介绍 本章节将向您介绍如何使用地图选点Button功能,开发者可调用Button组件拉起Map Kit的地图选点页面,用户在地图中选择位置后,位置相关信息返回Button界面。 说明 该场景暂不支持2in1设备。 前提条件 参见开发准备。 效果图展示 …...
Web项目图片视频加载缓慢/首屏加载白屏
Web项目图片视频加载缓慢/首屏加载白屏 文章目录 Web项目图片视频加载缓慢/首屏加载白屏一、原因二、 解决方案2.1、 图片和视频的优化2.1.1、压缩图片或视频2.1.2、 选择合适的图片或视频格式2.1.3、 使用图片或视频 CDN 加速2.1.4、Nginx中开启gzip 三、压缩工具推荐 一、原因…...
Java系统对接企业微信审批项目流程
若依做的一个系统需求需要对接企业微信的人员去审核订单 回款之类,以下是详细步骤. 1.首先登入企业微信管理后台: 企业微信 2.找到应用管理 3.自建一个应用 4.这些数据都可以拿到 5.配置可信Ip 6.进入有两种方法让你去配置 ,第一种用公司的…...
MacOS 命令行详解使用教程
本章讲述MacOs命令行详解的使用教程,感谢大家观看。 本人博客:如烟花般绚烂却又稍纵即逝的主页 MacOs命令行前言: 在 macOS 上,Terminal(终端) 是一个功能强大的工具,它允许用户通过命令行直接与系统交互。本教程将详细介绍 macOS…...
易语言鼠标轨迹算法(游戏防检测算法)
一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…...
java-使用druid sqlparser将SQL DDL脚本转化为自定义的java对象
java-使用druid sqlparser将SQL DDL脚本转化为自定义的java对象 一、引言二、环境三、待解析的DDL四、解析后的对象结构五、完整的UT类六、控制台输出总结 一、引言 在日常开发中,有些需要对SQL进行解析的场景,比如读取表结构信息,生成文档、…...
靜態IP與DHCP的區別和用法
IP地址可以是靜態的,即固定不變,也可以是動態的,定期更改或每次連接後更改。 什麼是靜態 IP? 靜態IP地址是固定的,手動分配的IP地址,不會隨時間而變化。分配後,此 IP 保持不變,並由…...
【C#】Debug和Release的区别和使用
在 C 或 C# 开发中,Debug 和 Release 是两种不同的编译配置,主要用于开发过程中的不同阶段。它们的主要区别如下: 1. Debug 版本 Debug 版本是为了开发和调试程序而优化的构建模式。 特点: 包含调试信息: Debug 版本…...
Element plus 下拉框组件选中一个选项后显示的是 value 而不是 label
最近刚进行 Vue3 Element plus 项目实践,在进行表单二次封装的时候,表单元素 select 下拉框组件选中一个选项后显示的是 value 而不是 label,下面上代码: 原来的写法: <el-selectv-if"v.type select"…...
Redis - 消息队列 Stream
一、概述 消息队列 定义 消息队列模型:一种分布式系统中的消息传递方案,由消息队列、生产者和消费者组成消息队列:负责存储和管理消息的中间件,也称为消息代理(Message Broker)生产者:负责 产…...
【多维DP】【hard】力扣1269. 停在原地的方案数
有一个长度为 arrLen 的数组,开始有一个指针在索引 0 处。 每一步操作中,你可以将指针向左或向右移动 1 步,或者停在原地(指针不能被移动到数组范围外)。 给你两个整数 steps 和 arrLen ,请你计算并返回&…...
Android显示系统(11)- 向SurfaceFlinger申请Surface
Android显示系统(01)- 架构分析 Android显示系统(02)- OpenGL ES - 概述 Android显示系统(03)- OpenGL ES - GLSurfaceView的使用 Android显示系统(04)- OpenGL ES - Shader绘制三角…...
OpenCV实验篇:识别图片颜色并绘制轮廓
第三篇:识别图片颜色并绘制轮廓 1. 实验原理 颜色识别的原理: 颜色在图像处理中通常使用 HSV 空间来表示。 HSV 空间是基于人类视觉系统的一种颜色模型,其中: H(Hue):色调,表示颜色…...
鸿蒙-应用内悬浮窗
//悬浮窗工具类 import { window } from kit.ArkUI; import { BusinessError } from kit.BasicServicesKit; import { Logger } from mbbase/common-ui; import * as FloatedWindowPage from ./FloatedWindowPage; // 导入命名路由页面 const TAG [FloatedWindowUtils]; ex…...
Ubuntu Linux操作系统
一、Ubuntu简介 Ubuntu Linux是由南非人马克沙特尔沃思(Mark Shuttleworth)创办的基于Debian Linux的操作系统,于2004年10月公布。Ubuntu是一个以桌面应用为主的Linux发行版操作系统。Ubuntu拥有庞大的社区力量,用户可以方便地从社区获得帮助。其官方网…...
Linux下SVN客户端保存账号密码
参考文章:解决:Linux上SVN 1.12版本以上无法直接存储明文密码_linux svn 保存密码-CSDN博客新版本svn使用gpg-agent存储密码-CSDN博客svn之无法让 SVN 存储密码,即使配置设置为允许_编程设计_ITGUEST 方法一:明文方式保存密码 首…...
【DBeaver】连接带kerberos的hive[Apache|HDP]
目录 一、安装配置Kerberos客户端环境 1.1 安装Kerberos客户端 1.2 环境配置 二、基于Cloudera驱动创建连接 三、基于Hive原生驱动创建连接 一、安装配置Kerberos客户端环境 1.1 安装Kerberos客户端 在Kerberos官网下载,地址如下:https://web.mit.edu/kerberos…...
Android-Glide详解
目录 一,介绍 二,使用 三,源码分析思路 四,with源码分析 五,模拟Glide生命周期管理 一,介绍 Glide目前是安卓最主流的加载图片的框架,也是源码最为复杂的框架之一。 要想完完全全吃透Glide的源…...