<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>keyframes&停下再滚动&超出不显示动画&加一组件循环</title>
<style>
.content {
display: flex;
width: 100px;
height: 100px;
margin-left: 50px;
margin-top: 200px;
border: 5px dotted black;
border-radius: 25px;
flex-direction: row;
overflow: hidden;
}
.list {
display: flex;
animation: discolor3 5s linear infinite;
display: flex;
border-radius: 25px;
flex-direction: row;
}
.item {
width: 100px;
height: 100px;
flex-shrink: 0;
font-size: 32px;
line-height: 100px;
text-align: center;
}
.item-1 {
background: #ff614c;
}
.item-2 {
background: #bfdc36;
}
.item-3 {
background: #6e80e6;
}
.item-4 {
background: #ff614c;
}
@keyframes discolor3 {
0% {
transform: translateX(0px);
}
16.5% {
transform: translateX(-100px);
}
33% {
transform: translateX(-100px);
}
49.5% {
transform: translateX(-200px);
}
66% {
transform: translateX(-200px);
}
82.5% {
transform: translateX(-300px);
}
100% {
transform: translateX(-300px);
}
}
</style>
</head>
<body>
<div class="content">
<div class="list">
<div class="item-1 item">1</div>
<div class="item-2 item">2</div>
<div class="item-3 item">3</div>
<div class="item-4 item">1</div>
</div>
</div>
</body>
</html>
<html>
<head>
<meta charset="utf-8" />
<title>动态CSS轮播动画</title>
</head>
<body>
<div
style="
display: flex;
align-items: center;
height: 50px;
font-size: 30px;
padding-top: 100px;
padding-left: 100px;
"
>
<input
type="checkbox"
id="overflow-hidden"
checked="true"
onchange="refresh()"
/>
超出隐藏
<button id="plusButton" onclick="plus()">展位+1</button>
</div>
<div id="demoDisplay">
<div id="demoContainer"></div>
</div>
<script>
const palette = ["#863D91", "#F29900", "#F2DE5C", "#F7E9D0", "#B893B6"];
const ANIM_NAME = "carousel-anim";
const scrollTime = 0.5;
const displayTime = 2;
const step = 150;
const blankStep = 30;
let count = 0;
plus();
function plus() {
count++;
document.getElementById(
"plusButton"
).textContent = `展位数(${count}) ➕1`;
appendItem2Container();
refresh();
}
function appendItem2Container() {
const demoContainer = document.getElementById("demoContainer");
const newItem = createItemElement();
if (count === 1) {
demoContainer.appendChild(newItem);
} else if (count === 2) {
demoContainer.appendChild(newItem);
const newItem2 = createItemElement();
demoContainer.appendChild(newItem2);
} else {
demoContainer.insertBefore(newItem, demoContainer.lastChild);
}
}
function refresh() {
const isOverflowHidden = true;
let cssInfo = null;
if (count > 1) {
cssInfo = buildKeyFramesAndReturnCSSInfo(
count,
step,
blankStep,
scrollTime,
displayTime
);
if (cssInfo) {
appendAnimStyle2DOM(cssInfo.cssStr);
}
}
document.getElementById(
"demoDisplay"
).style = `display: flex; width: 160px; height: 160px; margin-left: 50px;
margin-top: 200px; padding: 10px; border: 5px dotted black; border-radius: 25px;
flex-direction: row;overflow: hidden`;
const itemTitleElementList =
demoContainer.getElementsByClassName("item");
for (let index = 0; index < itemTitleElementList.length; index++) {
const element = itemTitleElementList[index];
element.style = `width: 150px; height: 150px; background-color: ${getPaletteColor(
index % count
)};text-align: center; line-height: 150px; font-size: 35px; border-radius: 25px; margin-bottom: 30px;
margin-right: 30px; flex-shrink: 0;}`;
element.textContent = (index % count) + 1 + "/" + count;
}
document.getElementById(
"demoContainer"
).style = `display: flex; border-radius: 25px; padding: 5px;
flex-direction: "row"; ${ cssInfo
? `animation:${ANIM_NAME} ${cssInfo.animDuration}s linear infinite;`
: ""
}`;
}
function getPaletteColor(index) {
return palette[index % palette.length];
}
function createItemElement() {
const itemDiv = document.createElement("div");
itemDiv.className = "item";
return itemDiv;
}
function buildKeyFramesAndReturnCSSInfo(
count,
step,
blankStep,
scrollTime,
displayTime
) {
const translate = "translateX";
const totalTime = displayTime * count + scrollTime * count;
let sumPercentage = 0;
let sumOffset = 0;
let cssStr = `@keyframes ${ANIM_NAME}{0%{transform:${translate}(0px);}`;
for (let index = 0; index < count; index++) {
sumPercentage += displayTime / totalTime;
console.log(sumPercentage,'sumPercentage')
cssStr += `${(sumPercentage * 100).toFixed(
0
)}%{transform:${translate}(-${sumOffset.toFixed(2)}px);}`;
sumPercentage += scrollTime / totalTime;
sumOffset += step + blankStep;
cssStr += `${(sumPercentage * 100).toFixed(
0
)}%{transform:${translate}(-${sumOffset.toFixed(2)}px);}`;
}
cssStr += "}";
console.log(cssStr, "cssStr");
return {
animDuration: totalTime,
cssStr,
};
}
function appendAnimStyle2DOM(cssStr) {
const head = document.head || document.getElementsByTagName("head")[0];
const style = document.createElement("style");
head.appendChild(style);
if (style.styleSheet) {
style.styleSheet.cssText = cssStr;
} else {
style.appendChild(document.createTextNode(cssStr));
}
}
</script>
</body>
</html>