赞
踩
content
属性需要与before
及after
伪元素配合使用,作用是可以定义伪元素
所显示的内容,本文主要列举content
的可选值及实用的案例与技巧?
一个简单的例子:
<p>「不会写前端」</p>
p {
&::before {
content: "欢迎关注"
}
&::after {
content: "微信公众号"
}
}
浏览器显示的是这个亚子:
我们看看实际上在浏览器渲染的结构:
没错,就是这么粗暴,就跟他们的名字一样,一前一后?
值得注意的是,在新的规范中,单冒号指伪类
、双冒号指伪元素
,就算你写成:after
,标准的浏览器还是会渲染成::after
,目的是兼容旧写法?
unicode
attr
函数url
函数counter
函数css
变量为了使文章简洁,下面有部分content
属性在外层省略父元素:
// 原始
p {
&::after {
content: "";
}
}
// 省略后
content: "";
content: "我是文字内容";
浏览器自带的特殊字符:
p {
&:after {
content: "\02691";
color: red;
}
}
显示如下:
html特殊字符对照表
iconfont
自定义字体图标:
<span class="icon icon-close"></span>
@font-face {
font-family: "iconfont";
src: url('//at.alicdn.com/t/font_1209853_ok7e8ntkhr.ttf?t=1560857741304') format('truetype');
}
.icon {
font-family: "iconfont";
}
.icon-close::before {
content: "\e617";
}
显示如下:
顾名思义,这个函数可以获取html
元素中某一属性的值,如id
、class
、style
等?
<p data-content="我是文字内容"></p>
content: attr(data-content);
显示我的掘金头像:
content: url("https://user-gold-cdn.xitu.io/2019/8/7/16c681a0fb3e84c4?imageView2/1/w/180/h/180/q/85/format/webp/interlace/1");
显示如下:
缺点就是无法控制图片的大小?
counter
函数的作用是插入计数器的值,配合content
属性可以把计数器里的值显示出来?,介绍用法之前,得先熟悉两个属性counter-reset
跟counter-increment
?
counter-reset
的作用是定义一个计数器:
counter-reset: count1 0; // 声明一个计数器count1,并从0开始计算
counter-reset: count2 1; // 声明一个计数器count2,并从1开始计算
counter-reset: count3 0 count4 0 count5 0; // 声明多个计数器
counter-increment
使计数器的值递增,可以理解成javascript
中的+=
:
counter-reset: count 0;
counter-increment: count 2; // 使count自增2,当前count的值为2
counter-increment: count -2; // 使count自增-2,当前count的值为-2
注意,这里的计数器count
的值为什么不是变回了0
,可以理解成样式覆盖,就如以下代码:
div {
width: 100px;
width: 200px; // 实际渲染的宽度
}
显示变量的时候,如果变量是string
类型则可以直接显示,如果是int
类型,则需要借用counter
函数?
// string类型 --name: "不会写前端"; p { &::after { content: var(--name); // 显示为"不会写前端" } } ---------- 我是分割线 ---------- // int类型 --count: 60; p { &::after { counter-reset: color var(--count); content: counter(count); // 显示为"60" } } ---------- 我是分割线 ---------- // 不支持的类型及情况 --count: 60.5; // 显示为"0",不支持小数 --count: 60px; // 显示为"",不支持css属性值
普通字符串拼接:
content: "xxx" + "xxx";
字符串拼接函数:
// 不能使用 + 连接符,也可以不需要空格,这里只是为了区分
content: "我支持" attr(xx);
count: "我的掘金头像:" url("xxxxx");
content: "计数器的值为:" counter(xx);
隐性转换:
content: 0; // 显示为""
content: "" + 0; // 显示为"0"
content: "" + attr(name); // 显示为"attr(name)"
href
属性里面的值:<a href="https://juejin.im/user/587e1822128fe1005706db1c"></a>
a {
&:empty {
&::after {
content: "链接内容为:" attr(href);
}
}
}
显示如下:
<ul>
<li>首页</li>
<li>商品</li>
<li>详情</li>
</ul>
ul {
display: flex;
font-weight: bold;
li {
&:not(:last-child) {
margin-right: 5px;
&::after {
content: "\276D";
margin-left: 5px;
}
}
}
}
显示如下:
之前还这样写来着?
<li v-for="(item, index) in list">
<span>{{item}}</span>
<span v-show="index < list.length - 1">、</span>
</li>
<div class="progress" style="--percent: 14;"></div>
<div class="progress" style="--percent: 41;"></div>
<div class="progress" style="--percent: 94;"></div>
.progress { width: 400px; height: 17px; margin: 5px; color: #fff; background-color: #f1f1f1; font-size: 12px; &::before { counter-reset: percent var(--percent); content: counter(percent) "%"; // 文字显示 display: inline-block; width: calc(100% * var(--percent) / 100); // 宽度计算 max-width: 100%; // 以防溢出 height: inherit; text-align: right; background-color: #2486ff; } }
显示如下:
加个过渡效果:
transition: width 1s ease; // 页面首次进入没有过渡效果,因为width必须要发生变化才行
鱼和熊掌不可兼得,如果只靠css
,想在页面首次进入触发动画效果,那只有animation
才能做到了?
.progress { &::before { // 移除width跟transition属性 animation: progress 1s ease forwards; } @keyframes progress { from { width: 0; } to { width: calc(100% * var(--percent) / 100); } } }
页面刷新后效果如下:
参考文章:小tips: 如何借助content属性显示CSSvar变量值
<button data-tooltip="我是一段提示">按钮</button>
[data-tooltip] { position: relative; &::after { content: attr(data-tooltip); // 文字内容 display: none; // 默认隐藏 position: absolute; // 漂浮在按钮上方并居中 bottom: calc(100% + 10px); left: 50%; transform: translate(-50%, 0); padding: 5px; border-radius: 4px; color: #fff; background-color: #313131; white-space: nowrap; z-index: 1; } // 鼠标移入button的时候显示tooltip &:hover { &::after { display: block; } } }
效果如下:
多方向、主题、动画实现可以移步我之前写过的一篇文章:利用css‘content实现指令式tooltip文字提示?
<form>
<input type="checkbox" id="one">
<label for="one">波霸奶茶</label>
<input type="checkbox" id="two">
<label for="two">烤奶</label>
<input type="checkbox" id="three">
<label for="three">咖啡</label>
<!-- 输入结果 -->
<div class="result">已选中:</div>
</form>
form { counter-reset: count 0; // 当checkbox选中的时候,计数器自增1 input[type="checkbox"] { &:checked { counter-increment: count 1; } } // 输出结果 .result { &::after { content: counter(count); } } }
效果如下:
<!-- 章节 --> <ul class="section"> <li> <h1>自我介绍</h1> <!-- 子章节 --> <ul class="subsection"> <li> <h2></h2> </li> <li> <h2></h2> </li> </ul> </li> <li> <h1>写一段css代码</h1> </li> </ul>
// 章节 .section { counter-reset: section 0; // 外层计数器 h1 { &::before { counter-increment: section 1; // 自增1 content: "Section"counter(section) ". "; } } // 子章节 .subsection { counter-reset: subsection 0; // 内层计数器 h2 { &::before { counter-increment: subsection 1; // 自增1 content: counter(section) "."counter(subsection); // 计数器是有作用域的,这里可以访问外层计数器 } } } }
显示如下:
<p>加载中</p>
p { &::after { content: "."; animation: loading 2s ease infinite; @keyframes loading { 33% { content: ".."; } 66% { content: "..."; } } } }
效果如下:
<div class="no-more">无更多数据</div>
.no-more {
&::before {
content: "——";
margin-right: 10px;
}
&::after {
content: "——";
margin-left: 10px;
}
}
效果如下:
content
始终都需要配合before
跟after
伪元素使用,主要是显示一些额外
的信息,更多案例需要大家去挖掘,只要脑洞大?,篇幅较长,如有内容或知识点出错,请大家纠正!
讲道理,仅3行核心css代码的rate评分组件,我被自己秀到头皮发麻?♂️
contenteditable跟user-modify还能这么玩?️
css掩人耳目式海浪动效?,这可能是最简单的实现方式了吧?️
本文到此结束,希望以上内容对你有些许帮助,如若喜欢请记得点个赞
跟关注
哦 ?
微信公众号「不会写前端」
,将不定时更新最新、实用的前端技巧/技术性文章,欢迎关注,一起学习 ?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。