>  기사  >  웹 프론트엔드  >  CSS3+JS는 3D 행성의 움직임을 구현합니다.

CSS3+JS는 3D 행성의 움직임을 구현합니다.

php中世界最好的语言
php中世界最好的语言원래의
2018-03-22 13:41:081976검색

이번에는 3D 행성 운동을 구현하기 위한 CSS3+JS를 가져오겠습니다. CSS3+JS를 사용하여 3D 행성 운동을 구현하기 위한 주의 사항은 무엇입니까? 다음은 실제 사례입니다.

HTML 부분

<p class="path-Saturn">
        <p id="Saturn" title="土星">
            <p class="x"></p>  
            <p class="y"></p>
            <p class="z"></p>
            <p class="space space-x"></p>
            <p class="space space-x1"></p>
            <p class="space space-x2"></p>

            <p class="space space-y"></p>
            <p class="space space-y1"></p>
            <p class="space space-y2"></p>

            <p class="space space-z"></p>
            <p class="space space-z1"></p>
            <p class="space space-z2"></p>
    
            <!-- 卫星 -->
            <p class="path-satellite">
                <p id="satellite" title="卫星">
                    <p class="x"></p>
                    <p class="y"></p>
                    <p class="z"></p>
                    <p class="space space-x"></p>
                    <p class="space space-x1"></p>
                    <p class="space space-x2"></p>

                    <p class="space space-y"></p>
                    <p class="space space-y1"></p>
                    <p class="space space-y2"></p>

                    <p class="space space-z"></p>
                    <p class="space space-z1"></p>
                    <p class="space space-z2"></p>
                </p>
            </p>
        </p>
    </p>

여기서는 x, y, z의 처음 3개 p 범주를 사용하여 각 행성의 x, y, z 축을 그린 다음 이 행성을 중첩할 수 있습니다. 위의 코드처럼 내부 행성은 외부 행성의 위성입니다.

css part

.path-Saturn, .path-earth, .path-Venus, .path-Neptune, .path-Jupiter, .path-Mercury, .path-satellite, .path-moon{
    position: absolute;
    width: 95%;
    height: 95%;
    top: 2.5%;
    left: 2.5%;
    border: 1px solid #ddd;
    border-radius: 50%;
    transform: rotateX(60deg);
    transform-style: preserve-3d;
}
#sun, #earth, #Saturn, #Venus, #Neptune, #Jupiter, #Mercury, #satellite, #moon{
    width: 160px;
    height: 160px;
    position: absolute;
    transform-style: preserve-3d;
    top: 50%;
    left: 50%;
    margin: -80px 0 0 -80px;
    animation: rotateForward 10s linear infinite;
    cursor: pointer;
    transform: translateZ(-80px);
}
/*x, y, z轴*/
.x, .y, .z{  
    position: absolute;
    height: 100%;
    border: 1px solid #999;
    left: 50%;
    margin-left: -1px;
}
.y{
    transform: rotateZ(90deg);
}
.z{
    transform: rotateX(90deg);
}
@keyframes  rotateForward {
    0%{
        transform: rotate3d(1, 1, 1, 0deg);
    }
    100%{
        transform: rotate3d(1, 1, 1, -360deg);
    }
}
/*Saturn*/
#Saturn{
    width: 80px;
    height: 80px;
    left: 0%;
    margin: -40px 0 0 -40px;
    animation: rotateForward 4s linear infinite;
    transform: translateZ(-40px);
}
#Saturn .space{
    width: 80px;
    height: 80px;
    box-shadow: 0 0 60px rgba(90, 80, 53, 1);
    background-color: rgba(90, 80, 53, .3);
}
#Saturn .space-x1, #Saturn .space-x2, #Saturn .space-y1, #Saturn .space-y2, #Saturn .space-z1, #Saturn .space-z2{
    width: 87.5%;
    height: 87.5%;
    top: 6.25%;
    left: 6.25%;
    transform: rotate3d(0, 0, 0, 0deg) translateZ(20px);
}
#Saturn .space-x1{
    transform: rotate3d(0, 0, 0, 0deg) translateZ(-20px);
}
#Saturn .space-y{
    transform: rotate3d(0, 1, 0, 90deg) translateZ(0px);
}
#Saturn .space-y1{
    transform: rotate3d(0, 1, 0, 90deg) translateZ(-20px);
}
#Saturn .space-y2{
    transform: rotate3d(0, 1, 0, 90deg) translateZ(20px);
}
#Saturn .space-z{
    transform: rotate3d(1, 0, 0, 90deg) translateZ(0px);
}
#Saturn .space-z1{
    transform: rotate3d(1, 0, 0, 90deg) translateZ(-20px);
}
#Saturn .space-z2{
    transform: rotate3d(1, 0, 0, 90deg) translateZ(20px);
}

