CSS3 製作魔方 - 相關立體樣式

来源:https://www.cnblogs.com/timeddd/archive/2019/05/13/10858034.html
-Advertisement-
Play Games

最好的實踐,就是給定一個實踐的目標去實踐。 目標:利用 CSS3 的一些特性,繪製一個魔方,要可以玩轉的那種,即上下左右每一層都可以獨立旋轉。效果如下: 為了完成此效果,將使用到以下相關概念和樣式:坐標、3D呈現、平移、旋轉。 (1)坐標 屏幕的起點坐標是(0,0,0),往右遞增為 x 方向,使用 ...


最好的實踐,就是給定一個實踐的目標去實踐。

目標:利用 CSS3 的一些特性,繪製一個魔方,要可以玩轉的那種,即上下左右每一層都可以獨立旋轉。效果如下:

魔方效果

為了完成此效果,將使用到以下相關概念和樣式:坐標、3D呈現、平移、旋轉。

(1)坐標

屏幕的起點坐標是(0,0,0),往右遞增為 x 方向,使用 left 屬性表示,往下走,遞增為 y 方向,使用 top 屬性表示。而 3D 場景中 z 正方向(遞增)為走出屏幕到你面前的方向。

但這個坐標的起點不一定得是屏幕,只是遵循相同的方向。當元素使用 position:absolute 來絕對定位時,其位置坐標是以最近的 position:relative 父元素為(0,0,0) 來計算的,因此,我們繪製一個3D場景時,通常會定義一個最外層的 position:relative 元素來進行場內發揮。

以下完整的頁面代碼,會繪製一個x,y,z坐標軸,會使用到本文涉及的各個內容,後邊的內容均以此頁面為基礎,便於動手體驗。

<!DOCTYPE html>
<html> 
<head>
    <meta charset="utf-8" /> 
    <title>CSS3 魔方</title>
    <!-- 樣式部分全寫這裡 -->
    <style>  
    .wrap {
        transform-style: preserve-3d;
        width: 300px;  height: 300px; 
        position: relative;  /* 定位起點元素 */
        border-top:solid 1px gray;  /* x 軸 */
        border-left:solid 1px gray;  /* y 軸 */
        /* 傾斜一點方能見立體效果 */
        transform: rotateX(-30deg) rotateY(-30deg); 
    }

    /* z 軸正方向 */
    .zaxis_p { 
        position:absolute; 
        width : 300px;
        height:1px;  
        border-top:solid 1px gray; 
        /* xy面上,90度立起來就是 z */
        transform: rotateY(-90deg); 
        /* 立起來的旋轉點 */
        transform-origin:0 0 0; 
    }

    /* z 軸負方向 */
    .zaxis_n { 
        position:absolute; 
        width : 300px;
        height:1px;  
        border-top:dashed 1px gray; /*(虛線)*/
        transform: rotateY(90deg);
        transform-origin:0 0 0; 
    }
    </style> 
</head>

<body style="padding:300px;">
  <div class="wrap">
    <div class="zaxis_p"></div> 
    <div class="zaxis_n"></div> 
  </div>
</body>

</html>

效果如下圖:

(2)3D 呈現

transform-style: preserve-3d;

上邊繪製的坐標軸,最外層的 wrap 有 transform-style: preserver-3d 屬性,它表示,它是維持其三維態的,其子元素可在其三個維度空間施展。如果沒有此項,子元素在 z 空間上是沒有作用的,也即我們的 z 軸會變成一個點。

(3)平移

沿著坐標軸的方向保持姿勢移動,對於 x 與 y 軸而言,移動可以通過改變 left,top 值來達到目的,對於 z 軸(x,y軸同樣適用)則使用平移樣式。如,讓元素在 z 軸上後移 200個像素,讓其在上邊坐標z軸的虛線上,我們可以使用:

transform: tanslateZ(-200px);  

我們在坐標中添加一個元素,其樣式定義如下:

.square {
    position:absolute;
    width:100px; height:100px;
    background:green;
    top:0; left:0;
    transform:translateZ(-200px);
}

<div class="square"></div>

效果如下:

(4)旋轉

物體的旋轉與轉動的軸心點有關,就像一個球,我們可以掛一根繩子轉大圈,也可以直接轉它,這個軸心與以下樣式定義有關:

transform-origin:0 0 0;  

後邊的這個" 0 0 0 "的值為相對位置,是以元素自身為起點來算的。所以,具體到每個元素,這個(0,0,0)表示的是該元素的起點位置,與別的元素無關。有關transform-origin 更多的描述與用法可參考相關資料。

有了旋轉軸心點,在方向上給個角度就可以了。如,繞 z 軸旋轉 45 度。

