前言:最近在知乎上看到余弦回答的如何学习web安全,强调了数据流、输入输出,通过输入提交“特殊数据”,特殊数据在数据流的每个层处理,如果某个层没处理好,在输出的时候,就会出现相应层的安全问题。深感安全相当于逆向思考,故只有先掌握正向,才能更好的理解各种漏洞。本来有点急于求成,想直接学前后端开发一套博客系统,能够借此学习框架等。但考虑了一下,还是得慢慢来,先把前端用一些例子大致的了解了解。

一、任务:图片魔方

javascript魔方 前端魔方_4s

二、魔方模型

javascript魔方 前端魔方_4s_02

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Practice</title>
    <style type="text/css">
        *{						
            margin: 0;	//初始所有外边距为0
            padding: 0;	//初始所有内边距为0
        }    
        .container{
            width: 300px;
            height: 300px;
            margin: 150px auto;	//正方体居中
            perspective: 20000000px;	//视角远一点
        }
        .box{
            width: 300px;
            height: 300px;
            transform-style: preserve-3d;	//3D
            transform: rotateX(45deg) rotateY(45deg);//调试用的,方便看
        }
        .box-page{
            width: 300px;
            height: 300px;
            position: absolute;	//六个面初始化到同一个位置
        }
        .top{
            background-color: red;
            transform: translateZ(150px);
        }
        .bottom{
            background-color: green;
            transform: translateZ(-150px) rotateX(180deg);
        }
        .left{
            background-color: orange;
            transform: translateX(-150px) rotateY(90deg);
        }
        .right{
            background-color: pink;
            transform: translateX(150px) rotateY(90deg);
        }
        .before{
            background-color: blue;
            transform: translateY(150px) rotateX(90deg);
        }
        .after{
            background-color: yellow;
            transform: translateY(-150px) rotateX(90deg);
        }
    </style>
</head>
<body>
    <!-- 容器 -->
    <div class="container">		//最外层是为了调整正方体的位置,例如居中
        <div class="box">	
            <div class="box-page top"></div>
            <div class="box-page bottom"></div>
            <div class="box-page left"></div>
            <div class="box-page right"></div>
            <div class="box-page before"></div>
            <div class="box-page after"></div>
        </div>
    </div>
</body>
</html>

三、带图片的魔方

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Practice</title>
    <style type="text/css">
        *{
            margin: 0;
            padding: 0;
        }    
        .container{
            width: 300px;
            height: 300px;
            margin: 150px auto;
            perspective: 20000000px;
        }
        .box{
            width: 300px;
            height: 300px;
            transform-style: preserve-3d;
            transform: rotateX(45deg) rotateY(45deg);
        }
        .box-page{
            width: 300px;
            height: 300px;
            position: absolute;
        }
        .top{
            background-color: red;
            transform: translateZ(150px);
        }
        .bottom{
            background-color: green;
            transform: translateZ(-150px) rotateX(180deg);
        }
        .left{
            background-color: orange;
            transform: translateX(-150px) rotateY(90deg);
        }
        .right{
            background-color: pink;
            transform: translateX(150px) rotateY(90deg);
        }
        .before{
            background-color: blue;
            transform: translateY(150px) rotateX(90deg);
        }
        .after{
            background-color: yellow;
            transform: translateY(-150px) rotateX(90deg);
        }
    </style>
</head>
<body>
    <!-- 容器 -->
    <div class="container">
        <div class="box">
            <div class="box-page top"></div>
            <div class="box-page bottom"></div>
            <div class="box-page left"></div>
            <div class="box-page right"></div>
            <div class="box-page before"></div>
            <div class="box-page after"></div>
        </div>
    </div>
    <script type="text/javascript">
    var arr = document.querySelectorAll(".box-page");
    for(var n=0; n<arr.length; n++){
        for(var r=0; r<3; r++){
            for (var c=0; c<3; c++){
                var divs=document.createElement("div");
                divs.style.cssText="width: 100px; height: 100px; border: 2px solid #ffffff; box-sizing: border-box; position: absolute; background-image: url(a"+n+".png); background-size: 300px 300px;";
                arr[n].appendChild(divs);
                divs.style.left=c*100+"px";
                divs.style.top=r*100+"px";
                divs.style.backgroundPositionX=-c*100+"px";
                divs.style.backgroundPositionY=-r*100+"px";
            }
        }
    }
    </script>
</body>
</html>

尚未理解的地方:

  • url(a"+n+".png) :不是很理解为啥是这样拼接的,感觉像字符串拼接,但为啥加号是在里面 -_-

值得深思的地方:

  • box-sizing: border-box;
    我觉得这位网友的解释挺好的:

box-sizing 最主要的用法是规定容器元素的最终尺寸计算方式。

如果你创造了一个

没有设置 box-sizing 属性为 border-box(不设置的话默认值为 content-box.),同时你设置 width:100px; border:10px solid red; padding:10px; 那么最终 div 容器的实际宽度为:


100px(width)+210px(padding)+2*10px(border)=140px

所以你会得到一个比你预期(100px)还要更大的容器,结果就是会破坏网页布局。

