前端的小玩意(8)——旋转的盒子(纯CSS动画效果)+可自由拖动(js)

来源:互联网 发布:淘宝买东西往哪里存钱 编辑:程序博客网 时间:2024/06/06 08:46

效果是一个旋转的盒子,他会展开六个面,展开结束后,会旋转,鼠标移动上去会变色;

demo网址:

http://jianwangsan.cn/boxDemo


HTML代码:

<div id="Box_Background" class="container"><p>这个盒子可以拖动</p>    <div id="Box">        <div class="Box">            <div class="surface top">Top</div>            <div class="surface bottom">Bottom</div>            <div class="surface left">Left</div>            <div class="surface right">Right</div>            <div class="surface back">Back</div>            <div class="surface front">Front</div>        </div>    </div></div>



CSS代码:(注:我在demo里使用了bootsrap的.container这个类,以使其居中

#Box_Background {    position: relative;    height: 300px;    border: 1px solid #aaa;    -webkit-user-select: none;    -moz-user-select: none;    -ms-user-select: none;    user-select: none;}#Box {    perspective: 500px; /*透视距离是500px,值越大透视越明显,但这个不是z轴上的移动,不会影响图片的大小*/    perspective-origin: 50% 50%; /*透视角度,居中*/    position: absolute;    top: 100px;    left: 50%;    margin-left: -50px; /*这行和上一行用于居中设置*/    width: 100px;    height: 100px;    cursor: pointer;}a[href='/boxDemo'] {    color: #555;    text-decoration: none;    background-color: #e5e5e5;    -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);    -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);    box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);}.Box {    width: 100px;    height: 100px;    text-align: center;    transform-style: preserve-3d; /*设置子元素是否继承3d,这样写是true*/}.Box .surface {    position: absolute;    border: 1px solid black;    width: 100px;    height: 100px;    line-height: 100px;    text-align: center;}@keyframes top { /*keyframes开头的都是动画,deg是度*/    0% {    }    100% {        transform: rotateX(90deg) translateZ(50px)    }}@keyframes bottom {    0% {    }    100% {        transform: rotateX(-90deg) translateZ(50px)    }}@keyframes left {    0% {    }    100% {        transform: rotateY(-90deg) translateZ(50px)    }}@keyframes right {    0% {    }    100% {        transform: rotateY(90deg) translateZ(50px)    }}@keyframes front {    0% {    }    100% {        transform: translateZ(50px)    }}@keyframes back {    0% {    }    100% {        transform: translateZ(-50px) rotateY(180deg)    }}@keyframes all {    0% {    }    100% {        transform: rotate3d(1, 1, 1, 360deg)    }}.Box .top {    animation: top 1s both; /*动画名,动画时间,动画开始结束状态保持,下面有第四个参数是延迟播放时间*/}.Box:hover .top {    background: red;}.Box .bottom {    animation: bottom 1s both 1s;}.Box:hover .bottom {    background: blue;}.Box .left {    animation: left 1s both 2s;}.Box:hover .left {    background: green;}.Box .right {    animation: right 1s both 3s;}.Box:hover .right {    background: yellow;}.Box .back {    animation: back 1s both 4s;}.Box:hover .back {    background: pink;}.Box .front {    animation: front 1s both 5s;}.Box:hover .front {    background: GreenYellow;}.Box {    animation: all 3s both infinite 6s linear;}


拖动的JS代码:

$(document).ready(function () {    var move = false;   //移动标志,true为可以移动    var mouseX, mouseY, boxX, boxY;    $("#Box").mousedown(function (evt) {        mouseX = evt.clientX;   //这里的值是鼠标坐标        mouseY = evt.clientY;        boxX = parseInt($(this).css("margin-left"));    //只获取px之前的数字        boxY = parseInt($(this).css("margin-top"));        move = true;    })    $("#Box").mouseup(function (evt) {        move = false;    })    $("#Box_Background").mousemove(function (evt) {        if (!evt.buttons) { // 假如鼠标不是按下状态,那么取消移动,然后返回;因为在移动中鼠标取消按下,无法触发mouseup事件            move = false;            return;        }        var back = $("#Box_Background")[0];        //限制盒子离开目标区域(实际上没有完全限制,会最多出去一半。因此可以更完美,只是我没写)        if (evt.clientX < back.offsetLeft) {            evt.clientX = back.offsetLeft        } else if (evt.clientX > back.offsetLeft + back.clientWidth) {            evt.clientX = back.offsetLeft + back.clientWidth;        } else if (evt.clientY < back.offsetTop) {            evt.clientY = back.offsetTop;        } else if (evt.clientY > back.offsetTop + back.clientHeight) {            evt.clientY = back.offsetTop + back.clientHeight;        }        // 这里是修改margin-left和margin-top的值来达到移动盒子的效果        if (move) {            $("#Box").css("margin-left", boxX + (evt.clientX - mouseX) + 'px');            $("#Box").css("margin-top", boxY + (evt.clientY - mouseY  ) + 'px');        }    })})


0 0
原创粉丝点击