最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用JavaScript實(shí)現(xiàn)簡(jiǎn)單3D開關(guān)書本模型

 更新時(shí)間:2023年11月03日 11:27:10   作者:sAnL1ng散陵  
這篇文章主要為大家詳細(xì)介紹了如何利用JavaScript實(shí)現(xiàn)簡(jiǎn)單3D開關(guān)書本模型的效果,文中的實(shí)現(xiàn)代碼講解的非常詳細(xì),具有一定參考價(jià)值,感興趣的同學(xué)可以動(dòng)手嘗試一下

序言

今天我們不聊干貨,來(lái)看一些用JS也能實(shí)現(xiàn)的輕松有趣的小Demo,首先我們先看實(shí)驗(yàn)效果圖。

看完這張圖后 直接把代碼附上!

HTML代碼

<!DOCTYPE html>
<html lang="en">
<head>
? ? <meta charset="UTF-8">
? ? <meta name="viewport" content="width=device-width, initial-scale=1.0">
? ? <title>Document</title>
? ? <link rel="stylesheet" href="style.css" rel="external nofollow"  rel="external nofollow" >
</head>
<body>
? ? <div class="book p3d">

? ? ? ? <div class="front-cover p3d">
? ? ? ? ? <div class="inside page p3d flip">
? ? ? ? ? ? <p>瓦羅蘭特(VALORANT)是一款第一人稱FPS游戲。
? ? ? ? ? ? ? ? 與傳統(tǒng)FPS游戲不同,游戲中每個(gè)角色都擁有其不一樣的技能,小隊(duì)角色之間的技能互相搭配進(jìn)攻能發(fā)揮更強(qiáng)的作用。
? ? ? ? ? ? ? ? 背景設(shè)定:在近未來(lái)的地球世界里,全球范圍遭遇了一個(gè)重要的事件,名為First Light(原初之光),這個(gè)事件改變了地球,帶來(lái)了生命、科技和政府運(yùn)行的大轉(zhuǎn)變。
? ? ? ? ? ? ? ? 部分地球人在這個(gè)事件中獲得了超能力,這些擁有超能力的人們被稱為“Radiants(輻射人)”,意味著他們是被原初之光輻射從而獲得了超能力。</p>
? ? ? ? ? </div>
? ? ? ? ? <div class="outside page"></div>
? ? ? ? </div>
? ? ? ? <div class="back-cover p3d">
? ? ? ? ? ? <div class="outside page p3d">
? ? ? ? ? ? ? ? <div class="inside page p3d">
? ? ? ? ? ? ? ? ? ? <div class="shadow"></div>
? ? ? ? ? ? ? ? ? ? <div class="card"></div>
? ? ? ? ? ? ? ? </div>
? ? ? ? ? ? </div>
? ? ? ? </div>
? ? </div>
? ? <script src="index.js"></script>
</body>
</html>

CSS代碼

*{
? ? margin: 0;
? ? padding: 0;
? ? border: 0;
? ? vertical-align: baseline;
? ? box-sizing: border-box; ?/*將容器聲明成IE模型*/
}

html{
? ? height: 100%;
}

