50 天学习 50 个项目 - HTMLCSS and JavaScript
day47-Testimonial Box Switcher(推荐箱切换器-动态进度条自动更新卡片信息)
效果
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.14.0/css/all.min.css"
integrity="sha512-1PKOgIY59xJ8Co8+NE6FZ+LOAZKjy+KY8iq0G4B3CyeY6wYHN3yt9PW0XpSriVlkMXe40PTKnXrLnZ9+fkDaog=="
crossorigin="anonymous" />
<link rel="stylesheet" href="style.css" />
<title>Testimonial Box</title>
</head>
<body>
<div class="testimonial-container">
<div class="progress-bar"></div>
<div class="fas fa-quote-right fa-quote"></div>
<div class="fas fa-quote-left fa-quote"></div>
<p class="testimonial">
我曾与数百名HTML/CSS开发人员合作过,我不得不说这个家伙是最优秀的。这家伙是个了不起的开发者。他强调良好、干净的代码,并注重细节。我喜欢那些尊重经过深思熟虑的设计的每一个方面,并尽最大努力将其写入代码的开发人员。他超越并将艺术转化为像素-每次都没有故障。
</p>
<div class="user">
<img src="https://randomuser.me/api/portraits/women/46.jpg" alt="user" class="user-image" />
<div class="user-details">
<h4 class="username">Miyah麦尔斯</h4>
<p class="role">营销</p>
</div>
</div>
</div>
<script src="script.js"></script>
</body>
</html>
style.css
@import url('https://fonts.googleapis.com/css?family=Montserrat');
* {
box-sizing: border-box;
}
body {
background: url('https://source.unsplash.com/random') no-repeat center/cover;
font-family: 'Montserrat', sans-serif;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
overflow: hidden;
margin: 0;
padding: 10px;
}
.testimonial-container {
background-color: #476ce4;
color: #fff;
border-radius: 15px;
margin: 20px auto;
padding: 50px 80px;
max-width: 768px;
position: relative;
}
.fa-quote {
color: rgba(255, 255, 255, 0.3);
font-size: 28px;
position: absolute;
top: 70px;
}
.fa-quote-right {
left: 40px;
}
.fa-quote-left {
right: 40px;
}
.testimonial {
line-height: 28px;
text-align: justify;
}
.user {
display: flex;
align-items: center;
justify-content: center;
}
.user .user-image {
border-radius: 50%;
height: 75px;
width: 75px;
object-fit: cover;
}
.user .user-details {
margin-left: 10px;
}
.user .username {
margin: 0;
}
.user .role {
font-weight: normal;
margin: 10px 0;
}
.progress-bar {
background-color: #fff;
height: 4px;
width: 100%;
animation: grow 10s linear infinite;
transform-origin: left;
}
@keyframes grow {
0% {
transform: scaleX(0);
}
}
@media (max-width: 768px) {
.testimonial-container {
padding: 20px 30px;
}
.fa-quote {
display: none;
}
}
script.js
const testimonialsContainer = document.querySelector('.testimonials-container')
const testimonial = document.querySelector('.testimonial')
const userImage = document.querySelector('.user-image')
const username = document.querySelector('.username')
const role = document.querySelector('.role')
const testimonials = [
{
name: 'Miyah麦尔斯',
position: '营销',
photo:
'https://images.unsplash.com/photo-1494790108377-be9c29b29330?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=200&fit=max&s=707b9c33066bf8808c934c8ab394dff6',
text:
"我曾与数百名HTML/CSS开发人员合作过,我不得不说这个家伙是最优秀的。这家伙是个了不起的开发者。他强调良好、干净的代码,并注重细节。我喜欢那些尊重经过深思熟虑的设计的每一个方面,并尽最大努力将其写入代码的开发人员。他超越并将艺术转化为像素-每次都没有故障。",
},
{
name: '六月查',
position: '软件工程师',
photo: 'https://randomuser.me/api/portraits/women/44.jpg',
text:
'这个家伙是一个了不起的前端开发人员,他交付的任务正是我们需要的,帮你自己一个忙,雇佣他,你不会对交付的工作感到失望。他会加倍努力确保你对你的项目感到满意。我一定会再和他合作!',
},
{
name: '伊达·尼斯卡宁',
position: '数据输入',
photo: 'https://randomuser.me/api/portraits/women/68.jpg',
text:
"这家伙工作很努力。与他的沟通也很好,他一直都很有反应,这在许多自由职业者身上是不容易找到的。我们一定和他再来一次。",
},
{
name: '蕾妮·西姆斯',
position: '接待员',
photo: 'https://randomuser.me/api/portraits/women/65.jpg',
text:
"这家伙竭尽所能把工作做好。这是我第二次雇他,以后还会再雇他。",
},
{
name: '乔纳森',
position: '平面设计师',
photo: 'https://randomuser.me/api/portraits/men/43.jpg',
text:
"我担心由于截止日期太紧,这个项目无法完成。但是这个家伙证明了我错了,他不仅交出了一份出色的工作,而且还设法在截止日期前一天交出了工作。当我要求修改时,他在几分钟内就修改好了。我期待着再次与他合作,我完全推荐他。再次感谢!",
},
{
name: '萨莎何',
position: '会计',
photo:
'https://images.pexels.com/photos/415829/pexels-photo-415829.jpeg?h=350&auto=compress&cs=tinysrgb',
text:
'这家伙是一个顶尖的设计师和前端开发人员。他善于沟通,工作速度快,工作质量高。我们很幸运能和他一起工作!',
},
{
name: '杰克翰',
position: '导演',
photo: 'https://randomuser.me/api/portraits/men/97.jpg',
text:
'这家伙是一个年轻而有才华的IT专业人士,积极主动,负责任,有很强的职业道德。他非常擅长PSD2HTML转换和HTML/CSS技术。他学东西很快,渴望学习新技术。他很专注,有很好的动力来完成预定的日期和出色的结果。',
},
]
let idx = 1
function updateTestimonial() {
const { name, position, photo, text } = testimonials[idx]
testimonial.innerHTML = text
userImage.src = photo
username.innerHTML = name
role.innerHTML = position
idx++
if (idx > testimonials.length - 1) {
idx = 0
}
}
setInterval(updateTestimonial, 10000)