html分割线自动适应,CSS实现自适应分隔线的N种方法

CSS实现自适应分隔线的N种方法

分割线是网页中比较常见的一类设计了,

这里的自适应是指两边的横线会随着文字的个数和父级的宽度自适应

偷偷的看了一下知乎的实现,很显然是用一块白色背景覆盖的,加一点背景就露馅了

1170817ad4387b250fd6fabafa75e084.png

心想:知乎的前端也不怎么样? 可能别人的重点不在这些上面吧

下面列举几种更好的实现方式,不会露馅的那种

1.伪元素+transform:translateX(-100%);

主要原理是设置文本居中text-align: center;,然后给定两个伪元素,分别绝对定位,那么此时伪元素也是跟随着水平居中的,设置足够的宽度,然后把左边的往左位移100%就可以了,父级记得超出隐藏。

具体实现如下

html结构为

我是分割线

css样式为

.title{

position: relative;

text-align: center;

overflow: hidden;

font-size: 14px;

color: #999;

}

.title::before,.title::after{

content: '';

display: inline-block;

width: 100%;

height: 1px;

position: absolute;

background: #ccc;

top: 50%;

}

.title::before{

margin-left: -10px;

transform: translateX(-100%);

}

.title::after{

margin-left: 10px;

}

See the Pen CSS分隔线 (伪元素+transform) by XboxYan (@xboxyan) on CodePen.

2.伪元素+flex

这个比较好理解了,设置display:flex,然后两个伪元素分别铺满剩余空间。

具体实现如下

html结构为

我是分割线

css样式为

.title{

display: flex;

align-items: center;

font-size: 14px;

color: #999;

}

.title::before,.title::after{

content: '';

flex: 1;

height: 1px;

background: #ccc;

}

.title::before{

margin-right: 10px;

}

.title::after{

margin-left: 10px;

}

See the Pen CSS分隔线 (伪元素+flex) by XboxYan (@xboxyan) on CodePen.

3.伪元素+box-shadow/outline+clip-path

同样利用text-align: center使文本和伪元素居中,然后生成足够大的box-shadow或者outline,由于不支持单个方向,所以用clip-path或者clip裁剪掉

具体实现如下

html结构为

我是分割线

css样式为

.title{

text-align: center;

font-size: 14px;

color: #999;

overflow: hidden;

}

.title::before,.title::after{

content: '';

display: inline-block;

width: 0;

height: 1px;

box-shadow: 0 0 0 9999px #ccc;

vertical-align: middle;

}

.title::before{

margin-right: 10px;

clip-path: polygon(0 0, -9999px 0, -9999px 100%, 0 100%);

}

.title::after{

margin-left: 10px;

clip-path: polygon(0 0, 9999px 0, 9999px 100%, 0 100%);

}

See the Pen CSS分隔线 (伪元素+box-shadow/outline+clip-path) by XboxYan (@xboxyan) on CodePen.

4.伪元素+right:100%

这个实现需要多一层标签,外部仍然是text-align: center,内部文本里添加两个伪元素绝对定位,其中左边的设置距离右边100%(相对于文本标签)即可

具体实现如下

html结构为

我是分割线

css样式为

.title{

text-align: center;

font-size: 14px;

color: #999;

overflow: hidden;

}

.inner{

position: relative;

}

.inner::before,.inner::after{

position: absolute;

content: '';

width: 9999px;

height: 1px;

background: #ccc;

top: 50%;

}

.inner::before{

right: 100%;

margin-right: 10px;

}

.inner::after{

margin-left: 10px;

}

See the Pen CSS分隔线 (伪元素+right:100%) by XboxYan (@xboxyan) on CodePen.

5. border+transform

这个思路可以不用到伪元素,不过需要额外的标签,给内部文本左右足够大的1px边框,此时需要设置line-height:1px,由于内部整体以及足够大了(超过父级),可以使用绝对定位和transform: translateX(-50%)居中

具体实现如下

html结构为

我是分割线

css样式为

.title{

position: relative;

text-align: center;

font-size: 14px;

color: #999;

overflow: hidden;

padding: .6em 0;/**把高度撑起来**/

}

