整合營銷服務商

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

          免費咨詢熱線:

          HTML5如何實現視頻直播功能

          前不久抽空對目前比較火的視頻直播,做了下研究與探索,了解其整體實現流程,以及探討移動端HTML5直播可行性方案。

          發現目前 WEB 上主流的視頻直播方案有 HLS 和 RTMP,移動 WEB 端目前以 HLS 為主(HLS存在延遲性問題,也可以借助 video.js 采用RTMP),PC端則以 RTMP 為主實時性較好,接下來將圍繞這兩種視頻流協議來展開H5直播主題分享。

          一、視頻流協議HLS與RTMP

          1. HTTP Live Streaming

          HTTP Live Streaming(簡稱 HLS)是一個基于 HTTP 的視頻流協議,由 Apple 公司實現,Mac OS 上的 QuickTime、Safari 以及 iOS 上的 Safari 都能很好的支持 HLS,高版本 Android 也增加了對 HLS 的支持。一些常見的客戶端如:MPlayerX、VLC 也都支持 HLS 協議。

          HLS 協議基于 HTTP,而一個提供 HLS 的服務器需要做兩件事:

          編碼:以 H.263 格式對圖像進行編碼,以 MP3 或者 HE-AAC 對聲音進行編碼,最終打包到 MPEG-2 TS(Transport Stream)容器之中;分割:把編碼好的 TS 文件等長切分成后綴為 ts 的小文件,并生成一個 .m3u8 的純文本索引文件;瀏覽器使用的是 m3u8 文件。m3u8 跟音頻列表格式 m3u 很像,可以簡單的認為 m3u8 就是包含多個 ts 文件的播放列表。播放器按順序逐個播放,全部放完再請求一下 m3u8 文件,獲得包含最新 ts 文件的播放列表繼續播,周而復始。整個直播過程就是依靠一個不斷更新的 m3u8 和一堆小的 ts 文件組成,m3u8 必須動態更新,ts 可以走 CDN。一個典型的 m3u8 文件格式如下:

          #EXTM3U
          #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=200000
          gear1/prog_index.m3u8
          #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=311111
          gear2/prog_index.m3u8
          #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=484444
          gear3/prog_index.m3u8
          #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=737777
          gear4/prog_index.m3u8

          可以看到 HLS 協議本質還是一個個的 HTTP 請求 / 響應,所以適應性很好,不會受到防火墻影響。但它也有一個致命的弱點:延遲現象非常明顯。如果每個 ts 按照 5 秒來切分,一個 m3u8 放 6 個 ts 索引,那么至少就會帶來 30 秒的延遲。如果減少每個 ts 的長度,減少 m3u8 中的索引數,延時確實會減少,但會帶來更頻繁的緩沖,對服務端的請求壓力也會成倍增加。所以只能根據實際情況找到一個折中的點。

          對于支持 HLS 的瀏覽器來說,直接這樣寫就能播放了:

          <video src=”./bipbopall.m3u8″ height=”300″ width=”400″  preload=”auto” autoplay=”autoplay” loop=”loop” webkit-playsinline=”true”></video>

          注意:HLS 在 PC 端僅支持safari瀏覽器,類似chrome瀏覽器使用HTML5 video

          標簽無法播放 m3u8 格式,可直接采用網上一些比較成熟的方案,如:sewise-player、MediaElement、videojs-contrib-hls、jwplayer。

          程序猿的生活:web前端全棧資料粉絲福利(面試題、視頻、資料筆記,進階路線)zhuanlan.zhihu.com/p/136454207

          2. Real Time Messaging Protocol

          Real Time Messaging Protocol(簡稱 RTMP)是 Macromedia 開發的一套視頻直播協議,現在屬于 Adobe。這套方案需要搭建專門的 RTMP 流媒體服務如 Adobe Media Server,并且在瀏覽器中只能使用 Flash 實現播放器。它的實時性非常好,延遲很小,但無法支持移動端 WEB 播放是它的硬傷。

          雖然無法在iOS的H5頁面播放,但是對于iOS原生應用是可以自己寫解碼去解析的, RTMP 延遲低、實時性較好。瀏覽器端,HTML5 video

          標簽無法播放 RTMP 協議的視頻,可以通過 video.js 來實現。

          <link href=“http://vjs.zencdn.net/5.8.8/video-js.css” rel=“stylesheet”>
          <video id=“example_video_1″ class=“video-js vjs-default-skin” controls preload=“auto” width=“640” height=“264” loop=“loop” webkit-playsinline>
          <source src=“rtmp://10.14.221.17:1935/rtmplive/home” type=‘rtmp/flv’>
          </video>
          <script src=“http://vjs.zencdn.net/5.8.8/video.js”></script>
          <script>
          videojs.options.flash.swf = ‘video.swf’;
          videojs(‘example_video_1′).ready(function() {
          this.play();
          });
          </script>


          3. 視頻流協議HLS與RTMP對比


          二、直播形式

          目前直播展示形式,通常以YY直播、映客直播這種頁面居多,可以看到其結構可以分成三層:

          ① 背景視頻層

          ② 關注、評論模塊

          ③ 點贊動畫

          而現行H5類似直播頁面,實現技術難點不大,其可以通過實現方式分為:

          ① 底部視頻背景使用video視頻標簽實現播放

          ② 關注、評論模塊利用 WebScoket 來實時發送和接收新的消息通過DOM 和 CSS3 實現

          ③ 點贊利用 CSS3 動畫

          了解完直播形式之后,接下來整體了解直播流程。

          相關學習資料推薦,點擊下方鏈接免費報名,先碼住不迷路~】

          音視頻免費學習地址:FFmpeg/WebRTC/RTMP/NDK/Android音視頻流媒體高級開發

          【免費分享】音視頻學習資料包、大廠面試題、技術視頻和學習路線圖,資料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以點擊788280672加群免費領取~

          三、直播整體流程

          直播整體流程大致可分為:

          視頻采集端:可以是電腦上的音視頻輸入設備、或手機端的攝像頭、或麥克風,目前以移動端手機視頻為主。

          直播流視頻服務端:一臺Nginx服務器,采集視頻錄制端傳輸的視頻流(H264/ACC編碼),由服務器端進行解析編碼,推送RTMP/HLS格式視頻流至視頻播放端。

          視頻播放端:可以是電腦上的播放器(QuickTime Player、VLC),手機端的native播放器,還有就是 H5 的video標簽等,目前還是以手機端的native播放器為主。

          (web前端學習交流群:328058344 禁止閑聊,非喜勿進?。?/span>

          四、H5 錄制視頻

          對于H5視頻錄制,可以使用強大的 webRTC (Web Real-Time Communication)是一個支持網頁瀏覽器進行實時語音對話或視頻對話的技術,缺點是只在 PC 的 Chrome 上支持較好,移動端支持不太理想。

          使用 webRTC 錄制視頻基本流程

          ① 調用 window.navigator.webkitGetUserMedia()

          獲取用戶的PC攝像頭視頻數據。

          ② 將獲取到視頻流數據轉換成 window.webkitRTCPeerConnection

          (一種視頻流數據格式)。

          ③ 利用 WebScoket

          將視頻流數據傳輸到服務端。

          注意:

          雖然Google一直在推WebRTC,目前已有不少成型的產品出現,但是大部分移動端的瀏覽器還不支持 webRTC(最新iOS 10.0也不支持),所以真正的視頻錄制還是要靠客戶端(iOS,Android)來實現,效果會好一些。


          WebRTC支持度

          WebRTC支持度

          iOS原生應用調用攝像頭錄制視頻流程

          ① 音視頻的采集,利用AVCaptureSession和AVCaptureDevice可以采集到原始的音視頻數據流。

          ② 對視頻進行H264編碼,對音頻進行AAC編碼,在iOS中分別有已經封裝好的編碼庫(x264編碼、faac編碼、ffmpeg編碼)來實現對音視頻的編碼。

          ③ 對編碼后的音、視頻數據進行組裝封包。

          ④ 建立RTMP連接并上推到服務端。


          五、搭建Nginx+Rtmp直播流服務

          安裝nginx、nginx-rtmp-module

          ① 先clone nginx項目到本地:

          brew tap homebrew/nginx

          ② 執行安裝nginx-rtmp-module

          brew install nginx-full –with-rtmp-module

          2. nginx.conf配置文件,配置RTMP、HLS

          查找到nginx.conf配置文件(路徑/usr/local/etc/nginx/nginx.conf),配置RTMP、HLS。

          ① 在http節點之前添加 rtmp 的配置內容:

          ② 在http中添加 hls 的配置

          3. 重啟nginx服務

          重啟nginx服務,瀏覽器中輸入 http://localhost:8080,是否出現歡迎界面確定nginx重啟成功。

          nginx -s reload

          六、直播流轉換格式、編碼推流

          當服務器端接收到采集視頻錄制端傳輸過來的視頻流時,需要對其進行解析編碼,推送RTMP/HLS格式視頻流至視頻播放端。通常使用的常見編碼庫方案,如x264編碼、faac編碼、ffmpeg編碼等。鑒于 FFmpeg 工具集合了多種音頻、視頻格式編碼,我們可以優先選用FFmpeg進行轉換格式、編碼推流。

          1.安裝 FFmpeg 工具

          brew install ffmpeg

          2.推流MP4文件

          視頻文件地址:/Users/gao/Desktop/video/test.mp4

          推流拉流地址:rtmp://localhost:1935/rtmplive/home,rtmp://localhost:1935/rtmplive/home

          //RTMP 協議流
          ffmpeg -re -i /Users/gao/Desktop/video/test.mp4 -vcodec libx264 -acodec aac -f flv rtmp://10.14.221.17:1935/rtmplive/home
          //HLS 協議流
          ffmpeg -re -i /Users/gao/Desktop/video/test.mp4 -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -q 10 rtmp://10.14.221.17:1935/hls/test


          注意:

          當我們進行推流之后,可以安裝VLC、ffplay(支持rtmp協議的視頻播放器)本地拉流進行演示

          3.FFmpeg推流命令

          ① 視頻文件進行直播

          ffmpeg -re -i /Users/gao/Desktop/video/test.mp4 -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -q 10 rtmp://192.168.1.101:1935/hls/test
          ffmpeg -re -i /Users/gao/Desktop/video/test.mp4 -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -q 10 rtmp://10.14.221.17:1935/hls/test


          ② 推流攝像頭+桌面+麥克風錄制進行直播

          ffmpeg -f avfoundation -framerate 30 -i “1:0″ \-f avfoundation -framerate 30 -video_size 640x480 -i “0” \-c:v libx264 -preset ultrafast \-filter_complex ‘overlay=main_w-overlay_w-10:main_h-overlay_h-10′ -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://192.168.1.101:1935/hls/test


          更多命令,請參考:

          FFmpeg處理RTMP流媒體的命令大全

          FFmpeg常用推流命令

          七、H5 直播視頻播放

          移動端iOS和 Android 都天然支持HLS協議,做好視頻采集端、視頻流推流服務之后,便可以直接在H5頁面配置 video 標簽播放直播視頻。

          <video controls preload=“auto” autoplay=“autoplay” loop=“loop” webkit-playsinline>
          <source src=“http://10.14.221.8/hls/test.m3u8″ type=“application/vnd.apple.mpegurl” />
          <p class=“warning”>Your browser does not support HTML5 video.</p>
          </video>

          八、總結

          本文從視頻采集上傳,服務器處理視頻推流,以及H5頁面播放直播視頻一整套流程,具體闡述了直播實現原理,實現過程中會遇到很多性能優化問題。

          ① H5 HLS 限制必須是H264+AAC編碼。

          ② H5 HLS 播放卡頓問題,server 端可以做好分片策略,將 ts 文件放在 CDN 上,前端可盡量做到 DNS 緩存等。

          ③ H5 直播為了達到更好的實時互動,也可以采用RTMP協議,通過video.js 實現播放。

          原文 https://zhuanlan.zhihu.com/p/146323842

          1-HTML基礎

          第1章 基礎語法

          1. html是超文本標記語言
          2. <head>,<title>標簽里的內容不會在網頁文檔中顯示
          3. <hr/>標簽是水平線,不需要成對出現
          4. 注釋代碼:<!-- -->

          <!DOCTYPE html>
          <html>
          <head>
          	<title>hello</title>
          </head>
          <body bgcolor="grey">
          	<p>HELLO,everyone.This is my first page!</p>
          </body>
          </html>

          我自己是一名從事了多年開發的web前端老程序員,目前辭職在做自己的web前端私人定制課程,今年年初我花了一個月整理了一份最適合2019年學習的web前端學習干貨,各種框架都有整理,送給每一位前端小伙伴,想要獲取的可以關注我的頭條號并在后臺私信我:前端,即可免費獲取。

          第2章 文章段落

          2.1 文檔聲明和META標簽

          <html>,<body>,<head>標簽是html文檔結構標簽,<!DOCTYPE HTML>不屬于html標簽,它用于定義文檔類型

          網頁中不能正常顯示中文,出現亂碼現象,使用meta標簽設置編碼格式:<meta charset="utf-8">

          <!DOCTYPE html>
          <html>
          <head>
          	<title>第一個網頁</title>
          	<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
          </head>
          <body>
          	大家好,一起來學習html標記語言
          </body>
          </html>

          3.如果想在html頁面中顯示空格,使用

          4.

          標題標簽:<h1></h1>~<h6></h6>

          段落標簽:<p></p>

          align對齊屬性值:

          left:左對齊內容

          right:右對齊內容

          center:居中對齊內容

          justify:對行進行延申,這樣每行都可以有相等的長度

          換行標簽<br/>

          5.一個<p></p>標簽代表一個段落,兩個<p>標簽中的文本內容不在同一行,在<p>標簽中,使用<br/>文本內容的位置只是換行,其實還是一個段落

          6.<pre></pre>標簽用于預定義格式顯示文本,即文本在瀏覽器中顯示時遵循在HTML原文檔中定義的格式

          <!DOCTYPE html>
          <html>
          <head>
          	<title>練習1</title>
          	<meta http-equiv="Content-Type" content="text/http;charset=utf-8"/>
          </head>
          <body>
          	<h3 align="center">《早發白帝城》</h3>
          	<p align="center">朝辭白帝彩云間,千里江陵一日還。</p>
          	<p align="center">兩岸猿聲啼不住,輕舟已過萬重山。</p>
          </body>
          </html>


          <!DOCTYPE html>
          <html>
          <head>
          	<title>練習2</title>
          	<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
          </head>
          <body>
          	<h1>敕勒歌</h1>
          	<h2>朝代:南北朝</h2>
          	<h3>作者:佚名</h3>
          	<p>  敕勒川,<br/>
          	     陰山下,<br/>
          	     天似穹廬,<br/>
          	</p>
          	<pre>
            籠蓋四野,
             天蒼蒼,
             野茫茫,
          風吹草低見牛羊。
          	</pre>
          </body>
          </html>
          

          2.2 文字和段落標簽

          • 文字斜體:<i></i>和<em></em>
          • 加粗:<b></b>和<strong></strong>
          • 下標:<sub></sub>
          • 上標:<sup></sup>
          特殊符號

          任務

          <!DOCTYPE html>
          <html>
          <head>
          	<title>任務</title>
          	<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
          </head>
          <body>
          	<p align="center">關于我們  |  招聘信息  |  聯系我們  |  意見反饋</p>
          	<hr/>
          	<p align="center">Copyright ? 2016 imooc.com All Rights Reserved</p>
          </body>
          </html>

          <!DOCTYPE html>
          <html>
          <head>
          	<title>任務</title>
          	<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
          </head>
          <body>
          	<p>公式:x<sup>2</sup>+x=0 解:x<sub>1</sub>=0;x<sub>2</sub>=-1</p>
          </body>
          </html>

          第3章 列表標簽

          3.1 列表標簽-無序列表


          <!DOCTYPE html>
          <html>
          <head>
          	<title>3</title>
          	<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
          </head>
          <body>
          	<ul type="disc">
          		<li>朝辭白帝彩云間,</li>
          		<li>千里江陵一日還,</li>
          		<li>兩岸猿聲啼不住,</li>
          		<li>輕舟已過萬重山,</li>
          	</ul>
          	<ul type="square">
          		<li>朝辭白帝彩云間,</li>
          		<li>千里江陵一日還,</li>
          		<li>兩岸猿聲啼不住,</li>
          		<li>輕舟已過萬重山,</li>
          	</ul>
          </body>
          </html>

          3.2 列表標簽-有序列表



          <!DOCTYPE html>
          <html>
          <head>
          	<title>3</title>
          	<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
          </head>
          <body>
          	<ol type="a">
          		<li>朝辭白帝彩云間,</li>
          		<li>千里江陵一日還,</li>
          		<li>兩岸猿聲啼不住,</li>
          		<li>輕舟已過萬重山,</li>
          	</ol>
          	<ol type="i">
          		<li>朝辭白帝彩云間,</li>
          		<li>千里江陵一日還,</li>
          		<li>兩岸猿聲啼不住,</li>
          		<li>輕舟已過萬重山,</li>
          	</ol>
          </body>
          </html>

          3.3 列表標簽-定義列表

          <dt><dd>是同級標簽

          第四章 圖像和超鏈接

          4.1 圖像
          • 圖像標簽


          絕對路徑:

          相對路徑:


          效果圖

          <!DOCTYPE html>
          <html>
          <head>
          	<title>3</title>
          	<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
          </head>
          <body>
          	<p>一幅圖像:<img src="http://climg.mukewang.com/58c112ed0001370f03000300.jpg" width="30%"></p>
          	<p>一幅動畫圖像:<img src="http://climg.mukewang.com/58c11324000144f703550220.jpg" height="50px" width="50px"></p>
          </body>
          </html>
          4.2 超鏈接

          超鏈接標簽



          空鏈接:<a href="#"> </a>


          4.3 錨鏈接
          1. 定義錨(同一頁面)



          任務:


          <!DOCTYPE html>
          <html>
          <head>
          	<title>3</title>
          	<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
          </head>
          <body>
          	<p><a name="dingbu">這里是頂部</p>
          	<p><a href="#shuiguo">水果</p>
          	<p><a href="#shucai">蔬菜</p>
          	<p><a href="#yundong">運動</a></p>
          	<h3><a name="shuiguo">水果</a></h3>
          	<ul>
          		<li>香蕉</li>
          		<li>蘋果</li>
          		<li>葡萄</li>
          		<li>梨</li>
          		<li>西瓜</li>
          		<li>櫻桃</li>
          		<li>菠蘿</li>
          		<li>橙子</li>
          		<li>柚子</li>
          		<li>芒果</li>
          	</ul>
          	<p><a href="#dingbu">返回頂部</a></p>
          	<h3><a name="shucai">蔬菜</a></h3>
          	<ul>
          		<li>西紅柿</li>
          		<li>黃瓜</li>
          		<li>土豆</li>
          		<li>芹菜</li>
          		<li>蒜苔</li>
          		<li>西葫蘆</li>
          		<li>香菇</li>
          		<li>菠菜</li>
          		<li>豆角</li>
          		<li>油菜</li>
          	</ul>
          	<a name="yundong"></a>
          	<p><a href="#dingbu">返回頂部</a></p>
          </body>
          </html>
        1. 定義錨(不同頁面)
        2. 4.3 鏈接擴展功能

          1. 電子郵件鏈接



          2.文件下載




          <!DOCTYPE html>
          <html>
          <head>
          	<title>3</title>
          	<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
          </head>
          <body>
          	<a href="mailto:2539391306@qq.com.cn">郵箱鏈接</a>
          	<a href="58ca5b6700018dfc02400135.zip">文件下載</a>
          </body>
          </html>



          原文鏈接:https://blog.csdn.net/qq_43405634/article/details/103789819

          用 CSS 最困難的部分之一是處理CSS的權重值,它可以決定到底哪條規則會最終被應用,尤其是如果你想在 Bootstrap 這樣的框架中覆蓋其已有樣式,更加顯得麻煩。不過隨著 CSS 層的引入,這一切都發生了變化。 這個新功能允許您創建自己的自定義 CSS 層,這是有史以來第一次確定所有 CSS 代碼權重的層次結構。 在本文中,我將剖析這對您意味著什么,它是如何工作的,以及您今天如何開始使用它。

          什么是層(Layers)

          創建您自己的自定義圖層是 CSS 的新功能,但圖層從一開始就存在于 CSS 中。 CSS 中有 3 個不同的層來管理所有樣式的工作方式。

          瀏覽器(也稱為用戶代理)樣式 - user agent style
          用戶樣式 - User Styles
          作者樣式 - Author Styles

          瀏覽器樣式是應用于瀏覽器的默認樣式。這就是為什么 Chrome 和 Safari 中的按鈕看起來不同的原因。在瀏覽器層中找到的樣式在瀏覽器之間是不同的,并且給每個瀏覽器一個獨特的外觀。

          下一層是用戶樣式,這并不是您真正需要擔心的事情。這些通常是用戶可以編寫并注入瀏覽器的自定義樣式,但瀏覽器不再真正支持這些樣式。用戶可能會更改一些瀏覽器設置,這些設置會向該圖層添加樣式,但在大多數情況下,可以完全忽略該層。

          最后,我們來到作者層。這是您最熟悉的層,因為您編寫的每一段 CSS 代碼都屬于這一層。

          這些層分開的原因是因為它可以很容易地覆蓋瀏覽器樣式和用戶樣式中定義的代碼,因為層定義了自己的層次結構,完全忽略了權重的影響。

          這 3 個 CSS 層是有序的(瀏覽器樣式、用戶樣式、然后是作者樣式),后面層中的每個樣式都將覆蓋前一層的任何樣式。這意味著即使瀏覽器樣式定義了一個超級特定的選擇器,例如#button.btn.super-specific,并且您的作者樣式定義了一個超級通用的選擇器,例如按鈕,您的作者樣式仍然會覆蓋瀏覽器樣式。

          這實際上已經是您可能一直在使用而沒有意識到的東西。

          * {
            box-sizing: border-box;
          }

          上面的選擇器沒有權重,因為 * 符號對權重沒有貢獻。 這意味著例如使用 p 作為選擇器的 p 標簽的瀏覽器樣式在技術上比 * 選擇器更具體,權重更高。 但是,這一切并不重要,因為作者樣式位于比瀏覽器樣式層晚的層中,因此您的代碼將始終覆蓋瀏覽器樣式。

          理解這一點至關重要,因為使用這個新的圖層 API,您可以在作者圖層中創建自己的圖層,從而更輕松地處理特定性。

          如何創建你自己的層

          下面來看個例子:

          很明顯,這是我們正常理解的CSS, ID設置的顏色權重更高,所以按鈕顯示為紅色。讓我們使用@layer給它們加上兩個層,看看是什么效果:

          按鈕變成藍色。為什么會這樣?

          我們給兩條CSS分別建立了base和utilities層,很明顯,后面創建的層的樣式覆蓋了前面層的樣式,盡管前面層的樣式有更高的權重。這就是層的默認工作原理。當然層的順序是可以指定的,

          @layer utilities, base;

          @layer utilities, base;

          您需要做的就是編寫@layer 關鍵字,后跟以逗號分隔的層列表。 這將按從左到右的順序定義所有層,其中列出的第一層到最后一層的權重是依次增加的。 然后,您可以稍后使用普通的@layer 語法向每個層添加代碼,而不必擔心定義層的順序,因為它們都在這一行中定義。 需要注意的是,這行代碼必須在定義任何層之前出現,所以我通常將它作為我的 CSS 文件中的第一行。如上圖,通過指定層的順序,我們讓base層應用在utilities層之后,所以按鈕又顯示為紅色。

          導入層

          上面這兩種方式都是導入bootstrap框架的CSS,并且把他們放在framework層中,這樣你如果想要覆蓋它已有的樣式,只需要新建一個自己的層,放置在framework層后面就行。像下面這樣。

          匿名層

          匿名層不常用,但它寫在后面可以覆蓋其他層的樣式,像下面可以把按鈕設為橙色。

          不在層里的樣式

          不在層里的樣式會有更高的權重,下面這個列表會讓你看得更清楚覆蓋是怎么發生的

          層還可以重疊設置,不過很少用。具體的用法可以查閱相關文檔。

          瀏覽器支持

          自從IE死了以后,所有主流瀏覽器都已支持這一特性。大家請放心使用。


          主站蜘蛛池模板: 日韩精品久久一区二区三区| 成人一区专区在线观看| 麻豆一区二区免费播放网站| 日美欧韩一区二去三区| 麻豆AV一区二区三区久久| 久久久久久一区国产精品| 天堂Av无码Av一区二区三区| 日本在线一区二区| 国产亚洲一区二区精品| 国产成人久久一区二区不卡三区 | 四虎成人精品一区二区免费网站| 精品国产福利第一区二区三区| 蜜桃视频一区二区| 色欲AV无码一区二区三区| 国产乱码精品一区三上| 国产精品成人99一区无码| 亚洲av乱码一区二区三区按摩| 97久久精品一区二区三区| 日韩国产精品无码一区二区三区| 中文人妻无码一区二区三区| 日韩精品无码一区二区三区四区| 无码人妻一区二区三区精品视频| 国产伦精品一区二区三区免费迷| 日韩精品福利视频一区二区三区| 国产精品乱码一区二区三| 午夜DV内射一区区| 日本人真淫视频一区二区三区| 日韩动漫av在线播放一区| 一区二区三区杨幂在线观看| 亚洲一区二区视频在线观看| 超清无码一区二区三区| 国产午夜精品一区二区三区嫩草| 国产成人无码AV一区二区| 无码AV中文一区二区三区| 99久久无码一区人妻a黑| 相泽南亚洲一区二区在线播放 | 国产一区三区二区中文在线| 久久精品免费一区二区三区| 免费播放一区二区三区| 精产国品一区二区三产区| 国产传媒一区二区三区呀|