整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          HTML繪制帶邊框矩形

          HTML繪制帶邊框矩形

          獨的一個canvas標記只是在頁面中定義了一塊矩形區域,并無特別之處。開發人員只有配合使用javascript腳本,才能夠完成各種圖形、線條以及復雜的圖形變換操作。與基于SVG實現同樣繪圖效果來比較,canvas繪圖是一種像素級別的位圖繪圖技術,而SVG則是一種矢量繪圖技術。

          使用canvas和javascript繪制一個矩形,可能會涉及一個或多個方法,如下表所示:

          (1)編寫代碼如下圖所示,在<body>標簽中加入以下代碼。

          (2)在瀏覽器中打開文件,預覽效果圖如下所示,可以看到網頁中,在一個藍色邊框中顯示了一個藍色長方形。

          小提示:上面代碼中,首先定義一個畫布對象,其id名稱為myCanvas,其高度和寬度為500像素,并定義了畫布邊框顯示樣式。在javascript代碼中,首先獲取畫布對象,然后使用getcontext獲取當前2D的上下文對象。并使用fillrect繪制一個矩形。其中涉及一個fillstyle屬性,fillstyle用于設置填充的顏色、透明度等。如果設置為“rgb(200,0,0)”,則表示一個顏色,不透明;如果設置為“rgba(0,0,200,0.5)”,則表示顏色為一個顏色,透明度為50%。

          數字時代,多媒體元素如視頻、音頻、圖片和動畫成為了網頁設計中不可或缺的一部分。它們不僅能夠提升用戶體驗,還能有效地傳達信息和情感。在本文中,我們將探討如何在網頁中嵌入各種多媒體元素,并提供一些例子來說明如何使用它們。

          圖片

          圖片是最常見的多媒體類型之一。在HTML中,我們使用 <img> 標簽來嵌入圖片。

          示例

          <img src="example.jpg" alt="描述性文字" width="500" height="300">
          

          在這個例子中,src 屬性指定圖片的路徑,alt 屬性提供圖片的替代文本(對于視覺障礙用戶和圖片無法加載的情況非常有用),width 和 height 屬性指定圖片的尺寸。

          視頻

          視頻可以提供動態的視覺體驗和信息。HTML5引入了 <video> 標簽,使得嵌入視頻變得簡單。

          示例

          <video width="640" height="360" controls>
            <source src="movie.mp4" type="video/mp4">
            <source src="movie.ogg" type="video/ogg">
            您的瀏覽器不支持視頻標簽。
          </video>
          

          在這個例子中,controls 屬性添加了視頻播放控件,如播放、暫停和音量控制。<source> 標簽允許指定多個視頻格式,以確保跨不同瀏覽器的兼容性。

          音頻

          音頻元素可以用來播放聲音或音樂。HTML5通過 <audio> 標簽提供了對音頻內容的支持。

          示例

          <audio controls>
            <source src="sound.mp3" type="audio/mpeg">
            <source src="sound.ogg" type="audio/ogg">
            您的瀏覽器不支持音頻元素。
          </audio>
          

          與視頻標簽類似,controls 屬性為音頻文件提供了基本的控制選項,而 <source> 標簽讓我們可以指定多個音頻格式。

          嵌入式內容

          除了直接嵌入文件,我們還可以嵌入整個網頁或者其他網站的內容,比如地圖或社交媒體帖子。這通常是通過 <iframe> 標簽完成的。

          示例

          <iframe src="https://www.example.com" width="600" height="400">
            <p>您的瀏覽器不支持iframe標簽。</p>
          </iframe>
          

          在這個例子中,src 屬性指定了要嵌入的網頁的URL,width 和 height 屬性設置了iframe的尺寸。

          動畫和圖形

          SVG(可縮放矢量圖形)和Canvas API是創建網頁動畫和圖形的兩種流行技術。

          SVG 示例

          <svg width="100" height="100">
            <circle cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" />
          </svg>
          

          這個SVG示例創建了一個簡單的帶有綠色邊框和黃色填充的圓。

          Canvas 示例

          <canvas id="myCanvas" width="200" height="100"></canvas>
          <script>
            var c=document.getElementById("myCanvas");
            var ctx=c.getContext("2d");
            ctx.fillStyle="#FF0000";
            ctx.fillRect(0, 0, 150, 75);
          </script>
          

          這個Canvas示例使用JavaScript在畫布上繪制了一個紅色的矩形。

          社交媒體嵌入

          我們還可以嵌入社交媒體平臺上的內容,如推文或Instagram帖子。

          示例

          <!-- Twitter -->
          <a class="twitter-timeline" href="https://twitter.com/TwitterDev?ref_src=twsrc%5Etfw">Tweets by TwitterDev</a>
          <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
          
          <!-- Instagram -->
          <blockquote class="instagram-media" data-instgrm-permalink="https://www.instagram.com/p/B1JWcqCgsdH/">
          </blockquote>
          <script async defer src="//www.instagram.com/embed.js"></script>
          

          這些例子展示了如何嵌入Twitter和Instagram的內容。通常,社交媒體平臺提供了易于嵌入內容的代碼片段。

          總結

          嵌入多媒體元素可以極大地提升網站的吸引力和互動性。通過使用HTML的 <img>, <video>, <audio>, <iframe>, <svg> 和 <canvas> 標簽,我們可以在網頁中添加豐富的視覺和聽覺內容。此外,社交媒體的嵌入功能使得分享和展示社交媒體內容變得簡單。當設計包含多媒體元素的網頁時,記得考慮到所有用戶的訪問性,確保內容對所有人都是可訪問的。

          文簡介

          在閱讀本文前,你首先需要知道什么是 Fabric.js,還需要知道 Fabric.js 是如何創建矩形的。

          如果你還沒滿足上面2個條件,推薦閱讀 《Fabric.js從入門到____》


          我在 Fabric.js 使用 框選操作 創建矩形。

          接下來的幾篇文章我會寫如何自由繪制 圓形、橢圓形、三角形、線段、折線、多邊形


          本文不做任何 CSS 相關的美化,只講解實現原理。

          下圖是本文的要實現的效果。


          使用 Fabric.js 這類框架,是要注意版本的。

          本文所用版本: Fabric.js 4.6.0



          原理

          核心原理

          用 “框選” 的方式生成矩形,其核心就2點:

          1. 鼠標 點擊抬起 時獲取坐標點,也就是 起始點結束點
          2. 鼠標抬起后,第1點 獲取到的2個坐標計算出矩形的長、寬和位置。


          鼠標點擊:canvas.on('mouse:down', fn)

          鼠標抬起: canvas.on('mouse:up', fn)


          需要考慮的因素

          理解了上面的核心點,接下來需要考慮的是鼠標框選的 方向

          1. 左上右下 框選
          2. 右下左上 框選
          3. 左下右上 框選
          4. 右上左下 框選


          上面這4種情況會影響生成出來的矩形的 位置


          生成矩形的代碼

          new fabric.Rect({
              top: 0, // 矩形左上角在y軸的位置
              left: 0, // 矩形左上角在x軸的位置
              width: 100, // 矩形的寬
              height: 100, // 矩形的高
              fill: 'transparent', // 填充色
              stroke: '#000' // 邊框顏色
          })


          接下來逐一說說這4種操作帶來的影響。


          從 左上 往 右下 框選



          這種情況是最好處理的。

          此時 起始點 就是矩形的左上角,結束點 就是矩形的右下角。

          起始點 的 x 和 y 坐標 都小于 結束點,( 起始點x < 結束點x;起始點y < 結束點y ) :

          • 矩形的寬:結束點x坐標 - 起始點x坐標(也可以說是 (起始點x - 結束點x)的絕對值 )。
          • 矩形的高:結束點y坐標 - 起始點y坐標(也可以說是 (起始點y - 結束點y)的絕對值 )。
          • 左上角在x軸的位置:起始點的x軸坐標 。
          • 左上角在y軸的位置:起始點的y軸坐標 。


          從 右下 往 左上 框選



          起始點x > 結束點x; 起始點y > 結束點y

          • 寬:起始點x - 結束點x 。
          • 高:起始點y - 結束點y 。
          • 左上角在x軸的坐標:結束點x
          • 左上角在y軸的坐標:結束點y


          從 左下 往 右上 框選



          起始點x < 結束點x; 起始點y > 結束點y

          • 寬:(起始點x - 結束點y)的絕對值
          • 高:起始點y - 結束點y
          • 左上角在x軸的坐標:起始點x (比較x坐標,取小的那個,可以用 Math.min 方法)。
          • 左上角在y軸的坐標:結束點y (比較y坐標,取小的那個)。


          從 右上 往 左下 框選



          起始點x > 結束點x; 起始點y < 結束點y

          • 寬:起始點x - 結束點x 。
          • 高:(起始點y - 結束點y)的絕對值 。
          • 左上角在x軸的坐標:結束點x (比較x坐標,取小的那個,可以用 Math.min 方法)。
          • 左上角在y軸的坐標:起始點y (比較y坐標,取小的那個)。


          總結公式

          分析完上面4種情況,最后總結出來這幾個參數的公式。

          我將 起始點 命名為 downPoint,結束點 命名為 upPoint 。

          矩形的幾個參數計算公式如下:

          new fabric.Rect({
              top: Math.min(downPoint.y, upPoint.y),
              left: Math.min(downPoint.x, upPoint.x),
              width: Math.abs(downPoint.x - upPoint.x),
              height: Math.abs(downPoint.y - upPoint.y),
              fill: 'transparent',
              stroke: '#000'
          })


          Math.min:兩者之中取小值

          Math.abs:返回絕對值

          這兩個都是 JS 提供的方法,如果不理解的建議去百度一下。



          動手實現

          我在這里貼出用 原生方式 實現的代碼和注釋。

          如果你想知道在 Vue3 環境下如何實現 Fabric.js 自由繪制矩形,可以在 代碼倉庫 里查找。

          <!-- 工具欄 -->
          <div class="toolbar">
            <select onchange="typeChange(this.options[this.options.selectedIndex].value)">
              <option value="default">默認(框選)</option>
              <option value="rect">矩形</option>
            </select>
          </div>
          
          <!-- 畫布 -->
          <canvas id="canvas" width="800" height="800"></canvas>
          
          <!-- 引入fabric.js -->
          <script src="https://cdn.bootcdn.net/ajax/libs/fabric.js/460/fabric.js"></script>
          
          <script>
          let canvas=null // 畫布對象
          
          let currentType='default' // 當前操作模式(默認 || 創建矩形)
          
          let downPoint=null // 按下鼠標時的坐標
          let upPoint=null // 松開鼠標時的坐標
          
          // 初始化畫板
          function initCanvas() {
            canvas=new fabric.Canvas('canvas')
          
            canvas.on('mouse:down', canvasMouseDown)   // 鼠標在畫布上按下
            canvas.on('mouse:up', canvasMouseUp)       // 鼠標在畫布上松開
          }
          
          // 畫布操作類型切換
          function typeChange(opt) {
            currentType=opt
            switch(opt) {
              case 'default': // 默認框選模式
                canvas.selection=true // 允許框選
                canvas.selectionColor='rgba(100, 100, 255, 0.3)' // 選框填充色:半透明的藍色
                canvas.selectionBorderColor='rgba(255, 255, 255, 0.3)' // 選框邊框顏色:半透明灰色
                canvas.skipTargetFind=false // 允許選中
                break
              case 'rect': // 創建矩形模式
                canvas.selectionColor='transparent' // 選框填充色:透明
                canvas.selectionBorderColor='rgba(0, 0, 0, 0.2)' // 選框邊框顏色:透明度很低的黑色(看上去是灰色)
                canvas.skipTargetFind=true // 禁止選中
                break
            }
          }
          
          // 鼠標在畫布上按下
          function canvasMouseDown(e) {
            // 鼠標左鍵按下時,將當前坐標 賦值給 downPoint。{x: xxx, y: xxx} 的格式
            downPoint=e.absolutePointer
          }
          
          // 鼠標在畫布上松開
          function canvasMouseUp(e) {
            // 繪制矩形的模式下,才執行下面的代碼
            if (currentType==='rect') {
              // 松開鼠標左鍵時,將當前坐標 賦值給 upPoint
              upPoint=e.absolutePointer
              // 調用 創建矩形 的方法
              createRect()
            }
          }
          
          // 創建矩形
          function createRect() {
            // 如果點擊和松開鼠標,都是在同一個坐標點,不會生成矩形
            if (JSON.stringify(downPoint)===JSON.stringify(upPoint)) {
              return
            }
          
            // 創建矩形
            // 矩形參數計算(前面總結的4條公式)
            let top=Math.min(downPoint.y, upPoint.y)
            let left=Math.min(downPoint.x, upPoint.x)
            let width=Math.abs(downPoint.x - upPoint.x)
            let height=Math.abs(downPoint.y - upPoint.y)
          
            // 矩形對象
            const rect=new fabric.Rect({
              top,
              left,
              width,
              height,
              fill: 'transparent', // 填充色:透明
              stroke: '#000' // 邊框顏色:黑色
            })
          
            // 將矩形添加到畫布上
            canvas.add(rect)
          
            // 創建完矩形,清空 downPoint 和 upPoint。當然,你也可以不做這步。
            downPoint=null
            upPoint=null
          }
          
          // 頁面加載的生命周期,在此執行 初始化畫布 的操作
          window.onload=function() {
            initCanvas()
          }
          </script>


          最后別忘了 關注 點贊 收藏


          主站蜘蛛池模板: 亚洲av无码一区二区三区观看| 无码人妻一区二区三区兔费| 国产成人无码精品一区在线观看| 无码中文人妻在线一区| 亚洲免费视频一区二区三区| 青娱乐国产官网极品一区| 欧美激情一区二区三区成人| 亚洲国产成人久久一区二区三区| 国产一区二区三区在线视頻| 少妇无码AV无码一区| 国产伦精品一区二区三区视频猫咪 | 精品无码综合一区| 国产乱码精品一区三上| 国产探花在线精品一区二区| 无码人妻啪啪一区二区| 日韩精品无码视频一区二区蜜桃| 亚洲一区精品伊人久久伊人| 上原亚衣一区二区在线观看| asmr国产一区在线| 亚洲熟妇AV一区二区三区宅男| 久久无码人妻一区二区三区午夜| 亚洲AV日韩综合一区| 日本中文字幕在线视频一区| 好爽毛片一区二区三区四无码三飞| 97精品一区二区视频在线观看| 国产AV午夜精品一区二区三| 久草新视频一区二区三区| 色窝窝无码一区二区三区色欲| 久久精品国产AV一区二区三区| 亚洲国产一区明星换脸| 97精品一区二区视频在线观看| asmr国产一区在线| 多人伦精品一区二区三区视频| 国产激情з∠视频一区二区| 视频一区二区三区人妻系列| 亚洲视频一区在线| 亚洲av无码一区二区三区乱子伦 | 国产精品99无码一区二区| 日韩一区二区三区精品| 亚洲一区综合在线播放| 亚洲国产一区二区视频网站|