.inner{

position: absolute;

left: 50%;

transform: translateX(-50%);

white-space: nowrap;

line-height: 1px;

border-left: 9999px solid #ccc;

border-right: 9999px solid #ccc;

padding: 0 10px;

}

See the Pen CSS分隔线 (border+transform) by XboxYan (@xboxyan) on CodePen.

6.伪元素+border+left/right

这个思路只需要一个伪元素,在文本内部生成一个伪元素,利用足够大的border和相同的负值(绝对定位+left/right)还原位置

具体实现如下

html结构为

我是分割线

css样式为

.title{

text-align: center;

font-size: 14px;

color: #999;

overflow: hidden;

}

.inner{

position: relative;

padding: 0 10px;

}

.inner::before{

content: '';

position: absolute;

height: 1px;

top: 50%;

border-left: 9999px solid #ccc;

border-right: 9999px solid #ccc;

right: -9999px;

left: -9999px;

}

See the Pen CSS分隔线 (伪元素+border+left/right) by XboxYan (@xboxyan) on CodePen.

7.伪元素+table-cell

主要思路为父级设置display:table,伪元素设置display:table-cell,并设置足够大的宽度即可

具体实现如下

html结构为

我是分割线

css样式为

.title{

display: table;

font-size: 14px;

color: #999;

}

.inner{

display: table-cell;

white-space: nowrap;

padding: 0 10px;

}

.title::before,.title::after{

content: '';

display: table-cell;

width: 9999px;

overflow: hidden;

background: linear-gradient(#ccc 0,#ccc) center no-repeat;/**这里用线性渐变生成的,也可以用其他方式**/

background-size: 100% 1px;

}

See the Pen CSS分隔线 (伪元素+table-cell) by XboxYan (@xboxyan) on CodePen.

8.fieldset+legend

利用fieldset和legend标签组合,可以天然实现分隔线效果,参考至张鑫旭的这篇文章

具体实现如下

html结构为

我是分割线

css样式为

.title{

font-size: 14px;

color: #999;

border: 0;

border-top: 1px solid #ccc;

padding: 0;

}

.inner{

margin: 0 auto;;

padding: 0 10px;

}

See the Pen CSS分隔线 (fieldset+legend) by XboxYan (@xboxyan) on CodePen.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现html二级菜单的自动宽度可以使用CSS的flex布局和百分比宽度。 首先,将菜单项放在一个父元素中,使用display:flex来设置flex布局。然后,将菜单项的宽度设置为百分比,这样就可以根据父元素的宽度自动调整菜单项的宽度了。 例如: HTML代码: ``` <div class="menu"> <ul> <li><a href="#">菜单1</a> <ul> <li><a href="#">子菜单1</a></li> <li><a href="#">子菜单2</a></li> <li><a href="#">子菜单3</a></li> </ul> </li> <li><a href="#">菜单2</a> <ul> <li><a href="#">子菜单1</a></li> <li><a href="#">子菜单2</a></li> </ul> </li> <li><a href="#">菜单3</a> <ul> <li><a href="#">子菜单1</a></li> <li><a href="#">子菜单2</a></li> <li><a href="#">子菜单3</a></li> <li><a href="#">子菜单4</a></li> </ul> </li> </ul> </div> ``` CSS代码: ``` .menu { display: flex; justify-content: space-between; } .menu ul { padding: 0; margin: 0; list-style: none; display: flex; } .menu ul li { position: relative; flex: 1; } .menu ul li a { display: block; padding: 10px; background: #f2f2f2; text-align: center; text-decoration: none; color: #333; } .menu ul li ul { position: absolute; top: 100%; left: 0; width: 100%; display: none; background: #fff; z-index: 1; } .menu ul li:hover > ul { display: block; } .menu ul li ul li { display: block; } .menu ul li ul li a { display: block; padding: 10px; background: #f2f2f2; text-align: center; text-decoration: none; color: #333; width: 100%; } ``` 这样,菜单项的宽度将自动根据父元素的宽度进行调整,实现自适应宽度的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值