주로 9개의 면을 사용하여 다양한 회전과 평행 이동을 통해 구를 구성합니다. 그리고 여기에는 호환코드가 적혀있지 않기 때문에 소스코드를 다운로드 받고 싶은 친구들은 크롬 브라우저로 열어보도록 하세요. 여기에 언급해야 할 몇 가지 CSS3 속성이 있습니다:

1. 변환 스타일: 보존 3d는 3D 효과에서 이 속성이 설정된 컨테이너의 하위 요소를 표시하는 데 사용됩니다.

2. 변환 원점: 회전된 요소의 회전 및 이동의 기준점 위치를 설정합니다.

3. 관점: 요소가 보이는 뷰를 설정합니다.

JS파트

(function(planetObj, TimeArr, judgeDirec) {
    //检测参数是否规范
    var timeRegexp = /^[1-9][0-9]*$/,
        direcRegexp = /^[01]$/;
    function checkArgs (arg, ele, regexp) {
        if(arg){
            $(arg).each(function (i, item) {
                if(arg.length != planetObj.length || !regexp.test(item)){
                    throw Error('an error occured');
                    return;
                }else{
                    return arg;
                }
            })
        }else{
            arg = [];
            for(var i = 0; i < planetObj.length; i++){
                arg.push(ele);
            }
        }
        return arg;
    }
    TimeArr = checkArgs(TimeArr, 50, timeRegexp);
    judgeDirec = checkArgs(judgeDirec, 1, direcRegexp);

    var PathArr = [];
    $(planetObj).each(function (i, item) {
        var n = 0;  //定义一个标识,来判断当前是怎么运动的
        PathArr.push({
            a : $(item).parent().width() / 2,
            b : $(item).parent().height() / 2
        });

        //变化x坐标,然后根据椭圆轨迹,获得y坐标,以达到运动的效果
        function getEllopsePath (x, PathObj) {
            x = x - PathObj.a;
            var m;

            n ? (judgeDirec[i] ? m = 1 : m = -1) : (judgeDirec[i] ? m = -1 : m = 1); //判断开根号求得的y值是否为负数,从而确定旋转方向
            // if(judgeDirec[i]){
            //     n ? (m = judgeDirec[i]) : (m = judgeDirec[i]-2);  
            // }else{
            //     n ? (m = judgeDirec[i] - 1) : (m = judgeDirec[i] + 1);
            // }
            return Math.sqrt((1 - x * x / (PathObj.a * PathObj.a)) * PathObj.b * PathObj.b) * m + PathObj.b; 
        }

        function moving () {
            var x = parseInt($(item).css('left'), 10);
            if(x == 2 * PathArr[i].a){  //到达轨迹的右零界点的时候x减小
                n--;
            }else if (x == 0) {   //到达轨迹的左临界点的时候,x增加
                n++;
            }
            n ? x++ : x--;
            $(item).css({
                'top' : getEllopsePath(x, PathArr[i]) + 'px',
                'left' : x + 'px'
            });
        }

        setInterval(moving, TimeArr[i]);
    });
})(['#Saturn', '#earth', '#Venus', '#Neptune', '#Mercury', '#Jupiter', '#satellite', '#moon'], [40, 180, 240, 20, 120, 200, 30, 10]/*option默认为50毫秒*/, [1, 0, 0, 0, 1, 0, 1, 1]/*option 判断运动方向,0为顺时针,1为逆时针,默认为逆时针*/);

행성의 움직임을 구현할 때, 행성의 왼쪽 위치를 일정 간격으로 변경하고, 그에 따라 조정하기 때문에 잘 처리되지 않는 부분이 있습니다. 상단의 값을 구하는 타원 공식입니다. 타원이 고르지 않기 때문에 최고 값이 고르지 않게 변하기 때문에 행성의 움직임이 빠르고 느리게 보이게 됩니다.

그럼 여기서 또 한 가지 주목할 점은 Math.sqrt() 메소드로 생성된 값은 모두 양수이고, 행성이 한 바퀴 도는 것을 원한다면 Math를 동적으로 변경해야 한다는 것입니다. 궤적의 왼쪽과 오른쪽 끝의 sqrt. () 이 방법으로 계산된 값의 양수와 음수입니다.

아래에 렌더링이 첨부되어 있습니다

이 기사의 사례를 읽으신 후 방법을 마스터하셨다고 생각합니다. 더 흥미로운 정보를 보려면 PHP 중국어 웹사이트의 다른 관련 기사에 주목하세요!

추천 도서:

CSS의 동적 로딩에 대한 자세한 설명

CSS3의 webkit-tap-highlight-color 속성을 사용하는 방법

위 내용은 CSS3+JS는 3D 행성의 움직임을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.