当青训营遇上码上掘金
前言
名片是向人介绍自我的重要工具,作为一名程序员用代码做自我介绍是一件非常酷炫的事情,所以就试着写了一张简约的名片。
具体实现
HTML部分
HTML的部分只通过简单的嵌套展示了卡片的正面与反面的内容,整体看上去还十分简单,甚至不像一张卡片,接着就可以开始为卡片添加样式了~
<div class="cardContainer inactive">
<div class="card">
<div class="side front">
<div class="avatar"></div>
<div class="info">
<h2>时光</h2>
<p>给我一段老时光,独坐在绿苔滋长的木窗下,泡一壶闲茶。不去管,那南飞燕子,何日才可以返家。不去问,那一叶小舟,又会放逐到哪里的天涯。不去想,那些走过的岁月,到底多少是真,多少是假。</p>
</div>
</div>
<div class="side back">
<div class="info">
<h2>人生三大乐事</h2>
<ul>
<li>父母俱在,兄弟无故</li>
<li>仰不愧于天,俯不怍于人</li>
<li>得天下英才而教育之</li>
</ul>
</div>
</div>
</div>
</div>
CSS部分
首先对卡片的容器进行调整,加上一些卡片阴影,卡片圆角之类的基本样式,并通过TranslateZ把卡片的一部分内容放到卡片的反面- ,使用backface-visibility: hidden;可以使卡片反面朝向用户时不可见,可以看到,已经初具一张卡片的样子了~
body {
background-color: #dadce2;
background-image: linear-gradient(140deg, white, #dadce2);
margin: 0;
width: 100vw;
min-height: 450px;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
.cardContainer {
position: relative;
width: 500px;
height: 275px;
margin: 4px;
perspective: 1000px;
}
.card {
display: inline-block;
width: 100%;
height: 100%;
cursor: pointer;
transform-style: preserve-3d;
transform: translateZ(-100px);
transition: all 0.4s cubic-bezier(0.165, 0.84, 0.44, 1);
}
.card:after {
content: "";
position: absolute;
z-index: -1;
width: 100%;
height: 100%;
border-radius: 25px;
box-shadow: 0 14px 50px -4px rgba(0, 0, 0, 0.15);
opacity: 0;
transition: all 0.6s cubic-bezier(0.165, 0.84, 0.44, 1.4);
}
.card .side {
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
position: absolute;
width: 100%;
height: 100%;
border-radius: 25px;
background-color: white;
}
接着为卡片添加悬浮的样式及背景图片与一些文字的样式。当鼠标悬浮时,去除卡片的模糊,并放大卡片,为这个过程添加一定的transition过渡时间,可以使动画更加平滑,能产生聚焦的效果。
.card:hover {
transform: translateZ(0px);
}
.card:hover:after {
opacity: 1;
}
.card .front {
z-index: 2;
background-image: url(https://img1.baidu.com/it/u=2822445534,1253262868&fm=253&fmt=auto&app=120&f=JPEG?w=1024&h=576);
background-position: center;
}
.card .back {
transform: rotateY(180deg);
background-image: url(https://img2.baidu.com/it/u=2368433042,2821070939&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500);
}
.card .info {
display: inline-block;
padding-left: 25px;
}
.front .avatar {
display: inline-block;
background-color: #dadce2;
background-position: center;
background-size: cover;
margin: 5% 0 0 5%;
border-radius: 50%;
width: 80px;
height: 80px;
}
.front .avatar {
background-image: url(https://avatars.githubusercontent.com/u/94500053?v=4);
}
.back {
position: relative;
}
.back h2 {
margin-top: 16px;
margin-bottom: 18px;
}
.back li {
line-height: 22px;
margin: 2px 0 6px 0;
}
JS部分
JS部分比较简单,首先获取到卡片的节点,然后为其添加click的事件监听器,当触发对 card 的点击事件时,对 card 添加或移除 active 的类,结合preserve-3d与 transform 即可实现卡片的翻转效果~
const card = document.querySelector('.card');
function transition() {
if (this.classList.contains('active')) {
this.classList.remove('active')
} else {
this.classList.add('active');
}
}
card.addEventListener('click', transition);
.active {
transform: translateZ(0px) rotateY(180deg) !important;
}
.active:after {
display: none;
}
完整代码
完整代码已经上传到了码上掘金,供大家参考~