transform: rotateZ(45deg);

度數可正可負,每一根坐標軸,把軸的正向對準你的眼睛(對準鼻梁也不錯),此時,順時針為正角度,逆時針為負角度。

旋轉的示例,在下邊的綜合示例中給出。

(5)動畫

CSS3 形成動畫效果有兩種方式,其本質都是呈現樣式屬性值的變化過程。

第一種方式

定義一個關鍵幀(@keyframes)樣式體表示變化過程,並取個名字。然後,使用 animation 屬性指定該名字讓元素動起來。這種方式功能強大,對時間軸內的動畫定義能力強,可以按百分比定義每一段的屬性變化值。我們以讓上邊定義的 square 在 z 軸上邊繞 z 軸轉邊從 -200px 平移到 200px 為例來體驗一下。

/*設置動畫關鍵幀,名字為 movez */
@keyframes movez { 
    0% {  /* 從這樣的屬性開始 */
        transform: translateZ(-200px) rotateZ(0deg);
    }
    100% { /* 變化到這樣的屬性 */
        transform: translateZ(200px) rotateZ(3600deg);
    }
} 

.square {
    position:absolute;
    width:100px; height:100px;
    background:green;
    top:0; left:0;
    transform-origin:0 0 0; 
    /* 按 movez 來呈現動畫過程 */
    animation:movez 10s linear infinite;
}

效果如下:

第二種方式

使用屬性 transition 指定一個屬性和一個時長,只要這個屬性值發生變化,它就按規定的時長進行漸變形成動畫。

我們回到平移的那個 square,為其添加 transition 屬性,指明 transform,時長設置為 5s,即5秒。

.square {
    position:absolute;
    width:100px; height:100px;
    background:green;
    top:0; left:0;
    transform:translateZ(-200px);
    /* 指定漸變屬性,時長 */
    transition: transform 5s;
}

此時,我們來改變它的 transform 平移值:

<script>
setTimeout(
    function(){
        document.querySelector(".square").style.transform = "translateZ(200px)";
    }, 
    1000
);
</script>

效果如下,多麼優雅的一個變化過程,軟著陸。

(6)小結

熟悉以上了這些概念與特性,就有了達成魔方目標的工具。更多特性若有興趣,可進一步加深瞭解,想象空間很大。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 提筆又不知從何說起, 畢竟頭髮還茂盛,離大神就差一頭秀髮的距離, 所以此文不講技術, 只是單純的總結一下我是怎麼入坑的。本人前端打雜的,不喜勿噴。 17年7月我畢業了, 可我並不知道未來在何方, 我該做什麼,大學四年給我的只是一紙證書 由於家在南方, 所以就選擇了深圳這個繁華又孤獨的城市, 搜索和專 ...
  • Egg.js 簡介 Egg.js 為企業級框架和應用而生 ,幫助開發團隊和開發人員降低開發和維護成本。 專註於提供 Web 開發的核心功能和一套靈活可擴展的插件機制,不會做出技術選型,因為固定的技術選型會使框架的擴展性變差,無法滿足各種定製需求。 Egg 的插件機制有很高的可擴展性, 一個插件只做一 ...
  • 語義化的主要目的可以概括為用正確的標簽做正確的事。 HTML語義化可以讓頁面的內容結構化,便於瀏覽器解析和搜索引擎解析,並提高代碼的可維護度和可重用性。 儘可能少的使用無語義的標簽<div>,多用語義化標簽<header><section><footer> ...
  • BFC
    BFC(Block formatting context)塊級格式化上下文,是一個獨立的渲染區域。 一、如何觸發BFC: 1、根元素(html); 2、設置float除none意外的值(left ,right); 3、設置overflow 除visible 以外的值(hidden,auto,srol ...
  • 一、html,css部分 二、js部分 三、源代碼部分 ...
  • 一、html,css部分 二、js部分 三、源代碼部分 四、圖片img ...
  • css學習一周後,寫了個基礎博客樣式。 樣式是出來了,但是在寫的過程中感覺css寫的雜亂無章,可能是寫的太少了吧,條例不是很清除,只是在寫的過程 中一個點一個點的套,感覺樣式出來即可,沒有做到由全局出發考慮再到局部,再到細節的考慮。 總共耗時4個小時,寫的時候 html 部分頭腦很清晰,可以做到心中 ...
  • 根據Bootstrap--Grid 中 col-sm-* col-md-* col-lg-* col-xl-*的意義: .col-sm-* 小屏幕 手機 (≥ 576px) .col-md-* 中等屏幕 平板 (≥ 768px) .col-lg-* 大屏幕 桌面顯示器 (≥ 992px) .col- ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...