整合營銷服務商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          21.HTML 浮動、定位和顯示屬性

          SS中的浮動(Floats)、定位(Positioning)和顯示(Display)屬性是前端工程師掌握頁面布局的關(guān)鍵。本文將深入探討這些屬性的工作原理和使用場景,幫助開發(fā)者更好地理解和運用它們來構(gòu)建響應式和精確的網(wǎng)頁布局。

          浮動(Float)

          浮動是CSS中用于實現(xiàn)元素排列的一種方式,它可以讓元素脫離正常的文檔流,并可以向左或向右移動,直到它的外邊緣碰到包含框或另一個浮動元素的邊緣。

          .element {
            float: left; /* 或者 'right' */
          }
          

          使用場景

          • 文字環(huán)繞圖片。
          • 創(chuàng)建水平導航欄。
          • 無網(wǎng)格系統(tǒng)時的列布局。

          注意事項

          • 清除浮動(Clearing Floats):使用clear屬性可以防止元素被浮動元素覆蓋。
          .clear-element {
            clear: both; /* 可以是 'left', 'right', 或 'both' */
          }
          
          • 包含浮動(Containing Floats):浮動元素的父容器可能不會擴展以包含浮動的子元素,可以通過清除浮動或使用其他技術(shù)(如overflow)來解決這個問題。
          • 浮動塌陷(Float Collapse):浮動元素不占據(jù)空間,可能導致父元素高度塌陷。

          定位(Position)

          定位屬性允許你控制元素的位置,它可以是相對于它的正常位置、相對于最近的已定位祖先元素、相對于視口或絕對位置。

          .element {
            position: static | relative | absolute | fixed | sticky;
          }
          

          使用場景

          • 相對定位(Relative Positioning):元素相對于其正常位置進行偏移。
          .relative-element {
            position: relative;
            top: 10px;
            left: 20px;
          }
          
          • 絕對定位(Absolute Positioning):元素相對于最近的已定位父元素進行定位。
          .absolute-element {
            position: absolute;
            top: 0;
            right: 0;
          }
          
          • 固定定位(Fixed Positioning):元素相對于視口進行定位,即使頁面滾動也不會移動。
          .fixed-element {
            position: fixed;
            bottom: 0;
            left: 0;
          }
          
          • 粘性定位(Sticky Positioning):元素基于用戶的滾動位置在相對和固定定位之間切換。
          .sticky-element {
            position: sticky;
            top: 10px;
          }
          

          注意事項

          • 定位元素可能會脫離文檔流,影響周圍元素的布局。
          • z-index屬性可以控制堆疊順序。
          • 絕對定位元素的容器應有position: relative;,以便正確定位。

          顯示(Display)

          display屬性是CSS中最重要的用于控制布局的屬性之一,它定義了元素如何顯示在頁面上。

          .element {
            display: block | inline | inline-block | flex | grid | none;
          }
          

          使用場景

          • 塊級元素(Block):display: block;使元素表現(xiàn)為塊級,占據(jù)新的行。
          .block-element {
            display: block;
          }
          
          • 內(nèi)聯(lián)元素(Inline):display: inline;使元素在文本行中顯示,不開始新行。
          .inline-element {
            display: inline;
          }
          
          • 內(nèi)聯(lián)塊元素(Inline-Block):display: inline-block;允許元素并排排列,同時擁有塊級元素的寬度和高度屬性。
          .inline-block-element {
            display: inline-block;
          }
          
          • 彈性盒子(Flex):display: flex;創(chuàng)建了一個彈性容器,其子元素可以靈活地在容器內(nèi)排列。
          .flex-container {
            display: flex;
          }
          
          • 網(wǎng)格(Grid):display: grid;創(chuàng)建了一個網(wǎng)格容器,可以定義行和列以及在網(wǎng)格內(nèi)放置元素。
          .grid-container {
            display: grid;
          }
          
          • 隱藏元素(None):display: none;將元素隱藏,且不為元素保留空間。
          .hidden-element {
            display: none;
          }
          

          注意事項

          • 使用display: none;與visibility: hidden;的區(qū)別在于后者仍保留元素占據(jù)的空間。
          • display: flex;和display: grid;為現(xiàn)代布局提供了更多控制,通常比浮動和定位更優(yōu)。

          示例

          HTML結(jié)構(gòu)

          <!DOCTYPE html>
          <html lang="en">
          <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>CSS Float, Position, and Display Example</title>
          <link rel="stylesheet" href="styles.css">
          </head>
          <body>
          
          <div class="header">
            <div class="logo">Logo</div>
            <div class="navigation">Navigation</div>
          </div>
          
          <div class="main-content">
            <div class="sidebar">Sidebar</div>
            <div class="content">Content</div>
          </div>
          
          <div class="footer">Footer</div>
          
          <div class="fixed-element">Fixed Element</div>
          
          </body>
          </html>
          

          CSS樣式

          /* Reset some default styles */
          body, h1, p {
            margin: 0;
            padding: 0;
          }
          
          /* Header styles */
          .header {
            background-color: #f8f8f8;
            border-bottom: 1px solid #e7e7e7;
            padding: 10px;
            overflow: hidden; /* Clearfix for floated elements */
          }
          
          .logo {
            float: left;
            font-size: 24px;
          }
          
          .navigation {
            float: right;
            font-size: 18px;
          }
          
          /* Main content styles */
          .main-content {
            padding: 20px;
          }
          
          .sidebar {
            float: left;
            width: 200px;
            background-color: #ddd;
            padding: 10px;
          }
          
          .content {
            margin-left: 220px; /* Make space for the sidebar */
            background-color: #eee;
            padding: 10px;
          }
          
          /* Footer styles */
          .footer {
            background-color: #f8f8f8;
            border-top: 1px solid #e7e7e7;
            text-align: center;
            padding: 10px;
            position: relative; /* For demonstration purposes */
            top: 20px; /* Move the footer down a bit */
          }
          
          /* Fixed element styles */
          .fixed-element {
            position: fixed;
            bottom: 10px;
            right: 10px;
            padding: 5px 10px;
            background-color: #333;
            color: #fff;
            z-index: 1000; /* Ensure it stays on top */
          }
          
          /* Clearfix hack */
          .clearfix::after {
            content: "";
            clear: both;
            display: table;
          }
          

          在這個例子中,我們創(chuàng)建了一個包含頭部、側(cè)邊欄、主要內(nèi)容和頁腳的基本布局。我們使用浮動來對齊頭部的Logo和導航,以及創(chuàng)建一個側(cè)邊欄。我們還使用了相對定位來稍微下移頁腳,并使用固定定位為頁面添加了一個始終可見的固定元素。最后,我們使用了overflow: hidden;來清除頭部中浮動元素的影響。

          結(jié)語

          浮動、定位和顯示屬性是CSS中構(gòu)建復雜布局的強大工具。通過深入理解和正確應用這些屬性,前端工程師可以創(chuàng)建出既美觀又功能強大的網(wǎng)頁。隨著Web標準的不斷發(fā)展,我們也需要不斷學習和適應新的CSS特性,以保持我們技能的前沿性。

          自IT Next,作者:Vincent Mühler,機器之心編譯,參與:Geek AI、張倩。

          本文將為大家介紹一個建立在「tensorflow.js」內(nèi)核上的 javascript API——「face-api.js」,它實現(xiàn)了三種卷積神經(jīng)網(wǎng)絡(luò)架構(gòu),用于完成人臉檢測、識別和特征點檢測任務,可以在瀏覽器中進行人臉識別。

          號外!號外!現(xiàn)在人們終于可以在瀏覽器中進行人臉識別了!本文將為大家介紹「face-api.js」,這是一個建立在「tensorflow.js」內(nèi)核上的 javascript 模塊,它實現(xiàn)了三種卷積神經(jīng)網(wǎng)絡(luò)(CNN)架構(gòu),用于完成人臉檢測、識別和特征點檢測任務。

          • face-api.js:https://github.com/justadudewhohacks/face-api.js
          • TensorFlow.js:https://github.com/tensorflow/tfjs-core

          像往常一樣,我們將查看一個簡單的代碼示例,這將使你能立即通過短短幾行代碼中的程序包開始了解這個 API。讓我們開始吧!

          我們已經(jīng)有了「face-recognition.js」,現(xiàn)在又來了另一個同樣的程序包?

          如果你閱讀過本文作者另一篇關(guān)于「node.js」環(huán)境下進行人臉識別的文章《Node.js + face-recognition.js : Simple and Robust Face Recognition using Deep Learning》(Node.js + face-recognition.js:通過深度學習實現(xiàn)簡單而魯棒的人臉識別)(https://medium.com/@muehler.v/node-js-face-recognition-js-simple-and-robust-face-recognition-using-deep-learning-ea5ba8e852),你就會知道他在之前組裝過一個類似的程序包,例如「face-recgnition.js」,從而為「node.js」引入了人臉識別功能。

          起初,作者并沒有預見到 JavaScript 社區(qū)對與人臉識別程序包的需求程度如此之高。對許多人而言,「face-recognition.js」似乎是一個不錯的、能夠免費試用的開源選項,它可以替代由微軟或亞馬遜等公司提供的付費人臉識別服務。但是作者曾多次被問道:是否有可能在瀏覽器中運行完整的人臉識別的工作流水線?

          多虧了「tensorflow.js」,這種設(shè)想最終變?yōu)榱爽F(xiàn)實!作者設(shè)法使用「tf.js

          」內(nèi)核實現(xiàn)了部分類似的工具,它們能得到和「face-recognition.js」幾乎相同的結(jié)果,但是作者是在瀏覽器中完成的這項工作!而且最棒的是,這套工具不需要建立任何的外部依賴,使用它非常方便。并且這套工具還能通過 GPU 進行加速,相關(guān)操作可以使用 WebGL 運行。

          這足以讓我相信,JavaScript 社區(qū)需要這樣的一個為瀏覽器環(huán)境而編寫的程序包!可以設(shè)想一下你能通過它構(gòu)建何種應用程序。

          如何利用深度學習解決人臉識別問題

          如果想要盡快開始實戰(zhàn)部分,那么你可以跳過這一章,直接跳到代碼分析部分去。但是為了更好地理解「face-api.js」中為了實現(xiàn)人臉識別所使用的方法,我強烈建議你順著這個章節(jié)閱讀下去,因為我常常被人們問到這個問題。

          為簡單起見,我們實際想要實現(xiàn)的目標是在給定一張人臉的圖像時,識別出圖像中的人。為了實現(xiàn)這個目標,我們需要為每一個我們想要識別的人提供一張(或更多)他們的人臉圖像,并且給這些圖像打上人臉主人姓名的標簽作為參考數(shù)據(jù)。現(xiàn)在,我們將輸入圖像和參考數(shù)據(jù)進行對比,找到與輸入圖像最相似的參考圖像。如果有兩張圖像都與輸入足夠相似,那么我們輸出人名,否則輸出「unknown」(未知)。

          聽起來確實是個好主意!然而,這個方案仍然存在兩個問題。首先,如果我們有一張顯示了多人的圖像,并且我們需要識別出其中所有的人,將會怎樣呢?其次,我們需要建立一種相似度度量手段,用來比較兩張人臉圖像。

          人臉檢測

          我們可以從人臉檢測技術(shù)中找到第一個問題的答案。簡單地說,我們將首先定位輸入圖像中的所有人臉。「face-api.js」針對人臉檢測工作實現(xiàn)了一個 SSD(Single Shot Multibox Detector)算法,它本質(zhì)上是一個基于 MobileNetV1 的卷積神經(jīng)網(wǎng)絡(luò)(CNN),在網(wǎng)絡(luò)的頂層加入了一些人臉邊框預測層。

          該網(wǎng)絡(luò)將返回每張人臉的邊界框,并返回每個邊框相應的分數(shù),即每個邊界框表示一張人臉的概率。這些分數(shù)被用于過濾邊界框,因為可能存在一張圖片并不包含任何一張人臉的情況。請注意,為了對邊界框進行檢索,即使圖像中僅僅只有一個人,也應該執(zhí)行人臉檢測過程。

          人臉特征點檢測及人臉對齊

          在上文中,我們已經(jīng)解決了第一個問題!然而,我想要指出的是,我們需要對齊邊界框,從而抽取出每個邊界框中的人臉居中的圖像,接著將其作為輸入傳給人臉識別網(wǎng)絡(luò),因為這樣可以使人臉識別更加準確!

          為了實現(xiàn)這個目標,「face-api.js」實現(xiàn)了一個簡單的卷積神經(jīng)網(wǎng)絡(luò)(CNN),它將返回給定圖像的 68 個人臉特征點:

          從特征點位置上看,邊界框可以將人臉居中。你可以從下圖中看到人臉檢測結(jié)果(左圖)與對齊后的人臉圖像(右圖)的對比:

          人臉識別

          現(xiàn)在,我們可以將提取出的對齊后的人臉圖像輸入到人臉識別網(wǎng)絡(luò)中,該網(wǎng)絡(luò)基于一個類似于 ResNet-34 的架構(gòu),基本上與 dlib(https://github.com/davisking/dlib/blob/master/examples/dnn_face_recognition_ex.cpp)中實現(xiàn)的架構(gòu)一致。該網(wǎng)絡(luò)已經(jīng)被訓練去學習出人臉特征到人臉描述符的映射(一個包含 128 個值的特征向量),這個過程通常也被稱為人臉嵌入。

          現(xiàn)在讓我們回到最初對比兩張人臉圖像的問題:我們將使用每張抽取出的人臉圖像的人臉描述符,并且將它們與參考數(shù)據(jù)的人臉描述符進行對比。更確切地說,我們可以計算兩個人臉描述符之間的歐氏距離,并根據(jù)閾值判斷兩張人臉圖像是否相似(對于 150*150 的圖像來說,0.6 是一個很好的閾值)。使用歐氏距離的效果驚人的好,當然,你也可以選用任何一種分類器。下面的 gif 動圖可視化了通過歐氏距離比較兩張人臉圖像的過程:

          至此,我們已經(jīng)對人臉識別的理論有所了解。接下來讓我們開始編寫一個代碼示例。

          是時候開始編程了!

          在這個簡短的示例中,我們將看到如何一步步地運行人臉識別程序,識別出如下所示的輸入圖像中的多個人物:

          導入腳本

          首先,從 dist/face-api.js 獲得最新的版本(https://github.com/justadudewhohacks/face-api.js/tree/master/dist),或者從 dist/face-api.min.js 獲得縮減版,并且導入腳本:

          <script src="face-api.js"></script>

          如果你使用 npm 包管理工具,可以輸入如下指令:

          npm i face-api.js

          加載模型數(shù)據(jù)

          你可以根據(jù)應用程序的要求加載你需要的特定模型。但是如果要運行一個完整的端到端的示例,我們還需要加載人臉檢測、人臉特征點檢測和人臉識別模型。相關(guān)的模型文件可以在代碼倉庫中找到,鏈接如下:https://github.com/justadudewhohacks/face-api.js/tree/master/weights。

          其中,模型的權(quán)重已經(jīng)被量化,文件大小相對于初始模型減小了 75%,使你的客戶端僅僅需要加載所需的最少的數(shù)據(jù)。此外,模型的權(quán)重被分到了最大為 4 MB 的數(shù)據(jù)塊中,使瀏覽器能夠緩存這些文件,這樣它們就只需要被加載一次。

          模型文件可以直接作為你的 web 應用中的靜態(tài)資源被使用,或者你可以將它們存放在另外的主機上,通過指定的路徑或文件的 url 鏈接來加載。假如你將它們與你在 public/models 文件夾下的資產(chǎn)共同存放在一個 models 目錄中:

          const MODEL_URL = '/models'

          await faceapi.loadModels(MODEL_URL)

          或者,如果你僅僅想要加載特定的模型:

          const MODEL_URL = '/models'

          await faceapi.loadFaceDetectionModel(MODEL_URL)

          await faceapi.loadFaceLandmarkModel(MODEL_URL)

          await faceapi.loadFaceRecognitionModel(MODEL_URL)

          從輸入圖像中得到對所有人臉的完整描述

          該神經(jīng)網(wǎng)絡(luò)可以接收 HTML 圖像、畫布、視頻元素或張量(tensor)作為輸入。為了檢測出輸入圖像中分數(shù)(score)大于最小閾值(minScore)的人臉邊界框,我們可以使用下面的簡單操作:

          const minConfidence = 0.8

          const fullFaceDescriptions = await faceapi.allFaces(input, minConfidence)

          一個完整的人臉描述符包含了檢測結(jié)果(邊界框+分數(shù)),人臉特征點以及計算出的描述符。正如你所看到的,「faceapi.allFaces」在底層完成了本文前面的章節(jié)所討論的所有工作。然而,你也可以手動地獲取人臉定位和特征點。如果這是你的目的,你可以參考 github repo 中的幾個示例。

          請注意,邊界框和特征點的位置與原始圖像/媒體文件的尺寸有關(guān)。當顯示出的圖像尺寸與原始圖像的尺寸不相符時,你可以簡單地通過下面的方法重新調(diào)整它們的大小:

          const resized = fullFaceDescriptions.map(fd => fd.forSize(width, height))

          我們可以通過將邊界框在畫布上繪制出來對檢測結(jié)果進行可視化:

          fullFaceDescription.forEach((fd, i) => {

          faceapi.drawDetection(canvas, fd.detection, { withScore: true })

          })

          可以通過下面的方法將人臉特征點顯示出來:

          fullFaceDescription.forEach((fd, i) => {

          faceapi.drawLandmarks(canvas, fd.landmarks, { drawLines: true })

          })

          通常,我會在 img 元素的頂層覆蓋一個具有相同寬度和高度的絕對定位的畫布(想獲取更多信息,請參閱 github 上的示例)。

          人臉識別

          當我們知道了如何得到給定的圖像中所有人臉的位置和描述符后,我們將得到一些每張圖片顯示一個人的圖像,并且計算出它們的人臉描述符。這些描述符將作為我們的參考數(shù)據(jù)。

          假設(shè)我們有一些可以用的示例圖片,我們首先從一個 url 鏈接處獲取圖片,然后使用「faceapi.bufferToImage」從它們的數(shù)據(jù)緩存中創(chuàng)建 HTML 圖像元素:

          // fetch images from url as blobs

          const blobs = await Promise.all(

          ['sheldon.png' 'raj.png', 'leonard.png', 'howard.png'].map(

          uri => (await fetch(uri)).blob()

          )

          )

          // convert blobs (buffers) to HTMLImage elements

          const images = await Promise.all(blobs.map(

          blob => await faceapi.bufferToImage(blob)

          ))

          接下來,在每張圖像中,正如我們之前對輸入圖像所做的那樣,我們對人臉進行定位、計算人臉描述符:

          const refDescriptions = await Promsie.all(images.map(

          img => (await faceapi.allFaces(img))[0]

          ))

          const refDescriptors = refDescriptions.map(fd => fd.descriptor)

          現(xiàn)在,我們還需要做的就是遍歷我們輸入圖像的人臉描述符,并且找到參考數(shù)據(jù)中與輸入圖像距離最小的描述符:

          const sortAsc = (a, b) => a - b

          const labels = ['sheldon', 'raj', 'leonard', 'howard']

          const results = fullFaceDescription.map((fd, i) => {

          const bestMatch = refDescriptors.map(

          refDesc => ({

          label: labels[i],

          distance: faceapi.euclideanDistance(fd.descriptor, refDesc)

          })

          ).sort(sortAsc)[0]

          return {

          detection: fd.detection,

          label: bestMatch.label,

          distance: bestMatch.distance

          }

          })

          正如前面提到的,我們在這里使用歐氏距離作為一種相似度度量,這樣做的效果非常好。我們在輸入圖像中檢測出的每一張人臉都是匹配程度最高的。

          最后,我們可以將邊界框和它們的標簽一起繪制在畫布上,顯示檢測結(jié)果:

          // 0.6 is a good distance threshold value to judge

          // whether the descriptors match or not

          const maxDistance = 0.6

          results.forEach(result => {

          faceapi.drawDetection(canvas, result.detection, { withScore: false })

          const text = `${result.distance < maxDistance ? result.className : 'unkown'} (${result.distance})`

          const { x, y, height: boxHeight } = detection.getBox()

          faceapi.drawText(

          canvas.getContext('2d'),

          x,

          y + boxHeight,

          text

          )

          })

          至此,我希望你對如何使用這個 API 有了一個初步的認識。同時,我也建議你看看文中給出的代碼倉庫中的其它示例。好好地把這個程序包玩?zhèn)€痛快吧!

          文會忽略一些過于基礎(chǔ)的知識和細節(jié)

          devtools——前端開發(fā)者的福音,進階高級工程師必須鍛造的利器

          先截圖看看chorme devtools

          目前新版本有以下菜單:

          • Elements 查看 DOM 樹
          • Console 控制臺
          • Sources 查看源碼以及打斷點
          • Network 記錄網(wǎng)絡(luò)請求信息
          • Performance 運行時性能表現(xiàn)(解析 JS、計算樣式、重繪等)
          • Memory JS對象和相關(guān)聯(lián)的 DOM 節(jié)點的內(nèi)存分布情況
          • Application 記錄資源(存儲信息、緩存信息以及頁面用到的圖片、字體、腳本、樣式等信息)
          • Security 檢測當面頁面的安全性
          • Audits 給出提高頁面性能的建議

          從本篇文章開始挨個捋

          Elements


          先個截圖,看看有哪些功能:

          1 . dom樹

          如上圖中的1區(qū)域,相信大家都是成熟的老油條了,簡單的不多贅述,這里講講選中元素后右鍵彈出的菜單

          右鍵菜單截圖

          • Hide element

          隱藏元素。這個必現(xiàn)說下,相信大家在看到廣告或者去掉迅雷種子(#。#正經(jīng))的遮罩層的時候一定想起自己的專業(yè)技能,那么你是display:none還是Delete element?其實Hide element更好用

          • Force state

          Force state

          強制狀態(tài),其實就是添加偽類。調(diào)試偽類樣式很好用:

          Force state > hover

          • Break on

          Break on

          斷點調(diào)試,沒錯html里也可打斷點的

          1 . subtree modifications 子節(jié)點添加、刪除、移動的話,則會觸發(fā)

          2 . attribute modifications 節(jié)點屬性修改時觸發(fā)

          3 . node removal

          subtree modifications 示例

          2 . Event Listeners

          事件監(jiān)聽器列表

          div綁定事件后

          選中一個元素,可以看到經(jīng)過它的事件列表(指冒泡和捕獲)。

          • Ancestors All 去掉祖先元素的事件,只看當前元素包含的事件
          • Framework listeners 去掉框架的事件

          3 . Properties

          元素包含的屬性

          properties

          如圖包含了多個屬性分類,點開可以看到的才是具體的屬性,這些所有的屬性都可以通過dom.xx調(diào)用

          注:Accessibility 貌似用來支持h5的視聽障礙

          本篇文章就到這里,下篇繼續(xù)剩余的菜單,歡迎大家補充和提問~

          【關(guān)注一下不迷路】

          html css html css javascript html javascript css javascript css


          主站蜘蛛池模板: 国产午夜福利精品一区二区三区 | 精品亚洲av无码一区二区柚蜜| 日本精品一区二区三本中文| 日韩免费一区二区三区在线| 一区二区三区高清| 日韩人妻无码一区二区三区99| 亚洲av一综合av一区| 亚洲视频在线一区| 精品性影院一区二区三区内射| 亚洲一区二区影院| 精品无码国产一区二区三区51安 | 精品视频一区在线观看| 日本人真淫视频一区二区三区| 激情啪啪精品一区二区| 亚洲日本一区二区一本一道| 三上悠亚日韩精品一区在线| 日本精品一区二区三区在线观看| 亚洲成AV人片一区二区密柚| 精品国产伦一区二区三区在线观看 | 精品在线一区二区三区| 亚洲av午夜精品一区二区三区| 中文字幕不卡一区| 一区二区三区四区精品视频| 亚洲AV日韩综合一区尤物| 日本精品一区二区三本中文| 丝袜人妻一区二区三区网站| 国99精品无码一区二区三区| 波多野结衣一区二区| 无码精品蜜桃一区二区三区WW| 红桃AV一区二区三区在线无码AV| 无码日韩精品一区二区免费暖暖 | 成人区人妻精品一区二区不卡视频 | 国产品无码一区二区三区在线蜜桃 | 国产乱码一区二区三区爽爽爽| 骚片AV蜜桃精品一区| 天堂va在线高清一区| 国产一区在线视频观看| 中文字幕精品一区| 国产99久久精品一区二区| 精品女同一区二区三区免费站| 视频在线观看一区|