body{
? ? height: 100%;
? ? font: 100% / 1.25 Helvetica,arial,sans-serif;
? ? perspective: 1000px;
? ? background-color: #444;
? ? background-image: linear-gradient(to bottom,#444,#999);
}

.p3d{
? ? transform-style: preserve-3d;
}

.book{
? ? width: 300px;
? ? height: 300px;
? ? position: absolute;
? ? left: 50%;
? ? top: 50%;
? ? /* transform: translateY(-50%); */
? ? margin-top: -150px;
? ? color: #fff;
? ? -webkit-transform: rotateX(60deg);
? ? -moz-transform: rotateX(60deg);
? ? -o-transform: rotateX(60deg);
? ? user-select: none;
}

.front-cover{
? ? cursor: move;
? ? transform-origin: 0 50%;
? ? transform: rotateY(0deg);

}

.page{
? ? width: 300px;
? ? height: 300px;
? ? padding: 1em;/*相對(duì)父容器大小*/
? ? position: absolute;/*脫離文檔流*/
? ? left: 0;
? ? top: 0;
? ? text-indent: 2em;
}


.inside{
? ? background-color: #2a0303;
}

.outside{
? ? background-color: #fff;
}

.front-cover .outside{
? ? background-image: url(https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.nga.178.com%2Fattachments%2Fmon_202006%2F02%2FjoQ5-38t6XlZ5pT3cS2yo-1o0.png&refer=http%3A%2F%2Fimg.nga.178.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1700461884&t=fb89517f74280d519c31d1b97adb1af3);
? ? background-repeat: no-repeat;
? ? background-size: cover;
? ? transform: translateZ(3px);
? }

.flip{
? ? transform: rotateY(180deg);
}

.back-cover .outside{
? ? transform: translateZ(-3px);
}

.back-cover .inside{
? ? background-color: #1e0000;
}

.card,
.shadow{
? ? width: 196px;
? ? height: 132px;
? ? position: absolute;
? ? left: 60px;
? ? top: 60px;
? ? transform-origin: 0 100%;
}

.shadow{
? ? background-color: rgba(0,0,0,0.5);
}

.card{
? ? background-image: url(https://images.9k9k.com/m/gamelib/202011/90947_zkyz.jpg);
? ? background-size: cover;
? ? transform-origin: 0 100%;
}

JS代碼

var front = document.getElementsByClassName('front-cover')[0]
var book = document.getElementsByClassName('book')[0]
var card = document.getElementsByClassName('card')[0]
var shadow = document.getElementsByClassName('shadow')[0]

var hlod = false
var clamp = function(val,min,max){
? ? return Math.max(min,Math.min(val,max))
}

//鼠標(biāo)是否按下
front.onmousedown = function(){
? ? hlod = true
}

//在window上監(jiān)聽鼠標(biāo)松開
window.onmouseup = function(){
? ? hlod = false
}

window.onmousemove = function(e){
? ? if(hlod){
? ? ? ? //修改左半邊書的角度,卡片旋轉(zhuǎn),陰影傾斜
? ? ? ? var deg = clamp((window.innerWidth / 2 - e.x + 300) / 300 * -90, -180, 0)
? ? ? ? front.style.transform = `rotateY(${deg}deg)`
? ? ? ? //整本書立起來(lái) 60 + deg / 8
? ? ? ? book.style.transform = `rotateX(${60 + deg / 8}deg)`
? ? ? ? //卡片 deg / 2
? ? ? ? card.style.transform = `rotateX(${deg / 3}deg)`
? ? ? ? //陰影傾斜 deg / 8 (css樣式傾斜)
? ? ? ? shadow.style.transform = `skew(${deg / 8}deg)`

? ? }
}

console.log(front);

var front = document.getElementsByClassName('front-cover')[0]
var book = document.getElementsByClassName('book')[0]
var card = document.getElementsByClassName('card')[0]
var shadow = document.getElementsByClassName('shadow')[0]

var hlod = false
var clamp = function(val,min,max){
? ? return Math.max(min,Math.min(val,max))
}

//鼠標(biāo)是否按下
front.onmousedown = function(){
? ? hlod = true
}

//在window上監(jiān)聽鼠標(biāo)松開
window.onmouseup = function(){
? ? hlod = false
}

window.onmousemove = function(e){
? ? if(hlod){
? ? ? ? //修改左半邊書的角度,卡片旋轉(zhuǎn),陰影傾斜
? ? ? ? var deg = clamp((window.innerWidth / 2 - e.x + 300) / 300 * -90, -180, 0)
? ? ? ? front.style.transform = `rotateY(${deg}deg)`
? ? ? ? //整本書立起來(lái) 60 + deg / 8
? ? ? ? book.style.transform = `rotateX(${60 + deg / 8}deg)`
? ? ? ? //卡片 deg / 2
? ? ? ? card.style.transform = `rotateX(${deg / 3}deg)`
? ? ? ? //陰影傾斜 deg / 8 (css樣式傾斜)
? ? ? ? shadow.style.transform = `skew(${deg / 8}deg)`

? ? }
}

console.log(front);

代碼解釋

html部分

引入文件

我們創(chuàng)建的CSS和js文件都需要引入到html文件中

在頭部標(biāo)記里用link方法引入css文件

<head>
<link rel="stylesheet" href="style.css" rel="external nofollow"  rel="external nofollow" >
</head>

在body里用< script >標(biāo)簽引入js文件

<body>
<script src="index.js"></script>
</body>

HTML框架構(gòu)建(BEM命名法)

我們將整本書分成了多個(gè)部分,總體就是一個(gè)book,然后根據(jù)想要實(shí)現(xiàn)的效果或者其功能將其劃分成不同子塊

<div class="book p3d">
? ? ? ? <div class="front-cover p3d">
? ? ? ? ? <div class="inside page p3d flip">
? ? ? ? ? ? <p>
? ? ? ? ? </div>
? ? ? ? ? <div class="outside page"></div>
? ? ? ? </div>
? ? ? ? <div class="back-cover p3d">
? ? ? ? ? ? <div class="outside page p3d">
? ? ? ? ? ? ? ? <div class="inside page p3d">
? ? ? ? ? ? ? ? ? ? <div class="shadow"></div>
? ? ? ? ? ? ? ? ? ? <div class="card"></div>
? ? ? ? ? ? ? ? </div>
? ? ? ? ? ? </div>
? ? ? ? </div>
? ? </div>

結(jié)構(gòu)劃分完了剩下的交給CSS樣式編寫就可以了。

CSS樣式編寫

*{
? ? margin: 0;
? ? padding: 0;
? ? border: 0;
? ? vertical-align: baseline;
? ? box-sizing: border-box; ?/*將容器聲明成IE模型*/
}

瀏覽器默認(rèn)會(huì)給body加一個(gè)內(nèi)外邊距,所以我們將其設(shè)置為0,之前文章我們了解知道了,CSS中有兩種盒模型,我們現(xiàn)在將其設(shè)置為box-sizing:border-box IE盒模型,為了讓頁(yè)面效果更完美的展現(xiàn)出來(lái)。

-webkit-transform: rotateX(60deg);
? ? -moz-transform: rotateX(60deg);
? ? -o-transform: rotateX(60deg);

-webkit-transform、-moz-transform、-o-transform分別是針對(duì)不同瀏覽器的前綴,以兼容不同瀏覽器。在現(xiàn)代瀏覽器中,大多數(shù)已經(jīng)支持transform屬性并可以省略前綴。

這里我們是將元素繞X軸旋轉(zhuǎn)60度,但需要注意編寫的時(shí)候具體怎么設(shè)置角度,我們需要還要根據(jù)頁(yè)面呈現(xiàn)效果和其他樣式屬性來(lái)確定。

.page{
? ? width: 300px;
? ? height: 300px;
? ? padding: 1em;
? ? position: absolute;
? ? left: 0;
? ? top: 0;
? ? text-indent: 2em;
}

padding: 1em; em是指相對(duì)父容器大小

position: absolute;會(huì)導(dǎo)致其脫離文檔流

JS交互功能編寫

在這段JS代碼中,主要是用來(lái)實(shí)現(xiàn)當(dāng)我們通過鼠標(biāo)拖拽前封面(front)時(shí),會(huì)觸發(fā)相應(yīng)的事件,從而控制頁(yè)面元素的旋轉(zhuǎn)角度,實(shí)現(xiàn)一個(gè)交互效果。

var front = document.getElementsByClassName('front-cover')[0]
var book = document.getElementsByClassName('book')[0]
var card = document.getElementsByClassName('card')[0]
var shadow = document.getElementsByClassName('shadow')[0]

具體來(lái)說(shuō),首先通過document.getElementsByClassName()方法獲取了front、book、card、shadow四個(gè)元素。

front.onmousedown = function(){
? ? hlod = true
}

并定義了hlod變量表示鼠標(biāo)是否按下。

front.onmousedown = function(){
? ? hlod = true
}

window.onmouseup = function(){
? ? hlod = false
}

接下來(lái),代碼通過給front元素綁定mousedown事件來(lái)監(jiān)聽鼠標(biāo)按下的動(dòng)作,當(dāng)鼠標(biāo)按下時(shí),將hlod設(shè)為true。然后,通過給window綁定mousemove和mouseup事件來(lái)監(jiān)聽鼠標(biāo)移動(dòng)和松開的動(dòng)作。當(dāng)鼠標(biāo)移動(dòng)時(shí),如果hlod為true,就計(jì)算出deg的值,其值由用戶當(dāng)前鼠標(biāo)位置決定。clamp()函數(shù)用于限制deg變量的取值范圍在-180到0之間。隨后,代碼通過修改相應(yīng)元素的transform屬性來(lái)實(shí)現(xiàn)立體旋轉(zhuǎn)的效果:front元素繞Y軸旋轉(zhuǎn)deg度,book元素繞X軸旋轉(zhuǎn)60 + deg / 8度,card元素繞X軸旋轉(zhuǎn)deg / 3度,shadow元素skew傾斜deg / 8度。其中,模板字面量語(yǔ)法被用來(lái)構(gòu)建包含變量的字符串,方便設(shè)置transform的屬性值。

最后,console.log()函數(shù)用于輸出front元素的信息用于檢查調(diào)整。

以上就是利用JavaScript實(shí)現(xiàn)簡(jiǎn)單3D開關(guān)書本模型的詳細(xì)內(nèi)容,更多關(guān)于JavaScript 3D開關(guān)書本的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • javascript之通用簡(jiǎn)單的table選項(xiàng)卡實(shí)現(xiàn)(二)

    javascript之通用簡(jiǎn)單的table選項(xiàng)卡實(shí)現(xiàn)(二)

    上篇中的選項(xiàng)卡存在這樣的問題:把邏輯封裝在table.js中,不夠靈活,也就是說(shuō)如果某個(gè)選項(xiàng)卡是實(shí)現(xiàn)異步請(qǐng)求或者跳轉(zhuǎn),而非div的顯隱切換,那么就得修過table.js來(lái)達(dá)到目的,顯然不是我所需要的。
    2010-05-05
  • Webpack中使用環(huán)境變量的各種正確姿勢(shì)

    Webpack中使用環(huán)境變量的各種正確姿勢(shì)

    我們?cè)陂_發(fā)項(xiàng)目中都會(huì)遇到這種場(chǎng)景,區(qū)分開發(fā)環(huán)境、生產(chǎn)環(huán)境、測(cè)試環(huán)境,不同場(chǎng)景請(qǐng)求不同的接口Api,這時(shí)候項(xiàng)目中配置的「環(huán)境變量」就登場(chǎng)啦,這篇文章主要給大家介紹了關(guān)于Webpack中使用環(huán)境變量的各種正確姿勢(shì),需要的朋友可以參考下
    2021-09-09
  • JavaScript易錯(cuò)知識(shí)點(diǎn)整理

    JavaScript易錯(cuò)知識(shí)點(diǎn)整理

    本文主要對(duì)JavaScript易錯(cuò)知識(shí)點(diǎn)進(jìn)行整理和匯總。需要的朋友可以看下,希望對(duì)大家有所幫助
    2016-12-12
  • js加減乘除丟失精度問題解決方法

    js加減乘除丟失精度問題解決方法

    在javascript中,帶小數(shù)的數(shù)據(jù)運(yùn)算時(shí)總會(huì)出現(xiàn)好多位小數(shù).這是因?yàn)樵趈avascript中浮點(diǎn)數(shù)的計(jì)算是以2進(jìn)制計(jì)算的
    2014-05-05
  • 復(fù)制網(wǎng)頁(yè)內(nèi)容,粘貼之后自動(dòng)加上網(wǎng)址的實(shí)現(xiàn)方法(腳本之家特別整理)

    復(fù)制網(wǎng)頁(yè)內(nèi)容,粘貼之后自動(dòng)加上網(wǎng)址的實(shí)現(xiàn)方法(腳本之家特別整理)

    復(fù)制內(nèi)容加網(wǎng)址的功能,自06年腳本之家將這個(gè)功能發(fā)布并通過blueidea宣傳以后,現(xiàn)如今很多網(wǎng)站都使用上了, 當(dāng)初我們也由這個(gè)功能帶來(lái)很多外鏈
    2014-10-10
  • HTML5+setCutomValidity()函數(shù)驗(yàn)證表單實(shí)例分享

    HTML5+setCutomValidity()函數(shù)驗(yàn)證表單實(shí)例分享

    本文給大家分享的是在HTML5中結(jié)合setCutomValidity()函數(shù)實(shí)現(xiàn)驗(yàn)證表單的實(shí)例,非常的時(shí)間實(shí)用,這里推薦給大家,有需要的小伙伴可以參考下。
    2015-04-04
  • ionic 自定義彈框效果

    ionic 自定義彈框效果

    這篇文章主要介紹了ionic 自定義彈框效果,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-06-06
  • js前端存儲(chǔ)之sessionStorage使用方法舉例

    js前端存儲(chǔ)之sessionStorage使用方法舉例

    sessionStorage是指本地存儲(chǔ)一個(gè)會(huì)話中的數(shù)據(jù),這些數(shù)據(jù)只有在同一個(gè)會(huì)話中的頁(yè)面才能訪問并且當(dāng)會(huì)話結(jié)束后數(shù)據(jù)也隨之銷毀,這篇文章主要給大家介紹了關(guān)于js前端存儲(chǔ)之sessionStorage使用方法的相關(guān)資料,需要的朋友可以參考下
    2024-06-06
  • js關(guān)于精確計(jì)算和數(shù)值格式化以及直接引js文件

    js關(guān)于精確計(jì)算和數(shù)值格式化以及直接引js文件

    本文為大家介紹下關(guān)于精確計(jì)算和數(shù)值格式化以及直接引js文件,大家可以學(xué)習(xí)下
    2014-01-01
  • 微信小程序組件生命周期的踩坑記錄

    微信小程序組件生命周期的踩坑記錄

    這篇文章主要給大家介紹了關(guān)于微信小程序組件生命周期的踩坑記錄,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評(píng)論

西藏| 自治县| 阿瓦提县| 广州市| 屏南县| 新巴尔虎左旗| 和田县| 永修县| 牟定县| 鄂尔多斯市| 黄浦区| 巴南区| 罗江县| 米脂县| 聂拉木县| 永安市| 盐亭县| 平舆县| 金沙县| 陆川县| 科尔| 靖江市| 汉沽区| 新安县| 泰顺县| 方城县| 榆树市| 凤城市| 宝应县| 汾西县| 永济市| 司法| 台东市| 屏山县| 日照市| 出国| 昭苏县| 怀来县| 丰都县| 旌德县| 翁牛特旗|