前言
本篇博客是明哥針對有前端基礎的學員用於快速複習前端基礎案例
案例一 跳動的心
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>跳動的心</title>
<style>
.wrap{
width:150px;
height: 250px;
background-color: red;
border-radius: 200px 160px 0px 0px ;
transform-origin: center;
transform: rotate(45deg);
margin:0 auto;
margin-top:100px;
box-shadow: 0px 0px 100px red;
}
.wrap1{
width: 500px;
height: 500px;
margin:0 auto;
/* box-shadow: 0px 0px 100px red; */
animation: ax 1s infinite alternate;
transform:scale(.5);
}
@keyframes ax{
0%{}
100%{transform:scale(1.2);}
}
.box{
transform-origin: center;
width:150px;
height: 250px;
background-color: red;
border-radius: 160px 200px 0px 0px;
position: absolute;
top:2%;
left:95px;
transform: rotate(-45deg);
box-shadow: 0px 0px 100px red;
}
</style>
</head>
<body>
<div class="wrap1">
<div class="wrap"></div>
<div class="box"></div>
</div>
</body>
</html>
案例二 旋轉相冊
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>旋轉相冊</title>
<style>
.container {
width: 800px;
height: 600px;
margin: 200px auto;
}
.box {
width: 400px;
height: 400px;
margin: 100px auto;
position: relative;
transition: all 8s;
/*transform屬性應用於元素的2D或3D轉換,這個屬性允許你將元素旋轉,縮放,移動,傾斜等*/
transform-style: preserve-3d;
animation: move 8s infinite linear alternate;
}
.box > div {
width: 400px;
height: 400px;
opacity: 0.8;
position: absolute;
top: 0;
left: 0;
transition: all 1s;
}
.box img {
width: 400px;
height: 400px;
}
.left {
/*rotateX 圍繞其在一個給定度數X軸旋轉元素*/
transform: rotateY(90deg) translateZ(-200px);
}
.right {
/*rotateY圍繞其在一個給定度數Y軸旋轉元素*/
transform: rotateY(90deg) translateZ(200px);
}
.top {
/*rotateX圍繞其在一個給定度數Z軸旋轉元素*/
transform: rotateX(90deg) translateZ(200px);
}
.bottom {
transform: rotateX(90deg) translateZ(-200px);
}
.font {
transform: translateZ(200px);
}
.behind {
transform: translateZ(-200px);
}
.box:hover .left {
transform: rotateY(90deg) translateZ(-250px);
}
.box:hover .right {
transform: rotateY(90deg) translateZ(250px);
}
.box:hover .top {
transform: rotateX(90deg) translateZ(250px);
}
.box:hover .bottom {
transform: rotateX(90deg) translateZ(-250px);
}
.box:hover .behind {
transform: translateZ(-250px);
}
.box:hover .font {
transform: translateZ(250px);
}
@keyframes move {
from {
transform: rotateX(0deg) rotateY(0deg);
}
to {
transform: rotateX(13deg) rotateY(720deg);
}
}
</style>
</head>
<body>
<div class="container">
<div class="box">
<div class="left"><img
src="https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1927207283,1231546895&fm=26&gp=0.jpg">
</div>
<div class="right"><img
src="https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1927207283,1231546895&fm=26&gp=0.jpg">
</div>
<div class="top"><img
src="https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1927207283,1231546895&fm=26&gp=0.jpg">
</div>
<div class="bottom"><img
src="https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1927207283,1231546895&fm=26&gp=0.jpg">
</div>
<div class="font"><img
src="https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1927207283,1231546895&fm=26&gp=0.jpg">
</div>
<div class="behind"><img
src="https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1927207283,1231546895&fm=26&gp=0.jpg">
</div>
</div>
</div>
</body>
</html>
案例三 表白時鐘
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="./index.css">
<title>表白時鐘</title>
</head>
<body>
<!--表白時鐘效果主要分成三個部分,第一個是進入頁面的時候平鋪的時鐘效果,當點擊按鈕的時候,變爲圓盤時鐘,左邊的文字以鍵盤敲擊的而方式出現 -->
<!-- div 標籤中放文字的text類名的p標籤,存放時鐘效果的div和按鈕 -->
<p class="text"></p>
<div class="clock"></div>
<div class="btn" onclick="btnClick()"></div>
<script src="./index.js"></script>
</body>
</html>
——————————————————————————————————————————————————————————————————————————————————
CSS樣式
*{
margin: 0;
padding: 0;
}
html,body{
width: 100%;
height: 100%;
background: #FF6A6A;
}
/*設置時鐘的背景色爲粉色*/
.clock{
width: 100%;
height: 100%;
position: relative;
background: #FF6A6A;
}
/*設置按鈕的樣式和引入圖片*/
.btn{
width: 158px;
height:63px;
position: absolute;
cursor: pointer;
left: 50%;
margin-left: -79px;
top: 400px;
background-image: url(./btnImg.png);
background-size: 100% 100%;
}
.label{
display: inline-block;
font-size: 14px;
color: #000;
text-align: center;
padding:0 5px;
transform-origin: 0% 0%;
transition: all 1s;
}
/*設置文字顏色爲藍色*/
.text{
position: absolute;
left: 50px;
top: 120px;
color:rgb(106, 213, 255);
}
.text span{
display: inline-block;
font-size: 18px;
padding-left: 2px;
padding-bottom: 5px;
}
__________________________________________________________________________________
JS代碼:
// 首先我們需要定義月份、天、星期、小時、分鐘、秒的基礎數據,每一個數據,都會對應着生成一個dom元素,所以我在這裏定義了一個allSet的二維數組,數組內容分別是dom元素和對應的數據。
var clock = document.getElementsByClassName('clock')[0];
var monthContent = ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"];
var dayContent = ["一號", "二號", "三號", "四號", "五號", "六號", "七號", "八號", "九號", "十號", "十一號", "十二號", "十三號", "十四號", "十五號", "十六號", "十七號", "十八號", "十九號", "二十號", "二十一號", "二十二號", "二十三號", "二十四號", "二十五號", "二十六號", "二十七號", "二十八號", "二十九號", "三十號", "三十一號"];
var weekContent = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
var hourContent = ["零點", "一點", "兩點", "三點", "四點", "五點", "六點", "七點", "八點", "九點", "十點", "十一點", "十二點", "十三點", "十四點", "十五點", "十六點", "十七點", "十八點", "十九點", "二十點", "二十一點", "二十二點", "二十三點"];
var minuteContent = ["零分","一分", "二分", "三分", "四分", "五分", "六分", "七分", "八分", "九分", "十分",
"十一分", "十二分", "十三分", "十四分", "十五分", "十六分", "十七分", "十八分", "十九分", "二十分",
"二十一分", "二十二分", "二十三分", "二十四分", "二十五分", "二十六分", "二十七分", "二十八分", "二十九分", "三十分",
"三十一分", "三十二分", "三十三分", "三十四分", "三十五分", "三十六分", "三十七分", "三十八分", "三十九分", "四十分",
"四十一分", "四十二分", "四十三分", "四十四分", "四十五分", "四十六分", "四十七分", "四十八分", "四十九分", "五十分",
"五十一分", "五十二分", "五十三分", "五十四分", "五十五分", "五十六分", "五十七分", "五十八分", "五十九分"];
var secondsContent = ["我愛你","一秒", "Love", "三秒", "我愛你", "五秒", "Love", "七秒", "我愛你", "九秒", "Love",
"十一秒", "我愛你", "十三秒", "Love", "十五秒", "我愛你", "十七秒", "Love", "十九秒", "我愛你",
"二十一秒", "Love", "二十三秒", "我愛你", "二十五秒", "Love", "二十七秒", "我愛你", "二十九秒", "Love",
"三十一秒", "我愛你", "三十三秒", "Love", "三十五秒", "我愛你", "三十七秒", "Love", "三十九秒", "我愛你",
"四十一秒", "Love", "四十三秒", "我愛你", "四十五秒", "Love", "四十七秒", "我愛你", "四十九秒", "Love",
"五十一秒", "我愛你", "五十三秒", "Love", "五十五秒", "我愛你", "五十七秒", "Love", "五十九秒"];
//存放生成dom元素
var monthDom=[];
var dayDom=[];
var weekDom=[];
var hourDom=[];
var minutesDom=[];
var secondsDom=[];
var allSet = [
[monthContent,monthDom],
[dayContent,dayDom],
[weekContent,weekDom],
[hourContent,hourDom],
[minuteContent,minutesDom],
[secondsContent,secondsDom]
];
var isChange = false;
// 爲按鈕實現以一個點擊事件,當點擊按鈕的時候,將其轉換爲圓盤的時鐘狀態。我們需要將整個屏幕旋轉90deg,是因爲我們要高亮顯示的字是橫着的,並且一直在右側固定
function btnClick(){
isChange = true;
document.getElementsByClassName("btn")[0].style.display = "none"
clock.style.transform = "rotate(90deg)"
setTimeout(() => {
showText()
}, 200);
}
//文檔加載完成的時候就開始運行
window.onload = function(){
init();
changePosition(); // changePosition()函數實現了把當前的dom元素都改爲絕對定位再放到原來的位置上
setInterval(() => {
getTime();
}, 100);
}
//我們三個部分中的第一部分便是平鋪效果的時鐘,循環alllSet中的所有數據創建對應的dom元素,插入class類名就可以了,樣式已經在css中寫好
//初始化樣式
function init(){
for(var i=0;i<allSet.length;i++){
for(var j=0;j<allSet[i][0].length;j++){
var temp = createLabel(allSet[i][0][j]);
clock.appendChild(temp);
allSet[i][1].push(temp);
}
}
}
function createLabel(text){
var oDiv = document.createElement("div");
oDiv.innerText = text;
oDiv.classList.add("label");
return oDiv;
}
// 獲取當前的時間,並把當前的時間設置成不同的顏色
// 獲取當前時間的getTime方法中,我們添加這樣的判斷,計算每一個時間的旋轉角度。我們需要注意的是:我們在之前將整個屏幕旋轉了90deg,對應的x軸和y軸也會旋轉,通過cos和sin函數,計算每個時間的位置
function getTime(){
var labels = document.getElementsByClassName("label");
for(var i=0;i<labels.length;i++){
labels[i].style.fontWeight = "normal"
labels[i].style.color = "#000";
}
var now = new Date();
var month = now.getMonth();
var day = now.getDate();
var week = now.getDay();
var hour = now.getHours();
var minute = now.getMinutes();
var seconds = now.getSeconds()
var nowValue = [month,day-1,week,hour,minute,seconds];
for(var i=0;i<nowValue.length;i++){
var index = nowValue[i];
allSet[i][1][index].style.color = "yellow"
allSet[i][1][index].style.fontWeight = "bolder"
}
if(isChange){
var midX = document.body.clientWidth / 2;
var midY = document.body.clientHeight / 2 -100;
for(var i=0;i<allSet.length;i++){
for(var j=0;j<allSet[i][1].length;j++){
var r = (i+1)*25 + i*35;
var deg = 360 / allSet[i][0].length *(j-nowValue[i]);
var x = midX + r * Math.sin(deg*Math.PI/180);
var y = midY - r * Math.cos(deg*Math.PI/180);
allSet[i][1][j].style.left = x + "px";
allSet[i][1][j].style.top = y + "px";
allSet[i][1][j].style.transform = "rotate("+(deg-90)+"deg)";
}
}
}
}
function changePosition(){
for(let i=0;i<allSet.length;i++){
for(let j=0;j<allSet[i][1].length;j++){
let x = allSet[i][1][j].offsetLeft;
let y = allSet[i][1][j].offsetTop;
setTimeout(() => {
allSet[i][1][j].style.position = "absolute";
allSet[i][1][j].style.left = x + "px";
allSet[i][1][j].style.top = y + "px";
}, 50);
}
}
}
// 文案有逐個閃爍效果,每次換行以後原地閃爍三次,通過空格判斷是否換行,通過英文的 , 來決定原地閃爍的次數
function showText(){
var logo = "我這個人,不太會說話 ,,,,也不太會談戀愛 ,,,,但是呢,遇到你之後我才發現 ,,,,不是我不會 ,,,,是因爲之前 ,,,,我根本沒有遇到像你這麼對路的人 ,,,,我真的很想跟你在一起 ,,,,我需要的不多 ,,,,我需要的只是在你需要的時候 ,,,,我恰好能在你身邊 ,,,,我喜歡你呢 ,,,,並不是因爲你漂亮 ,,,,而是因爲 ,,,,你能給我一種別人給不了的特殊感覺"
// var logo = "我是一個俗人 ,,,,看山是山 ,,,,看海是海 ,,,,看花是花 ,,,,唯獨見了你 ,,,,心潮開始翻湧 ,,,,山嶽百川開始震盪 ,,,,滿天星光開始閃爍 ,,,,無需你一聲令下 ,,,,我和天地間萬物便通通奔向你";
var ptext = document.getElementsByClassName('text')[0];
var flag = 0;
var show = true;
var mouse = document.createElement("span");
mouse.style.position='absolute';
mouse.style.left ='0';
mouse.style.top ='0';
mouse.innerText = "__"
ptext.append(mouse);
var timer = setInterval(function(){
if(flag<logo.length){
if(logo.charAt(flag)!=","){
mouse.style.left = parseInt(mouse.style.left) + "px"
}
if(logo.charAt(flag) == " "){
mouse.style.left = 0 + "px"
mouse.style.top = 29 + parseInt(mouse.style.top)+"px"
ptext.appendChild(document.createElement("br"))
}else if(logo.charAt(flag) == ","){
if(!show){
mouse.style.display = "inline-block";
}else{
mouse.style.display = "none";
}
show =!show;
}else{
mouse.style.left = 20 +parseInt(mouse.style.left) + "px"
var span = document.createElement("span");
span.innerText = logo.charAt(flag);
ptext.append(span)
}
flag++;
}else{
clear();
mouse.style.display='none'
}
},150)
function clear(){
clearInterval(timer)
}
}
案例四 碰碰球
遊戲規則:點擊開始遊戲就可以玩碰碰球小遊戲啦若小球碰到下邊框時遊戲結束,需要刷新頁面後重新開始遊戲
HTML代碼
<div id="contain">
<div id="box">
<div class="board"></div>
<div class="ball"></div>
</div>
<button>開始遊戲</button><br>
<span>Score:</span>
<span class="score">0</span>
</div>
css代碼
注意:
(1)contain選擇器 的作用是使遊戲佈局在整個瀏覽器的中心
(2)box選擇器 劃定遊戲區域的樣式設計
(3)類選擇器 board 和類選擇器 ball 分別代表碰撞板和球的樣式設計
<style>
*{
margin: 0;
padding: 0;
}
#contain {
width: 500px;
height: 480px;
margin: 0 auto;
margin-top: 100px;
}
#box {
width: 500px;
height: 400px;
margin: 0 auto;
/* 子絕父相 */
position:relative ;
border: 1px solid #ccc;
}
.board {
width: 100px;
height: 10px;
background-color: black;
/* 子絕父相 */
position:absolute;
/* board水平居中 */
left:200px;
top: 80%;
}
.ball {
width: 15px;
height: 15px;
border-radius: 50%;
background-color: coral;
/* 子絕父相 */
position: absolute;
left:242px;
top:76%;
}
button {
width: 100px;
background-color: dodgerblue;
border-radius: 10%;
color: white;
padding: 4px 0;
margin: 5px 0;
}
</style>
JS代碼
<script src="../jquery.js"></script>
<script>
//獲取各所需元素
var contain = document.getElementById("contain");
var box = document.getElementById("box");
var board = document.getElementsByClassName("board")[0];
var ball = document.getElementsByClassName("ball")[0];
var btn = document.getElementsByTagName("button")[0];
var score = document.getElementsByClassName("score")[0];
//分別代表board左距離、右距離;ball左距離、右距離
var board_left,board_top,ball_left,ball_top ;
var interval,flag=1,sum=0;
//設置小球的速度
var speedX = -1,speedY = -1;
//監聽鼠標進入box
box.onmousemove = function() {
//事件對象(兼容)
var e = event || window.event;
//更改board的left和top
board_left = event.pageX - box.offsetLeft -50;
board_top = event.pageY - box.offsetTop;
//檢測board是否超出邊框並更改board和ball位置
// 兩個if語句中嵌套使用了if語句,並且使用了一個標誌 變量 flag。外層 if語句 目的是限制 *board* 能移動的範圍,內層 if語句 和 變量 flag 是爲了防止點擊了遊戲開始按鈕後,在遊戲過程中出現當鼠標再進入遊戲區域時出現小球運動錯誤的bug
if(board_left>=0 && board_left<=400) {
board.style.left = board_left + "px";
//flag的作用是防止點擊按鈕後再次進入Box後球的位置再變化
if(flag) {
ball_left = board_left + 45;
ball.style.left = ball_left + "px";
}
}
if(board_top>=0 && board_top<=390){
board.style.top = board_top + "px";
if(flag) {
ball_top = board_top - 15;
ball.style.top = ball_top +"px";
}
}
}
//監聽按鈕點擊事件
btn.onclick = function() {
//清除定時器,防止定時器重疊
clearInterval(interval);
//flag=0後ball不再隨board位置變化
flag=0;
//設置定時器
interval = setInterval(function(){
ball_left += speedX;
ball_top += speedY;
if(ball_left>=0 && ball_left<=485){
ball.style.left = ball_left + "px";
}
if(ball_top>=0 && ball_top<=385){
ball.style.top = ball_top + "px";
}
//球的方向改變
//撞d到左邊右邊邊框
if(ball_left<0|| ball_left>485 ){
speedX = -speedX;
}else if(ball_top<0){//撞到上邊邊框邊框
speedY = -speedY;
}
//檢測ball碰到board
if((ball_top+15) >= board_top && ball_left>=board_left && ball_left <= (board_left+50)){
speedX = -speedX;
speedY = -speedY;
//分數改變
sum+=5;
score.innerHTML = sum;
}
//遊戲結束
if(ball_top>385 ){
alert("遊戲結束,刷新後重新開始");
clearInterval(interval);
}
},5)
}
</script>