CSS边框样式怎么做_CSS实现各种边框样式效果

答案:CSS边框样式通过border属性及其子属性(如style、width、color)、border-radius和border-image实现,常用样式包括solid、dashed、dotted、double及groove等立体效果,配合伪元素、clip-path或SVG可创建创意边框,响应式设计中需注意box-sizing、媒体查询调整及border-image适配,排查问题时应检查border-style缺失、box-sizing影响布局、优先级冲突和border-image设置。

css边框样式怎么做_css实现各种边框样式效果

CSS边框样式,说白了,就是给你的网页元素穿上各种“衣服边儿”。实现这些效果,我们主要依赖

border

属性及其一系列子属性,比如

border-style

border-width

border-color

。当然,如果你想让边角圆润起来,

border-radius

是必不可少的。更高级一点,甚至可以用

border-image

来玩出花样。核心就是这些,掌握了它们,你就能随心所欲地控制边框的视觉呈现了。

解决方案

要实现各种CSS边框样式,我们通常从最基础的

border

属性开始。这个属性其实是一个简写,它包含了

border-width

(宽度)、

border-style

(样式)和

border-color

(颜色)三个子属性。

一个最简单的边框是这样的:

.simple-box {  border: 1px solid #333; /* 1像素宽,实线,深灰色 */  padding: 10px;}

这里,

solid

就是我们最常见的实线边框。但CSS远不止这些,它提供了多种

border-style

的值,每一种都能带来不同的视觉感受。

立即学习“前端免费学习笔记(深入)”;

我个人最常用,也是最直观的几种样式:

solid

: 实线。这是你最常打交道的。

dashed

: 虚线。像是一串短横线。

dotted

: 点线。由一系列圆点组成。

double

: 双线。两条平行的实线,中间有空隙。

举个例子,如果你想给一个元素一个虚线边框:

.dashed-border {  border: 2px dashed blue; /* 2像素宽,蓝色虚线 */  padding: 10px;  margin: 10px;}

点线边框也类似:

.dotted-border {  border: 3px dotted green; /* 3像素宽,绿色点线 */  padding: 10px;  margin: 10px;}

双线边框在某些设计中也挺有意思的:

.double-border {  border: 4px double purple; /* 4像素宽,紫色双线 */  padding: 10px;  margin: 10px;}

除了这些,还有一些比较有立体感的样式,它们的效果会根据

border-color

和背景色有所不同:

groove

: 凹槽效果。看起来像被刻进去的。

ridge

: 凸脊效果。看起来像凸出来的。

inset

: 内嵌效果。整个元素看起来像被按了下去。

outset

: 外凸效果。整个元素看起来像凸了出来。

这些立体效果通常需要设置至少两种颜色,或者浏览器会自动根据边框颜色计算深浅。例如:

.groove-border {  border: 5px groove #ccc; /* 灰色凹槽边框 */  padding: 10px;  margin: 10px;}.ridge-border {  border: 5px ridge #ccc; /* 灰色凸脊边框 */  padding: 10px;  margin: 10px;}

如果你想让边框变得圆润,

border-radius

就是你的朋友了。它可以给边框的四个角设置圆角:

.rounded-border {  border: 2px solid #f06;  border-radius: 8px; /* 四个角都是8像素的圆角 */  padding: 10px;  margin: 10px;}

border-radius

也可以单独设置每个角,比如

border-top-left-radius

border-top-right-radius

等,或者用简写形式

border-radius: 10px 20px 30px 40px;

(分别对应左上、右上、右下、左下)。

更进一步,如果你想用图片作为边框,

border-image

属性就能派上用场。这个属性稍微复杂一点,但能实现非常酷炫的效果。它需要一个图片源、切片方式、宽度、外延和重复方式。

.image-border {  border: 15px solid transparent; /* 必须先设置边框宽度和透明样式 */  border-image: url('path/to/your/border-image.png') 30 round; /* 图片路径,切片30,重复方式为round */  padding: 10px;  margin: 10px;  width: 200px;  height: 100px;}

border-image

slice

值很重要,它决定了图片如何被切片并应用到元素的边角和边缘。

round

stretch

则决定了图片在边缘的填充方式。我个人在项目中用

border-image

的时候,通常会花点时间去调试

slice

repeat

,因为这块儿的效果变化真的挺大,也容易出乎意料。

如何实现不规则或创意边框?

除了CSS原生提供的那些

border-style

,我们有时候会想要一些更“不走寻常路”的边框效果,比如波浪线、不规则形状或者渐变边框。这确实需要一些额外的技巧,我通常会考虑以下几种方案:

一种非常强大的方式是利用

border-image

。前面提到过,但它的潜力远不止于此。你可以用一张包含复杂图案的图片作为边框,比如一个渐变色条、一个带有纹理的图案,甚至是一个镂空花纹。关键在于你的图片设计和

border-image-slice

border-image-repeat

的巧妙组合。比如,如果你想实现一个渐变边框,可以生成一个渐变图片,然后用

border-image

来应用它。

.gradient-border-image {  border: 10px solid transparent; /* 边框宽度必须设置,且透明 */  border-image: linear-gradient(to right, red, orange, yellow, green, blue, indigo, violet) 1; /* 直接用渐变作为图片源,切片1(整个图片) */  padding: 15px;  margin: 20px;  width: 250px;  height: 100px;  display: flex;  align-items: center;  justify-content: center;  color: #fff;  font-weight: bold;  font-size: 1.2em;}

这种方式的优点是灵活性高,但缺点是图片资源可能增加,且在不同尺寸下可能需要调整

slice

参数。

另一种非常灵活的手段是利用伪元素(

::before

::after

)。通过给伪元素设置背景、定位和

z-index

,我们可以创造出很多看起来像边框但实际上是独立元素的装饰效果。比如,一个元素的四个角各有一个小装饰块,或者一个元素的边框是分段的,中间有缺口。

绘蛙AI修图 绘蛙AI修图

绘蛙平台AI修图工具,支持手脚修复、商品重绘、AI扩图、AI换色

绘蛙AI修图 285 查看详情 绘蛙AI修图

.pseudo-element-border {  position: relative;  width: 200px;  height: 100px;  background-color: #f9f9f9;  padding: 20px;  margin: 30px;  overflow: hidden; /* 确保伪元素不会溢出 */}.pseudo-element-border::before {  content: '';  position: absolute;  top: -5px;  left: -5px;  right: -5px;  bottom: -5px;  border: 2px dashed #ff6b6b; /* 伪元素作为边框 */  z-index: 0; /* 确保在内容下方 */}.pseudo-element-border span {  position: relative;  z-index: 1; /* 确保内容在边框上方 */}

这个例子里,我用伪元素创建了一个虚线边框,它比实际元素稍微大一点,营造出一种“外框”的感觉。你甚至可以给伪元素设置

transform

属性,比如

rotate

,来创造倾斜的边框效果。

对于更复杂的几何形状边框,比如一个六边形或者一个带有尖角的对话框边框,我们可能需要结合

clip-path

属性。

clip-path

允许你定义一个可见区域,超出这个区域的部分会被裁剪掉。

.clipped-border {  width: 150px;  height: 150px;  background-color: #e0e0e0;  border: 2px solid #555;  clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%); /* 创建一个六边形 */  margin: 20px;  display: flex;  align-items: center;  justify-content: center;  font-weight: bold;}

这种方式实际上是裁剪了元素的形状,边框也会随之被裁剪。如果你想要一个真正六边形的边框,你可能需要用两个六边形元素叠加,一个作为背景(边框色),一个作为内容(背景色),并且尺寸略小。

最后,如果你真的需要极其复杂、不规则的边框,比如手绘风格的线条,SVG是最终的解决方案。你可以直接在SVG中绘制路径,然后将其作为背景图或者内联SVG嵌入到HTML中。SVG的强大之处在于其矢量性,无论放大缩小都不会失真,而且可以实现任何你能想象到的线条艺术。虽然这超出了纯CSS边框的范畴,但在“创意边框”的语境下,它绝对值得一提。

边框在响应式设计中有什么需要注意的?

在响应式设计中处理边框,说实话,我个人觉得比想象中要重要一些,但又很容易被忽视。边框不仅仅是装饰,它会直接影响元素的尺寸和布局,尤其是在不同屏幕尺寸下。

首先,

box-sizing: border-box;

这个属性几乎是现代响应式设计的基石,对于边框而言,它更是关键。如果没有它,当你给一个宽度为

100%

的元素加上

border

padding

,这个元素就会超出父容器,造成横向滚动条或者布局错乱。而

box-sizing: border-box;

的作用就是让

border

padding

计算在元素的

width

height

之内。我的习惯是,几乎所有的CSS项目都会在全局设置

* { box-sizing: border-box; }

,这样能省去很多不必要的麻烦。

/* 全局设置,强烈推荐 */html {  box-sizing: border-box;}*, *::before, *::after {  box-sizing: inherit;}.responsive-box {  width: 100%; /* 假设父容器是100% */  padding: 10px;  border: 2px solid #ccc; /* 即使有边框和内边距,总宽度依然是100% */}

其次,边框的宽度在不同设备上可能需要调整。一个在桌面端看起来很精致的

2px

边框,在移动端小屏幕上可能显得过于粗重,或者在某些高DPI屏幕上显得不够清晰。这时,使用相对单位就变得很有意义。

em

rem

: 这些单位是相对于字体大小的。如果你的边框宽度和文字大小有某种关联性,这会是一个不错的选择。

vw

vh

: 视口宽度或高度的百分比。这能让边框宽度随着屏幕尺寸的改变而等比例缩放,但要注意,过小的边框可能在某些极端小屏上消失,过大的边框又会占据太多空间。

我通常会这样处理:

.adaptive-border {  border: 1px solid #333; /* 默认一个较细的边框 */}/* 在小屏幕上,让边框更细或调整样式 */@media (max-width: 768px) {  .adaptive-border {    border-width: 0.5px; /* 或者使用 0.05rem 等 */    border-color: #666; /* 颜色也可以调整 */    /* 甚至可以考虑在移动端移除某些复杂的 border-image 效果,以提高性能 */  }}/* 在超大屏幕上,可能需要略粗的边框来保持视觉平衡 */@media (min-width: 1200px) {  .adaptive-border {    border-width: 2px;  }}

这里我用了

@media

查询来根据屏幕宽度调整边框。这种方式既能保证不同设备上的视觉效果,又能兼顾性能。

还有一点,关于

border-image

。虽然它能实现很多创意边框,但在响应式设计中,它的表现可能不如纯CSS边框稳定。

border-image-slice

border-image-width

的值需要仔细考量,以确保图片边框在不同尺寸下都能正确切片和缩放。有时候,我发现简单的

solid

dashed

边框结合

border-radius

,在响应式场景下反而更可靠、更容易维护。如果非要用

border-image

,务必在各种设备上进行充分测试。

总结一下,响应式边框设计,核心在于

box-sizing

的正确使用,以及通过媒体查询调整边框的宽度和样式,甚至考虑是否在特定设备上简化边框效果,以达到最佳的用户体验和性能。

为什么我的边框看起来和预期不一样?常见问题排查

我个人在写CSS的时候,边框这块儿经常会遇到一些让人摸不着头脑的问题,明明代码写了,但效果就是不对劲。这其中有些是新手常犯的错误,有些则是更深层次的CSS特性导致的。

一个最常见的问题是:边框根本没显示出来!这种情况,我通常会先检查以下几点:

border-style

是否设置了? 这是最容易忽略的。如果你只写了

border-width

border-color

,但没有指定

border-style

(比如

solid

dashed

),边框是不会显示的,因为

border-style

的默认值是

none

/* 错误示例:边框不会显示 */.my-box {  border-width: 1px;  border-color: red;  /* 缺少 border-style */}/* 正确示例 */.my-box-fixed {  border: 1px solid red; /* 或者分开写 border-style: solid; */}

border-width

是否为0? 如果宽度是

0

,那自然是看不到的。

border-color

是否与背景色相同或透明? 如果边框颜色和元素的背景色一模一样,或者设置成了

transparent

(透明),那它也是“隐形”的。

另一个让我头疼的问题是:边框的尺寸影响了布局!这几乎可以肯定是你没有正确使用

box-sizing

。前面也提到了,如果你没有设置

box-sizing: border-box;

,那么

border

padding

会增加元素的总宽度和总高度。这在计算布局时非常容易出错,导致元素溢出或者需要复杂的负边距来调整。

.container {  width: 300px;  background-color: #eee;}.item-a {  width: 100%; /* 期望是300px */  border: 5px solid red;  padding: 10px;  /* 实际宽度会是 300px + 5*2(border) + 10*2(padding) = 330px,溢出父容器 */}.item-b {  width: 100%;  border: 5px solid green;  padding: 10px;  box-sizing: border-box; /* 实际宽度依然是300px */}

当你遇到布局错乱,元素宽度不对劲的时候,第一反应就应该是检查

box-sizing

边框的颜色或样式看起来不对劲,或者不一致。这往往是CSS的优先级(Specificity)问题。你可能在不同的地方定义了同一个元素的边框,而某个定义因为优先级更高,覆盖了你期望的样式。

检查你的CSS文件加载顺序。使用浏览器的开发者工具检查元素的计算样式,看看哪个CSS规则最终生效了。避免使用

!important

,因为它会打乱正常的优先级计算。

border-image

效果不理想。

border-image

确实有点玄学,我个人觉得它比其他边框属性更需要耐心调试。

图片路径是否正确? 这是最基础的。

border-image-slice

参数是否合适? 这个参数决定了图片如何被切割,直接影响边角和边线的显示。如果切片不当,图片可能会被拉伸得很难看,或者边角出现空白。我通常会从简单的整数值开始尝试,比如

30

,然后根据效果微调。

border-image-repeat

stretch

repeat

还是

round

不同的重复方式在图片尺寸和元素尺寸不匹配时,效果差异很大。

round

通常能提供更平滑的过渡,而

stretch

则会拉伸图片。

border-width

是否设置了? 记住,

border-image

是替换了边框背景,但边框的实际宽度还是由

border-width

决定的。而且,

border-width

通常需要设置为

transparent

,否则会看到双层边框。

表格边框合并(

border-collapse

)问题。如果你在给

元素及其单元格(

,

)设置边框,可能会遇到边框重复或者不合并的问题。这是因为表格默认的边框模型是

separate

,单元格之间会有间隙。解决方法是给

元素设置

border-collapse: collapse;

table {  border-collapse: collapse; /* 让单元格边框合并 */  width: 100%;}th, td {  border: 1px solid #ccc; /* 单元格边框 */  padding: 8px;  text-align: left;}

遇到边框问题时,我的经验是,不要急着改代码,先打开浏览器开发者工具。选中出问题的元素,查看“样式”和“计算”面板。通常,你能在那里找到冲突的CSS规则、错误的属性值或者没有生效的样式,这比盲目修改代码效率高得多。

以上就是CSS边框样式怎么做_CSS实现各种边框样式效果的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1076671.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Java里如何实现线程安全的共享缓存_共享缓存线程安全处理方法说明
上一篇 2025年12月2日 08:00:06
曝iPhone折叠屏可双向折叠 OPPO周意保:外折没有意义 3年内会消失
下一篇 2025年12月2日 08:00:13

相关推荐

  • composer require-dev和require有什么不同_Composer Require与Require-Dev区别解析

    require用于声明项目运行必需的依赖,如框架、数据库组件和第三方SDK,这些包会随项目部署到生产环境;2. require-dev用于声明仅在开发和测试阶段需要的工具,如PHPUnit、PHPStan、Faker等,不会默认部署到生产环境;3. 安装时composer install根据环境决定…

    2026年5月10日
    1000
  • 修复Django电商项目中AJAX过滤产品列表图片不显示问题

    在Django电商项目中,当使用AJAX动态加载过滤后的产品列表时,常遇到图片无法正常显示的问题。这通常是由于前端模板中图片加载方式(如data-setbg属性结合JavaScript库)与AJAX动态内容更新机制不兼容所致。解决方案是直接在AJAX返回的HTML中使用标准的标签来渲染图片,确保浏览…

    2026年5月10日
    700
  • Matplotlib 地图中多类型图例的创建与优化

    Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化

    本教程旨在解决matplotlib地图可视化中,如何在一个图例中同时展示颜色块(如区域分类)和自定义标记(如特定兴趣点)的问题。文章详细介绍了当传统`patch`对象无法正确显示标记时,如何利用`matplotlib.lines.line2d`创建标记图例句柄,并将其与颜色块图例句柄合并,从而生成一…

    2026年5月10日 用户投稿
    900
  • Golang JSON序列化:控制敏感字段暴露的最佳实践

    本教程探讨golang中如何高效控制结构体字段在json序列化时的可见性。当需要将包含敏感信息的结构体数组转换为json响应时,通过利用`encoding/json`包提供的结构体标签,特别是`json:”-“`,可以轻松实现对特定字段的忽略,从而避免敏感数据泄露,确保api…

    2026年5月10日
    300
  • 利用海象运算符简化条件赋值:Python教程与最佳实践

    本文旨在探讨Python中海象运算符(:=)在条件赋值场景下的应用。通过对比传统if/else语句与海象运算符,以及条件表达式,分析海象运算符在简化代码、提高可读性方面的优势与局限性。并通过具体示例,展示如何在列表推导式等场景下合理使用海象运算符,同时强调其潜在的复杂性及替代方案,帮助开发者更好地掌…

    2026年5月10日
    300
  • Debian syslog性能优化技巧有哪些

    提升Debian系统syslog (通常基于rsyslog)性能,关键在于精简配置和高效处理日志。以下策略能有效优化日志管理,提升系统整体性能: 精简配置,高效加载: 在rsyslog配置文件中,仅加载必要的输入、输出和解析模块。 使用全局指令设置日志级别和格式,避免不必要的处理。 自定义模板: 创…

    2026年5月10日
    000
  • 怎么在PHP代码中实现图片上传功能_PHP图片上传功能实现与安全处理教程

    首先创建含enctype的HTML表单,再用PHP接收文件,检查目录、移动临时文件,验证类型与大小,生成唯一文件名,并调整php.ini限制以确保上传成功。 如果您尝试在PHP项目中添加图片上传功能,但服务器无法正确接收或保存文件,则可能是由于表单配置、文件处理逻辑或安全限制的问题。以下是实现该功能…

    2026年5月10日
    300
  • 比特币新手教程 比特币交易平台有哪些

    比特币是一种去中心化的数字货币,基于区块链技术实现点对点交易,具有匿名性、有限发行和不可篡改等特点;新手可通过交易所购买,P2P交易获得比特币,常用平台包括Binance、OKX和Huobi;交易流程包括注册账户、实名认证、绑定支付方式、充值法币并下单购买,可选择市价单或限价单;比特币存储方式有交易…

    2026年5月10日
    000
  • c++中的SFINAE技术是什么_c++模板编程中的SFINAE原理与应用

    SFINAE 是“替换失败不是错误”的原则,指模板实例化时若参数替换导致错误,只要存在其他合法候选,编译器不报错而是继续重载决议。它用于条件启用模板、类型检测等场景,如通过 decltype 或 enable_if 控制函数重载,实现类型特征判断。尽管 C++20 引入 Concepts 简化了部分…

    2026年5月10日
    000
  • HTML如何隐藏滚动条或去除滚动条

    滚动条可以存在也可以不存在,本文主要介绍了html 隐藏滚动条和去除滚动条的方法的相关资料,大家一起来学习一下html隐藏滚动条或去除滚动条的方法吧。 1. html 标签加属性 XML/HTML Code复制内容到剪贴板 2.body中加入以下代码 立即学习“前端免费学习笔记(深入)”; html…

    用户投稿 2026年5月10日
    100
  • Golang gRPC流式请求异常处理

    在Golang的gRPC流式通信中,必须通过context.Context处理异常。应监听上下文取消或超时,及时释放资源,设置合理超时,避免连接长时间挂起,并在goroutine中通过context控制生命周期。 在使用 Golang 和 gRPC 实现流式通信时,异常处理是确保服务健壮性的关键部分…

    2026年5月10日
    000
  • Go语言mgo查询构建:深入理解bson.M与日期范围查询的正确实践

    本文旨在解决go语言mgo库中构建复杂查询时,特别是涉及嵌套`bson.m`和日期范围筛选的常见错误。我们将深入剖析`bson.m`的类型特性,解释为何直接索引`interface{}`会导致“invalid operation”错误,并提供一种推荐的、结构清晰的代码重构方案,以确保查询条件能够正确…

    2026年5月10日
    100
  • css max-height属性怎么用

    max-height 属性设置元素的最大高度。 说明 该属性值会对元素的高度设置一个最高限制。因此,元素可以比指定值矮,但不能比其高。不允许指定负值。 注意:max-height 属性不包括外边距、边框和内边距。 立即学习“前端免费学习笔记(深入)”; 值描述none 默认。定义对元素被允许的最大高…

    2026年5月10日
    100
  • vscode上怎么运行html_vscode上运行html步骤【指南】

    首先保存文件为.html格式,再通过浏览器或Live Server插件打开预览;推荐安装Live Server实现本地服务器运行与实时刷新,提升开发体验。 在 VS Code 上运行 HTML 文件并不需要复杂的配置,只需几个简单步骤即可预览页面效果。VS Code 本身是一个代码编辑器,不直接运行…

    2026年5月10日
    100
  • 修复点击时按钮抖动:CSS垂直对齐实践

    本文探讨了在Web开发中,交互式按钮(如播放/暂停按钮)在点击时发生意外垂直位移的问题。通过分析CSS样式变化对元素布局的影响,我们发现这是由于按钮不同状态下的边框样式和内边距改变,以及默认的垂直对齐行为共同作用所致。核心解决方案是利用CSS的vertical-align属性,将其设置为middle…

    2026年5月10日
    100
  • 理解编程指令:当结果正确,但实现方式不符要求时

    本文探讨了在编程实践中,即使程序输出了正确的结果,但若其实现方式未能严格遵循既定指令,仍可能被视为“不正确”的问题。我们将通过具体示例,对比直接求和与累加求和两种实现策略,强调理解和遵守编程规范的重要性,以确保代码的健壮性、可维护性及符合项目要求。 在软件开发过程中,我们经常会遇到这样的情况:编写的…

    2026年5月10日
    000
  • Golang goroutine与channel调试技巧

    使用go run -race检测数据竞争,结合runtime.NumGoroutine监控协程数量,通过pprof分析阻塞调用栈,利用select超时避免永久阻塞,有效排查goroutine泄漏、死锁和数据竞争问题。 Go语言的goroutine和channel是并发编程的核心,但它们也带来了调试上…

    2026年5月10日
    000
  • 页面中文本域的值怎么设置

    标签定义多行的文本输入控件。 文本区中可容纳无限数量的文本,其中的文本的默认字体是等宽字体(通常是 Courier)。 可以通过 cols 和 rows 属性来规定 textarea 的尺寸,不过更好的办法是使用 CSS 的 height 和 width 属性。 注释:在文本输入区内的文本行间,用 …

    2026年5月10日
    000
  • 《魔兽世界》将于6月11日开启国服回归技术测试

    《魔兽世界》将于6月11日开启国服回归技术测试《魔兽世界》将于6月11日开启国服回归技术测试《魔兽世界》将于6月11日开启国服回归技术测试《魔兽世界》将于6月11日开启国服回归技术测试

    《%ign%ignore_a_1%re_a_1%》官方宣布,将于6月11日开启国服回归技术测试,时间为7天,并称可以在6月内正式开服,玩家们可以访问官网下载战网客户端并预下载“巫妖王之怒”客户端,技术测试详情见下图。 WordAi WordAI是一个AI驱动的内容重写平台 53 查看详情 以上就是《…

    2026年5月10日 用户投稿
    400
  • 使用 Jupyter Notebook 进行探索性数据分析

    Jupyter Notebook通过单元格实现代码与Markdown结合,支持数据导入(pandas)、清洗(fillna)、探索(matplotlib/seaborn可视化)、统计分析(describe/corr)和特征工程,便于记录与分享分析过程。 Jupyter Notebook 是进行探索性…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信