注意:容易 margin 的尺寸不会被计算入最终容器宽度,因为对他的定义为对这个容器的留白,但不属于容器本身。

如果当我们定义一个容器的 box-sizing 属性为 border-box 时(表达式:br{box-sizing:border-box}),那么我们创建一个和上段中相同设置的

容器时,那么他的最终宽度即为 100px, 那么它的内容部分(content)的有效宽度变成了 100px-2*10px-2*10px =60px; 所以你会得到一个你预期大小的盒子容器,但是只是被压缩了内容部分尺寸而已,但是对于整体布局而言益处颇多。




四、带动画的魔方

javascript魔方 前端魔方_4s_03

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Practice</title>
    <style type="text/css">
        *{
            margin: 0;
            padding: 0;
        }    
        .container{
            width: 300px;
            height: 300px;
            margin: 150px auto;
            perspective: 20000000px;
        }
        .box{
            width: 300px;
            height: 300px;
            transform-style: preserve-3d;
            /* transform: rotateX(45deg) rotateY(45deg); */
            animation: box_ro 20s linear infinite ;
        }
        @keyframes box_ro {
            0%{
                transform: rotateX(0deg) rotateY(0deg);
            }
            100%{
                transform: rotateX(360deg) rotateY(360deg);
            }
        }
        .box-page{
            width: 300px;
            height: 300px;
            position: absolute;
            transform-style: preserve-3d;
        }
        .top{
            /* background-color: red; */
            transform: translateZ(150px);
        }
        .bottom{
            /* background-color: green; */
            transform: translateZ(-150px) rotateX(180deg);
        }
        .left{
            /* background-color: orange; */
            transform: translateX(-150px) rotateY(90deg);
        }
        .right{
            /* background-color: pink; */
            transform: translateX(150px) rotateY(90deg);
        }
        .before{
            /* background-color: blue; */
            transform: translateY(150px) rotateX(90deg);
        }
        .after{
            /* background-color: yellow; */
            transform: translateY(-150px) rotateX(90deg);
        }
        .box-page div:nth-child(1){
            animation: div_move 4s ease-in ;
        }
        .box-page div:nth-child(2){
            animation: div_move 4s ease-in  0.5s;
        }
        .box-page div:nth-child(3){
            animation: div_move 4s ease-in  1s;
        }
        .box-page div:nth-child(4){
            animation: div_move 4s ease-in  1.5s;
        }
        .box-page div:nth-child(5){
            animation: div_move 4s ease-in  2s;
        }
        .box-page div:nth-child(6){
            animation: div_move 4s ease-in  2.5s;
        }
        .box-page div:nth-child(7){
            animation: div_move 4s ease-in  3s;
        }
        .box-page div:nth-child(8){
            animation: div_move 4s ease-in  3.5s;
        }
        .box-page div:nth-child(9){
            animation: div_move 4s ease-in  4s;
        }

        @keyframes div_move {
            0%{
                transform: translateZ(0px) scale(1) rotateZ(0deg);
            }
            20%{
                transform: translateZ(300px) scale(0) rotateZ(720deg);
            }
            90%{
                transform: translateZ(300px) scale(0) rotateZ(720deg);
            }
            100%{
                transform: translateZ(0px) scale(1) rotateZ(0deg);
            }
        }
    </style>
</head>
<body>
    <!-- 容器 -->
    <div class="container">
        <div class="box">
            <div class="box-page top"></div>
            <div class="box-page bottom"></div>
            <div class="box-page left"></div>
            <div class="box-page right"></div>
            <div class="box-page before"></div>
            <div class="box-page after"></div>
        </div>
    </div>
    <script type="text/javascript">
    var arr = document.querySelectorAll(".box-page");
    for(var n=0; n<arr.length; n++){
        for(var r=0; r<3; r++){
            for (var c=0; c<3; c++){
                var divs=document.createElement("div");
                divs.style.cssText="width: 100px;  height: 100px; border: 2px solid #ffffff; box-sizing: border-box; position: absolute; background-image: url(a"+n+".png); background-size: 300px 300px;";
                arr[n].appendChild(divs);
                divs.style.left=c*100+"px";
                divs.style.top=r*100+"px";
                divs.style.backgroundPositionX=-c*100+"px";
                divs.style.backgroundPositionY=-r*100+"px";
            }
        }
    }
    </script>
</body>
</html>

感悟:以完成动画效果为目的,看了过渡与动画的教学视频。过渡就是从一个状态到另一个状态,关键字:transition 。动画则是多个状态组成,制定动画规则:@keyframes 引入动画 :animation 。但是实现时,发现css的语法有点冗余,例如实现每一小块的动画效果:.box-page div:nth-child(1) 要连续写9次,不知道有没有类似for循环的方法来改善代码冗余的情况。

五、总结

这次主要是通过一个明确的任务为目标去了解一下前端,感觉自己没办法耐下心来把前端完整的过一遍,所以选择了这个方法。当然,这只是出于了解的目的,如果真的要形成前端的知识体系,我觉得还是得学习完整的教学。