纯css实现(⽆脚本)Html指令式tooltip⽂字提⽰效果
分析执⾏流程⿏标移⼊节点检测是该节点是否存在开启实现 tooltip 实现的标识(类名,属性等)检测主题、位置(类名,属性等)⽣成 / 显⽰⽓泡借鉴他⼈
css 属性选择器
让我们先来看看 element-ui的tooltip 样式
很明显,⽓泡的位置是通过 javascript脚本加上去的
不多,让我们来定⼏个期望不⽤javascript脚本,纯css 实现不⽤添加新元素**(⽤after、before伪元素)** 不⽤类名匹配,直接⽤属性选择器**([attr])** ⽀持默认样式**(标签没定义主题、位置的时候)** 指令式**(直接在标签定义即可,接下来交给css匹配)** 实现⽓泡的主题、位置⽤ sass 预处理器开发(看不懂的同学可以转换成 css ) html定义指令规范
指令式声明
<button tooltip='我是内容鸭' effect='light' placement='top-left'>上左</button>
tooltip — ⽓泡显⽰的内容;
effect — ⽓泡的主题(dark / light),默认dark;
placement — ⽓泡相对于⽗元素的位置(top / top-left/ top-right / right / right-top/ ),默认top;先写⼏个按钮
样式借鉴element-ui
<div class="container">
<div class="top">
<button tooltip="上边" placement="top-left" effect="light">上左</button>
<button tooltip="上左上左" placement="top">上边</button>
<button tooltip="上右" placement="top-right">上右</button>
</div>
<div class="left">
<button tooltip="左上左上左上左上左上左上左上左上左上左上" placement="left-top">左上</button>
<button tooltip="左边" placement="left" effect="light">左边</button>
<button tooltip="左右" placement="left-bottom">左下</button>
</div>
<div class="right">
<button tooltip="右上右上右上右上右上右上右上右上" placement="right-top">右上</button>
<button tooltip="右边" placement="right" effect="light">右边</button>
<button tooltip="右下" placement="right-bottom">右下</button>
</div>
<div class="bottom">
<button tooltip="下左下左" placement="bottom-left">下左</button>
<button tooltip="下边" placement="bottom" effect="light">下边</button>
<button tooltip="下右" placement="bottom-right">下右</button>
</div>
</div>
css核⼼代码逻辑实现
hover监听⿏标移⼊、移出,**[tooltip]**匹配有该属性的标签, after 为⽓泡, before 为三⾓形
/* 匹配有tooltip属性的元素 */
[tooltip] {
position: relative;
/
* ⽓泡默认样式 */
&::after {
display: none;
content: attr(tooltip);
}
/* 三⾓形默认样式 */
&::before {
display: none;
content: '';
}
/* ⿏标移⼊该元素,显⽰⽓泡、三⾓形 */
&:hover {
&::after {
display: block;
}
&::before {
display: block;
}
}
}
现在⿏标移⼊之后便有效果
为了⽅便看到效果,测试可以把⽓泡、三⾓形默认为block /* ⽓泡默认样式 */
&::after {
display: block;
content: attr(tooltip);
}
/* 三⾓形默认样式 */
&::before {
display: block;
content: '';
}
⽬前效果如下
设置⽓泡、三⾓形的默认样式
核⼼显⽰当然是设置绝对定位了
/* ⽓泡默认样式 */
&::after {
display: block;
content: attr(tooltip);
position: absolute;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
padding: 8px 15px;
max-width: 200px;
border-radius: 4px;
box-shadow: 0 10px 20px -5px rgba(0, 0, 0, 0.4);
z-index: 100;
@extend .tooltip-theme-dark; /* 继承默认主题(⿊底⽩字) */ }
/* 三⾓形默认样式 */
&::before {
display: block;
content: '';
position: absolute;
border: 5px solid transparent;
z-index: 100;
@extend .triangle-theme-dark; /* 继承默认主题(⿊底) */
}
⽬前效果如下
定制⽓泡、三⾓形主题⾊
定义好各两种主题
$white: #fff;
$black: #313131;
/* ⽓泡主题 */
.tooltip-theme-dark {
color: $white;
background-color: $black;
}
.tooltip-theme-light {
color: $black;
background-color: $white;
border: 1px solid $black;
}
/
* 三⾓形主题 */
.triangle-theme-dark {
border-top-color: $black;
}
.triangle-theme-light {
border-top-color: $black; /* 暂时跟dark⼀样 */
}
定制⽓泡、三⾓形位置(只⽰例⼀个⽅向)
/* ⽓泡位置 */
/*----上----*/
.tooltip-placement-top {
bottom: calc(100% + 10px);
left: 50%;
transform: translate(-50%, 0);
}
.tooltip-placement-top-right {
bottom: calc(100% + 10px);
left: 100%;
transform: translate(-100%, 0)
}
.tooltip-placement-top-left {
bottom: calc(100% + 10px);
left: 0;
transform: translate(0, 0)
}
/* 三⾓形位置 */
/*----上----*/
.triangle-placement-top {
bottom: calc(100% + 5px);
left: 50%;
transform: translate(-50%, 0);
}
.triangle-placement-top-left {
bottom: calc(100% + 5px);
left: 10px;
}
.triangle-placement-top-right {
bottom: calc(100% + 5px);
right: 10px;
}
捕捉位置、主题
这⾥也算最核⼼的代码了,⽤属性选择器来匹配标签上的值,然后设置不同的样式匹配⽓泡、三⾓形主题
&[effect="light"] {
&::after {
@extend .tooltip-theme-light;
}
&::before {
@extend .triangle-theme-light;
}
}
匹配⽓泡、三⾓形位置,12种位置
@each $placement in top,top-right,top-left,
right,right-top,right-bottom,
bottom,bottom-right,bottom-left,
left,left-top,left-bottom {
&[placement="#{$placement}"] {
&::after {
@extend .tooltip-placement-#{$placement};
}
&::before {
@extend .triangle-placement-#{$placement};
}
}
}
标签不存在placement 属性 / 为空的时候,默认继承top位置
&:not([placement]),

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。