iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >CSS如何实现渐变提示框
  • 847
分享到

CSS如何实现渐变提示框

2024-04-02 19:04:59 847人浏览 薄情痞子
摘要

这篇文章主要讲解了“CSS如何实现渐变提示框”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CSS如何实现渐变提示框”吧!今天来看一种十分常见的交互:提示框(

这篇文章主要讲解了“CSS如何实现渐变提示框”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CSS如何实现渐变提示框”吧!

今天来看一种十分常见的交互:提示框(tooltips)。通常提示框都是纯色的,比如下面这个

CSS如何实现渐变提示框

这类布局实现还不算复杂,可以用一个圆角矩形和一个小三角拼接形成,设置相同的颜色就可以了

CSS如何实现渐变提示框

这个并不是本文的重点,有兴趣的可以访问 css-tips (codepen.io)

https://codepen.io/xboxyan/pen/MLJjWQ

有时候,为了突出强调产品的特点或者为了跟随设计的潮流,设计会用上渐变背景,比如 lulu UI Edge 版本中的 Tips 组件

CSS如何实现渐变提示框

如果仍然采用“拼接”的方式,不可避免会出现衔接不上的问题,有明显的“割裂”感,视觉还原会大打折扣

CSS如何实现渐变提示框

那么,如何实现这类效果呢?一起来看看吧

一、clip-path 裁剪

clip-path 可能是很多人马上就能想到的方式。但是实际操作下来,还是会遇到很多麻烦

  • clip-path: path 可以支持任意形状,但是却没法实现自适应宽高

  • clip-path: polygon 可以实现小尖角,但是无法实现圆角

  • clip-path: inset 可以实现自适应圆角矩形,但是无法实现下方的小尖角

如何解决这个问题呢?其实把 2 和 3 结合起来就可以了

这里需要两个相同大小的容器,可以用 ::before::after 来代替,然后设置相同的背景色,可以通过自定义属性定义

.tips{
   position: relative;
   --bg: linear-gradient(45deg, #ff3c41, #ff9800);
}
.tips::before,.tips::after{
  content:'';
  position: absolute;
  width: 100%;
  height: 100%;
  left: 0;
  top: 0;
  background: var(--bg);
  z-index: -1;
}

为什么要用两个相同大小的容器呢? 这是为了保证接下来渐变背景在裁剪时完全吻合

CSS如何实现渐变提示框

接着其中一个裁剪成圆角矩形,另外一个裁剪成小三角,然后重叠起来就可以了

.tips::before{
  clip-path: inset(0 0 5px 0 round 5px);
  
}
.tips::after{
  clip-path: polyGon(calc(50% - 5px) calc(100% - 5px), calc(50% + 5px) calc(100% - 5px), 50% 100%);
  
}

可以看到提示框完全是自适应的,实时效果如下

CSS如何实现渐变提示框

完整代码可访问 tooltips-clip-path (codepen.io)

Https://codepen.io/xboxyan/pen/ExWLyKR

二、mask 遮罩

除了 clip-pathmask 也是一种思路。如果还不熟悉 mask,可以参考这一篇

奇妙的 CSS MASK (juejin.im)

https://juejin.cn/post/6846687594693001223

这里的原理如下

CSS如何实现渐变提示框

利用 mask ,现在的问题就转变成了:如何通过 CSS 绘制这样一个图形?

CSS如何实现渐变提示框

1. 万能的 gradient

没有什么图形是 CSS 渐变 绘制不出来的,这个也不例外。首先我们把这个图形进行分解,这里可以分成一个圆角矩形和一个三角形,三角形比较容易,可以通过 conic-gradient 或者 linear-gradient 绘制

CSS如何实现渐变提示框

圆角矩形就稍微有点麻烦了,不过还是可以分解的,如下

CSS如何实现渐变提示框

可以由4个径向渐变和2个线性渐变合成,用代码实现就是

tips{
  -WEBkit-mask-image: 
    
    radial-gradient(circle at 5px 5px, green 5px,transparent 0),
    radial-gradient(circle at 5px 5px, green 5px,transparent 0),
    radial-gradient(circle at 5px 5px, green 5px,transparent 0),
    radial-gradient(circle at 5px 5px, green 5px,transparent 0),
    linear-gradient(red,red),
    linear-gradient(blue,blue);
  -webkit-mask-size:
    10px 10px,
      10px 10px,
    10px 10px,
    10px 10px,
    100% calc(100% - 15px),
    calc(100% - 10px) calc(100% - 5px)
  -webkit-mask-position:
    left top,
    right top,
    left 0 bottom 5px,
    right 0 bottom 5px,
    left 5px,
    5px top;
  -webkit-mask-repeat: no-repeat
}

只要有点耐心,都可以很顺利的写出来

但是...

太长了,有很多重复的(4个radial-gradient),非常啰嗦,有没有什么办法优化呢?这里有一个技巧,碰到重复有规律的东西,可以多想想 repeat,利用背景的平铺特性,合理设置背景尺寸就可以了,如下

CSS如何实现渐变提示框

可以看到,背景尺寸设置成 calc(100% - 10px) 就可以达到平铺效果,代码实现就是

tips{
  -webkit-mask-image: 
    
    radial-gradient(circle at 5px 5px, green 5px,transparent 0),
    linear-gradient(red,red),
    linear-gradient(blue,blue);
  -webkit-mask-size:
    calc(100% - 10px) calc(100% - 15px),
    100% calc(100% - 15px),
    calc(100% - 10px) calc(100% - 5px);
  -webkit-mask-position:
    left top,
    left 5px,
    5px top;
  -webkit-mask-repeat: repeat,no-repeat,no-repeat;
}

是不是精简了许多?然后再把三角形的合过来就行了,可以得到如下效果

CSS如何实现渐变提示框

完整代码可访问 tooltips-mask-gradient (codepen.io)

https://codepen.io/xboxyan/pen/KKWRWOj

2. 自适应的svg

尽管做了一些优化,上面的代码量仍然非常可观,有没有更加简便的方式呢?

想到了 svg...

一般情况下,svg 路径是固定尺寸的,只能 等比缩放 ,无法做到自适应。不过基本图形是支持自适应的,可以设置百分比尺寸,比如 <rect>

<svg xmlns='http://www.w3.org/2000/svg' width='100%' height='100%'>
   <rect rx="5" width='100%' height='100%'/>
</svg>

rx 可以设置矩形的圆角,当不设置 ry 时,默认与 rx  相同

这样一个 svg 是可以自适应的,在改变尺寸的情况下不会变形(注意观察圆角),如下

CSS如何实现渐变提示框

三角形就很容易了,可以用 <polygon> 实现

<svg xmlns='http://www.w3.org/2000/svg'>
  <polygon points='0 0,10 0,5 5' />
</svg>

然后,把两段 svg 直接用作遮罩背景就行了,可以用 mask-size 和 mask-position 分别设置 尺寸位置

tips{
  -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'><polygon points='0 0,10 0,5 5' /></svg>"),url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'><rect rx='6' width='100%' height='100%'/></svg>");
  -webkit-mask-size: 10px 5px, 100% calc(100% - 5px);
  -webkit-mask-repeat: no-repeat;
  -webkit-mask-position: center bottom, 0 0;
}

svg 用作背景需要在前面添加 data:image/svg+xml ,并且内容需要转义,详细可参考这篇文章:

学习了,CSS中内联SVG图片有比Base64更好的形式

https://www.zhangxinxu.com/Wordpress/2018/08/css-svg-background-image-base64-encode/

还是挺不错的,代码量也不多,也比较容易理解,实时效果如下

CSS如何实现渐变提示框

完整代码可访问 tooltips-mask-svg (codepen.io)

https://codepen.io/xboxyan/pen/poeVrqB

三、paint 绘制

再来介绍一种未来的解决方式, CSS paint 。关于 CSS paint,又称 “CSS 界的绘图板”,简单来说,就是用 canvas 绘图的方式来绘制背景,canvas 几乎什么都能绘制吧,所以这是一种更为通用的解决方案。想快速了解  CSS paint 的可以参考这一篇入门文章:

CSS届的绘图板CSS Paint api简介

https://www.zhangxinxu.com/wordpress/2018/11/css-paint-api-canvas/

不过目前仅支持 Chrome,兼容性如下

CSS如何实现渐变提示框

不过并不影响我们的学习,毕竟是未来的解决方案,先看看大致的语法,如下

1、首先,js 注册模块 registerPaint

// paint-tips.js
reGISterPaint('tips-bg', class {
    paint(ctx, size, properties) {
       // 在这里绘制背景,语法和canvas类似
    }
});

2、接着,JS 添加模块 CSS.paintWorklet.addModule

if (window.CSS) {
    CSS.paintWorklet.addModule('paint-tips.js');
}

3、最后,CSS 中使用 paint(tips-bg)

tips{
  -webkit-mask-image: paint(tips-bg); 
}

下面就来绘制提示框了,如果仍然借助 mask ,那么问题就变成了:如何通过 canvas 绘制这样一个图形?

CSS如何实现渐变提示框

在 canvas 中,相对于 CSS 来说, 这类图形简直就是小儿科,只需要使用 lineToarc 两个指令就可以绘制了。最关键的一点是,这里的尺寸是实时渲染的,可以通过 size 来获取

关于 canvas 学习,这里推荐一下张鑫旭老师的 Canvas API中文文档,api 和 案例比 mdn 文档清晰太多

https://www.canvasapi.cn/

绘制代码如下(下面就是很普通的 canvas 代码了,其实就是几段线段连接起来,然后填充纯色)

registerPaint('tips-bg', class {
    paint(ctx, size) { // ctx为绘制上下文,size为容器尺寸
      const { width,height } = size; // 容器尺寸
      const radius = 5; // 圆角大小
      const deg = Math.PI / 2;
      const edge = 5; // 三角形大小
      const pos = width / 2; // 三角形位置
      ctx.beginPath();
      ctx.moveTo(radius,0);
      ctx.lineTo(width-2*radius,0);
      ctx.arc(width-radius,radius,radius,-deg,0);
      ctx.lineTo(width,height-2*radius-edge);
      ctx.arc(width-radius,height-radius-edge,radius,0,deg);
      ctx.lineTo(pos+edge,height-edge);
      ctx.lineTo(pos,height);
      ctx.lineTo(pos-edge,height-edge);
      ctx.lineTo(radius,height-edge);
      ctx.arc(radius,height-radius-edge,radius,deg,2*deg);
      ctx.lineTo(0,radius-edge);
      ctx.arc(radius,radius,radius,-2*deg,-deg);
      ctx.closePath();
      ctx.fillStyle = '#000';
      ctx.fill();
   }
});

实时效果如下

CSS如何实现渐变提示框

完整代码可访问 tooltips-mask-paint (codepen.io)

https://codepen.io/xboxyan/pen/JjWvxEN

另外,也可以通过 CSS 变量进行自定义,比如定义一个--r为圆角大小,--t为三角形大小

<tips style="--r:5;--t:5"></tips>
registerPaint('tips-bg', class {
  static get inputProperties() { // 定义允许的自定义属性
    return [
      '--r',
      '--t'
    ]
  }
  paint(ctx, size, properties) { // properties为自定义属性
    const radius = Number(properties.get('--r'));
    const edge = Number(properties.get('--t'));
    // ...
  }
})

可以看到绘制是实时更新的(改变圆角),无需 JS 额外处理,实时效果如下

CSS如何实现渐变提示框

完整代码可访问 tooltips-mask-paint-var (codepen.io)

https://codepen.io/xboxyan/pen/JjWvVMd

四、描边效果

有时候提示框可能还会有描边的效果,比如这样的

CSS如何实现渐变提示框

这类带描边的其实以上方式都不太适用,clip-pathmask 都无法实现描边,不过有一个边框生成方案可以参考:

有意思!不规则边框的生成方案 (juejin.cn)

https://juejin.cn/post/6944892753402822686

可惜效果不是特别完美(略微模糊)

如果尺寸固定,那么可以直接使用 svg 方式,参考这篇文章:

用SVG实现一个优雅的提示框 (juejin.cn)

https://juejin.cn/post/6926353919333531661

就目前而言,确实没有比较好的实现方案(有更好的实现方式欢迎补充,我暂时想不出来了),不过如果借助 CSS paint ,那一切就都有可能了!只需要在 paint 函数中绘制边框和背景就行了

绘制代码如下

registerPaint('tips-bg', class {
    paint(ctx, size) {
      const { width,height } = size; // 容器尺寸
      const radius = 5; // 圆角大小
      const deg = Math.PI / 2;
      const edge = 5; // 三角形大小
      const pos = width / 2; // 三角形位置
      const lineWidth = 2; // 描边宽度
      ctx.beginPath();
      ctx.moveTo(radius+lineWidth,lineWidth);
      ctx.lineTo(width-2*radius-lineWidth,lineWidth);
      ctx.arc(width-radius-lineWidth,radius+lineWidth,radius,-deg,0);
      ctx.lineTo(width-lineWidth,height-2*radius-edge-lineWidth);
      ctx.arc(width-radius-lineWidth,height-radius-edge-lineWidth,radius,0,deg);
      ctx.lineTo(pos+edge,height-edge-lineWidth);
      ctx.lineTo(pos,height-lineWidth);
      ctx.lineTo(pos-edge,height-edge-lineWidth);
      ctx.lineTo(radius+lineWidth,height-edge-lineWidth);
      ctx.arc(radius+lineWidth,height-radius-edge-lineWidth,radius,deg,2*deg);
      ctx.lineTo(lineWidth,radius+lineWidth);
      ctx.arc(radius+lineWidth,radius+lineWidth,radius,-2*deg,-deg);
      ctx.closePath();
      const gradient = ctx.createLinearGradient(0, 0, width, 0); // 渐变背景
      gradient.addColorStop(0, '#F57853');
      gradient.addColorStop(1, '#F8B578');
      ctx.fillStyle = gradient; 
      ctx.fill();
      ctx.strokeStyle = '#FBF8F8'; // 绘制边框
      ctx.lineWidth = lineWidth;
      ctx.lineCap = 'round';
      ctx.stroke();
   }
});
tips{
  
  background: paint(tips-bg); 
}

实时效果如下

CSS如何实现渐变提示框

完整代码可访问 tooltips-paint-stroke (codepen.io)

https://codepen.io/xboxyan/pen/QWpxdVp

五、总结和说明

以上针对 tooltips 布局共介绍了3种不同类型的实现方式,分别是 clip-pathmaskCSS paint。其中 mask 的实现重点其实是CSS图形的绘制,主要有 渐变svg 两种,虽然 渐变 的写法稍微复杂一点,但是最为通用,其他方式可能换一种布局就不适用了。现在总结一下要点:

  • 可以用多个容器重叠配合 clip-path 实现复杂的自适应效果

  • 在使用 CSS 渐变绘制图形时,相同的形状充分利用平铺特性

  • svg 基本形状支持百分比尺寸,用作背景同样有效,可以使用多张背景来组合

  • CSS paint 是未来的最佳解决方式,也能轻易的实现描边效果

  • CSS paint 唯一的缺陷是兼容性不够好(现仅支持 Chrome 65+ ),但是值得学习

当然,这些方式不仅仅是实现本文的布局而已,更多的是提供一种思路,下次碰到其他的“异形布局”也能马上联想出相应的解决方案,而不是选择“切图.png”

感谢各位的阅读,以上就是“CSS如何实现渐变提示框”的内容了,经过本文的学习后,相信大家对CSS如何实现渐变提示框这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: CSS如何实现渐变提示框

本文链接: https://www.lsjlt.com/news/73161.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • CSS如何实现渐变提示框
    这篇文章主要讲解了“CSS如何实现渐变提示框”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CSS如何实现渐变提示框”吧!今天来看一种十分常见的交互:提示框(...
    99+
    2024-04-02
  • CSS如何实现渐变
    这篇文章将为大家详细讲解有关CSS如何实现渐变,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、线性渐变这里需要大家先去看一下基本语法,再看接下来的例子。linear-g...
    99+
    2024-04-02
  • CSS如何实现渐变效果
    这篇文章主要介绍CSS如何实现渐变效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!线性渐变( linear-gradient )background-image: linear-gradient(to&n...
    99+
    2023-06-08
  • CSS代码如何实现提示框
    这篇“CSS代码如何实现提示框”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“CSS代码如何实现提示框”文章吧。需求:有时加载...
    99+
    2023-07-04
  • 上下渐变的css如何实现
    小编给大家分享一下上下渐变的css如何实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 在css中...
    99+
    2024-04-02
  • css中颜色渐变如何实现
    小编给大家分享一下css中颜色渐变如何实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!   一、LinearGradient...
    99+
    2024-04-02
  • css如何实现不透明度渐变
    这篇文章主要介绍“css如何实现不透明度渐变”,在日常操作中,相信很多人在css如何实现不透明度渐变问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”css如何实现不透明度渐变”...
    99+
    2024-04-02
  • 纯CSS如何实现文字渐变色
    这篇文章给大家分享的是有关纯CSS如何实现文字渐变色的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是csscss是一种用来表现HTML或XML等文件样式的计算机语言,主要是用来设计网页的样式,使网页更加美化。...
    99+
    2023-06-14
  • css如何使用伪元素和平移变换实现提示框
    这篇文章给大家分享的是有关css如何使用伪元素和平移变换实现提示框的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。伪元素和平移(translate)变换实现的提示框 &l...
    99+
    2024-04-02
  • 利用CSS如何创建渐变色边框
    这篇文章将为大家详细讲解有关利用CSS如何创建渐变色边框,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。给 border 设置渐变色是很常见的效果,实现这个效果有很多思路,...
    99+
    2024-04-02
  • css如何实现背景颜色线性渐变和径向渐变效果
    这篇文章主要介绍了css如何实现背景颜色线性渐变和径向渐变效果的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇css如何实现背景颜色线性渐变和径向渐变效果文章都会有所收获,下面我们一起来看看吧。一、线性渐变(li...
    99+
    2023-07-05
  • CSS中如何实现线性渐变效果
    本文小编为大家详细介绍“CSS中如何实现线性渐变效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“CSS中如何实现线性渐变效果”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。li...
    99+
    2024-04-02
  • CSS属性实现渐变边框效果的技巧
    CSS属性实现渐变边框效果的技巧,需要具体代码示例在网页设计中,边框是一个重要的元素,能够为页面带来更加丰富的视觉效果。而如果能够在边框上实现渐变效果,将进一步增加页面的吸引力。本文将介绍一些使用CSS属性实现渐变边框效果的技巧,并提供具体...
    99+
    2023-11-18
    边框 渐变 CSS属性
  • 如何使用css实现多个颜色渐变
    这篇“如何使用css实现多个颜色渐变”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“如何使用css实现多个颜色渐变”,小编整理了以下知识点,请大家跟着小编的步伐...
    99+
    2024-04-02
  • CSS如何实现背景渐变过渡效果
    今天小编给大家分享一下CSS如何实现背景渐变过渡效果的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2024-04-02
  • CSS容器背景如何实现颜色渐变
    这篇文章主要介绍了CSS容器背景如何实现颜色渐变,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。语法background: linear-gradient(direc...
    99+
    2023-06-08
  • css如何设置渐变
    这篇文章将为大家详细讲解有关css如何设置渐变,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是csscss是一种用来表现HTML或XML等文件样式的计算机语言,主要是用来设计网页的样式,使网页更加美化...
    99+
    2023-06-14
  • css中如何实现背景色渐变动画
    这篇文章主要为大家展示了“css中如何实现背景色渐变动画”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“css中如何实现背景色渐变动画”这篇文章吧。通过本文,你能...
    99+
    2024-04-02
  • CSS如何实现背景渐变和自动全屏
    这篇文章主要介绍CSS如何实现背景渐变和自动全屏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!CSS 关于背景渐变和自动全屏的问题主编在css开发时发现了一个致命的问题:在设置了背景颜色渐变后好不容易调成了全屏覆盖但...
    99+
    2023-06-08
  • HTML+CSS如何实现文本效果、渐变效果、边框图片效果
    这篇文章给大家分享的是有关HTML+CSS如何实现文本效果、渐变效果、边框图片效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。文本阴影文本裁剪文本描边文本填充线性渐变径向渐变边...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作