当青训营遇上码上掘金
名片效果展示
简介
本文为 「青训营 X 码上掘金」主题创作活动入营版 主题1的名片创作代码的介绍。
名片作为向他人介绍自我的重要工具,需要简洁且重点鲜明,于是我通过HTML、CSS和JS制作了一张极简的名片。
名片中的重点信息用粗体文字放置在显眼的位置,且公司名称使用链接形式表示,便于点击浏览公司详情。
而联系方式等信息则通过图标展示,当鼠标悬停在图标上时,对应的信息就会在图标下方出现。
具体实现
HTML:
- 整体结构:
首先创建一个div,设置其class为card。然后在里面创建一个正面的div和一个背面的div。
- 名片正面:
包含姓名、职位、就职公司链接、二维码图标和一些联系方式等信息的图标。
- 名片背面:
包含公司名称和LOGO。
- 代码:
<div class="card" >
<div class="front">
<p>
<strong class="name">
姓名
</strong>
/前端工程师
</p>
<a href="https://www.bytedance.com/" target="_blank" class="comapny">
北京字节跳动科技有限公司
</a>
<div class="detail">
<div class="unimportant_info" data="https://github.com">
<i class="iconfont" alt="地址"></i>
</div>
<div class="unimportant_info" data="123@123.com">
<i class="iconfont" alt="邮箱"></i>
</div>
<div class="unimportant_info" data="12345678910">
<i class="iconfont" alt="电话"></i>
</div>
</div>
<i class="iconfont QRcode" alt="二维码"></i>
</div>
<div class="back">
<h1 class="company_name">字节跳动</h1>
<i class="iconfont logo" alt="logo"></i>
</div>
</div>
CSS:
- 深色和亮色模式适应:
设置了深色模式的根元素的样式,并在@media (prefers-color-scheme: light)中设置了亮色模式的根元素样式。
- 背景样式
设置了class为card的div的基础样式,使其中的元素和文字能够更好地展现。
设置了class为front,back的div背景图片、外投影和具有弧度的边角,使名片效果更为美观。
- 文字:
设置了a标签和body标签的基础样式,使得链接更好融入页面,body的样式也更为合适。
姓名和公司名称是重要信息,需要突出显示,所以为name和company类单独设置字体大小和权重。
背面的公司名称需要突出展示且美观,因此用h1标签表示,并且设置company_name类中 text-align: center;且下方外边距为0,使得公司名称居中展示,与logo距离适中。
- 图标:
通过@font-face引入了iconfont,用于在名片上添加图标,设置了iconfont类的基础样式,应用在所有图标上。
设置class为detail的div,display: flex;且justify-content: space-around;使得表示联系方式等信息的图标横向排列。
再设置class为unimportant_info的图标样式,当鼠标位于图标上方时,图标上移10px,且用::after使得在图标上移的同时,下方出现信息文本,信息通过attr获得标签内的data属性值。
- 实现名片翻转:
为class为front和back的div设置了position: absolute;使得两个div重叠,还设置了backface-visibility: hidden;使翻转后的div隐藏,以及transition: all 1s;和transform-style: preserve-3d;的设置,决定翻转效果。
然后设置class为back的div绕y轴翻转180度,从而将其隐藏。
- 代码:
:root {
font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
line-height: 1.5;
font-weight: 400;
color-scheme: light dark;
color: rgba(255, 255, 255, 0.87);
background-color: #242424;
}
@font-face {
font-family: 'iconfont'; /* Project id 3879578 */
src: url('//at.alicdn.com/t/c/font_3879578_3thhbwb3164.woff2?t=1675438970352') format('woff2'),
url('//at.alicdn.com/t/c/font_3879578_3thhbwb3164.woff?t=1675438970352') format('woff'),
url('//at.alicdn.com/t/c/font_3879578_3thhbwb3164.ttf?t=1675438970352') format('truetype');
}
.iconfont {
font-family:"iconfont" !important;
font-size: 30px;
font-style: normal;
color: #c6d1f9;
-webkit-font-smoothing: antialiased;
-webkit-text-stroke-width: 0.2px;
-moz-osx-font-smoothing: grayscale;
}
a {
font-weight: 500;
color: #c6d1f9;
text-decoration: inherit;
}
a:hover {
color: #d8e0ff;
}
body {
margin: 0;
display: flex;
place-items: center;
min-width: 320px;
min-height: 100vh;
}
.card {
position: relative;
height: 60mm;
width: 100mm;
left: 25%;
top: 20%;
text-align: left;
}
.front,.back {
height: 50mm;
width: 90mm;
padding: 1em;
background-image: url("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fc-ssl.duitang.com%2Fuploads%2Fitem%2F202005%2F16%2F20200516211922_uvqtq.thumb.1000_0.jpeg&refer=http%3A%2F%2Fc-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1678031302&t=cdf2a9dfa38391ae0c9d00e931d70575");
background-position: center;
background-size: 150mm 150mm;
border-radius: 6px;
border-bottom: 4px solid transparent;
border-right: 3px solid transparent;
filter: drop-shadow(5px 5px 5px #271858);
position: absolute;
backface-visibility: hidden;
transition: all 1s;
transform-style: preserve-3d;
}
.back {
transform: rotateY(180deg);
}
.name {
font-size: 30px;
}
.comapny {
font-size: 20px;
font-weight: bold;
}
.detail {
margin-top: 15px;
display: flex;
justify-content: space-around;
}
.unimportant_info {
margin: 0px;
font-size: 15px;
transition: transform 0.5s ease-out;
position: relative;
}
.unimportant_info:hover {
transform: translateY(-10px);
}
.unimportant_info:hover::after {
content: attr(data);
display: inline-block;
padding: 0.1rem 0.5rem;
border: 0.1rem solid #8a97c7;
border-radius: 5px;
position: absolute;
top: 3rem;
left: -3rem;
}
.QRcode {
position: relative;
left: 75%;
bottom: 91%;
font-size: 90px;
color: #e2e2e2;
}
.company_name {
text-align: center;
margin-bottom: 0em;
}
.logo{
margin-left: 1.2em;
font-size: 100px;
}
@media (prefers-color-scheme: light) {
:root {
color: #f3f3ff;
background-color: #ffffff;
}
}
JS:
- 实现名片翻转:
获取class为front和back的元素(即名片正面和背面),分别为他们添加监听事件。
当点击正面时,正面翻转180度,背面翻转回0度。
当点击背面时,背面翻转-180度,正面翻转回0度。
- 代码:
const front = document.querySelector(".front");
const back = document.querySelector(".back");
// 卡片正面翻转
front.addEventListener("click", () => {
front.style.transform="rotateY(180deg)"
back.style.transform="rotateY(0deg)"
})
// 卡片反面翻转
back.addEventListener("click", () => {
back.style.transform="rotateY(-180deg)"
front.style.transform="rotateY(0deg)"
})