日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

CSS單標簽實現復雜的棋盤布局

瀏覽:459日期:2022-06-03 09:24:38
目錄
  • 使用漸變實現網格
  • 利用漸變實現交叉虛線十字
  • 借助偽元素及 box-shadow 實現剩余符合
  • 最后

最近,有網友問我,他們的一個作業,盡量使用少的標簽去實現這樣一個象棋布局:

他用了 60 多個標簽,而他的同學,只用了 6 個,問我有沒有辦法盡可能的做到利用更少的標簽去完成這個布局效果。

其實,對于一個頁面的布局而言,標簽越少不一定是好事,我們在考慮 DOM 的消耗的同時,也需要關注代碼的可讀性,以及后續基于這個布局的制作的交互的難易性等等。

當然,僅僅從用更少的標簽完成這個布局的角度而言,我們能夠把標簽數壓縮到多少呢個?(不考慮 <body><html>

答案是 1 個。

本文就嘗試使用一個標簽完成這個效果,當然,這僅僅是探索 CSS 的極限,不代表我推薦在實際業務中這樣去寫。

我們對整個布局進行一下拆分,大致可以分為三部分:網格 + 虛線交叉十字 + 特殊符號:

并且,像虛線交叉十字和特殊的符號都不止一個,這里必然會有一些技巧存在。

使用漸變實現網格

OK,首先,我們實現最簡單的網格布局:

不考慮最外層的一圈邊框,我們可以首先利用多重線性漸變實現一個網格布局:

<div></div>
.g-grid {    width: 401px;    height: 451px;    background:repeating-linear-gradient(#000, #000 1px, transparent 1px, transparent 50px),repeating-linear-gradient(90deg, #000, #000 1px, transparent 1px, transparent 50px);    background-repeat: no-repeat;    background-size: 100% 100%, 100% 100%;    background-position: 0 0, 0 0;}

效果如下:

在最外層加一層邊框有非常多辦法,這里我們簡單使用 outline 配合 outline-offset 即可:

.g-grid {    width: 401px;    height: 451px;    background:repeating-linear-gradient(#000, #000 1px, transparent 1px, transparent 50px),repeating-linear-gradient(90deg, #000, #000 1px, transparent 1px, transparent 50px);    background-repeat: no-repeat;    background-size: 100% 100%, 100% 100%;    background-position: 0 0, 0 0;    outline: 1px solid #000;    outline-offset: 5px;}

這樣,一個架子就差不多了:

當然,棋盤中間的一行,是沒有格子的。要將上述漸變代碼處理一下,可以分成上下兩塊,利用 background-sizebackground-position 進行分隔。

當然,我們也可以在最上層直接再疊一層純白色漸變:

.grid {    // ...    background:// 最上層疊加一層白色漸變linear-gradient(#fff, #fff),// 下面兩個重復線性漸變實現網格repeating-linear-gradient(#000, #000 1px, transparent 1px, transparent 50px),repeating-linear-gradient(90deg, #000, #000 1px, transparent 1px, transparent 50px);    background-repeat: no-repeat;    background-size: calc(100% - 2px) 49px, 100% 100%, 100% 100%;    background-position: 1px 201px, 0 0, 0 0;}

到這里,其實核心還都是漸變,目前共 3 層漸變,得到這樣一個效果:

利用漸變實現交叉虛線十字

OK,我們繼續,我們需要基于上述的基礎,得到兩個交叉虛線十字,像是這樣:

這里其實真的有難度。想象一下,如果給你一個 DIV,去實現其中一個,可以怎么做呢?

通過 border 中特有的虛線 dashed?這樣可能就需要兩個元素設置單邊的虛線邊框,然后旋轉相交得到。(可以利用元素的兩個偽元素,實現在一個 DOM 中)。

當然,這樣的話,我們的標簽就不夠用了。

所以,這里我們另辟蹊徑,繼續使用漸變!

首先,打個樣,如果是一個 100px x 100px 的 DIV,可以怎么利用漸變去畫交叉虛線十字呢?

<div></div>
div {    position: relative;    margin: auto;    width: 100px;    height: 100px;    border: 1px solid #000;    background: linear-gradient(45deg,transparent 0, transparent calc(50% - 0.5px),#000 calc(50% - 0.5px), #000 calc(50% + 0.5px),transparent calc(50% + 0.5px), transparent 0);}

我們首先利用漸變,實現一條 1px 的斜線,注意這里的漸變是從透明到黑色到透明,實現了一條 45° 的斜線。

我們再反 45° 過來,利用多重線性漸變,實現透明到白色的漸變效果:

div {    position: relative;    margin: auto;    width: 100px;    height: 100px;    border: 1px solid #000;    background: // 漸變 1 repeating-linear-gradient(-45deg, transparent 0, transparent 5px, #fff 5px, #fff 10px),// 漸變 2linear-gradient(45deg,transparent 0, transparent calc(50% - 0.5px),#000 calc(50% - 0.5px), #000 calc(50% + 0.5px),transparent calc(50% + 0.5px), transparent 0);}

這樣,我們就得到了一條虛線:

好吧,這一步有一些同學可能會有一點疑惑,怎么變過來的。

我把上面漸變 1的透明色改成黑色,就很好理解了:

想象一下,上圖的黑色部分,如果是透明的,就能透出原本的那條斜線沒有被白色遮擋住的地方。

這里,需要提一下,在漸變中,越是先書寫的漸變,層級越高。

好,有了上面的鋪墊,我們基于上面的代碼,再繼續利用漸變,把上下兩個交叉虛線十字補齊即可:

.g-grid {    width: 401px;    height: 451px;    outline: 1px solid #000;    outline-offset: 5px;    background:// 最上層的白色塊,擋住中間的網格linear-gradient(#fff, #fff),// 實現網格布局repeating-linear-gradient(#000, #000 1px, transparent 1px, transparent 50px),repeating-linear-gradient(90deg, #000, #000 1px, transparent 1px, transparent 50px),// 棋盤上方的虛線1repeating-linear-gradient(-45deg, transparent 0, transparent 5px, #fff 5px, #fff 10px),linear-gradient(45deg, transparent,     transparent calc(50% - 0.5px),     #000 calc(50% - 0.5px),     #000 calc(50% + 0.5px),     transparent calc(50% + 0.5px),     transparent 0),// 棋盤上方的虛線2repeating-linear-gradient(45deg, transparent 0, transparent 5px, #fff 5px, #fff 10px),linear-gradient(-45deg, transparent,     transparent calc(50% - 0.5px),     #000 calc(50% - 0.5px),     #000 calc(50% + 0.5px),     transparent calc(50% + 0.5px),     transparent 0),// 棋盤下方的虛線1repeating-linear-gradient(-45deg, transparent 0, transparent 5px, #fff 5px, #fff 10px),linear-gradient(45deg, transparent,     transparent calc(50% - 0.5px),     #000 calc(50% - 0.5px),     #000 calc(50% + 0.5px),     transparent calc(50% + 0.5px),     transparent 0),// 棋盤下方的虛線2repeating-linear-gradient(45deg, transparent 0, transparent 5px, #fff 5px, #fff 10px),linear-gradient(-45deg, transparent,     transparent calc(50% - 0.5px),     #000 calc(50% - 0.5px),     #000 calc(50% + 0.5px),     transparent calc(50% + 0.5px),     transparent 0);    background-repeat: no-repeat;    background-size: calc(100% - 2px) 49px, 100% 100%, 100% 100%, // 交叉虛線 1100px 100px, 100px 100px, 100px 100px, 100px 100px,// 交叉虛線 2100px 100px, 100px 100px, 100px 100px, 100px 100px;    background-position: 1px 201px, 0 0, 0 0, // 交叉虛線 1151px 0, 151px 0, 151px 0, 151px 0,// 交叉虛線 2151px 350px, 151px 350px, 151px 350px, 151px 350px;}

嚯,這漸變代碼確實復雜了點,但是其實每一塊的作用都是很清晰的,這樣,我們的棋盤就變成了這樣:

借助偽元素及 box-shadow 實現剩余符合

到這里,我們僅僅使用了元素本身,要知道,我們還有元素的兩個偽元素沒使用。要實現的只剩下多個的這個符合:

因為一共要實現 12 個這樣的符號,有的符合還是不完整的,所有這些要在剩余的元素的兩個偽元素中完成。可選的方法思來想去,也只有 box-shadow 了。

利用 box-shadow 能夠非常好的復制自身。這個技巧其實也反復講過非常多次了。

我們首先利用元素的一個偽元素,在這個位置,實現一個短橫線:

代碼大致如下:

.g-grid {    // ...    &::before {content: "";position: absolute;top: 95px;left: 35px;width: 10px;height: 1px;background: #000;    }}

我們利用 box-shadow 復制自身,可以完成一半橫線效果。當然這里由于是個鏡面布局,可以利用鏡像 -webkit-box-reflect: below 減少一半的代碼:

.g-grid {    // ...    &::before {content: "";position: absolute;top: 95px;left: 35px;width: 10px;height: 1px;background: #000;box-shadow:     20px 0, 0 10px, 20px 10px,    300px 0, 320px 0, 300px 10px, 320px 10px,    -30px 50px, -30px 60px,    50px 50px, 50px 60px, 70px 50px, 70px 60px,    150px 50px, 150px 60px, 170px 50px, 170px 60px,    250px 50px, 250px 60px, 270px 50px, 270px 60px,    350px 50px, 350px 60px;-webkit-box-reflect: below 259px;    }}

效果如下:

最后,利用另外一個偽元素,完成另外一半的豎向橫線即可:

.g-grid {    // ...    &::before {// ...    }    &::after {// ...box-shadow:     10px 0, 0 20px, 10px 20px,    300px 0px, 300px 20px, 310px 0, 310px 20px,    -40px 50px, -40px 70px,    50px 50px, 50px 70px, 60px 50px, 60px 70px,    150px 50px, 150px 70px, 160px 50px, 160px 70px,    250px 50px, 250px 70px, 260px 50px, 260px 70px,    350px 50px, 350px 70px;-webkit-box-reflect: below 260px;    }}

這樣,我們就在一個標簽內,得到這樣一個效果:

當然,還剩下楚河、漢界 4 個字,這個也簡單直接加在 div 中即可,配合一些簡單的 CSS 調整,整個效果就在一個標簽內完成啦:

完整的代碼你可以戳這里:CodePen Demo -- CSS Chess board

好,實際中我確實不太推薦這么去寫,純粹是為了實現而實現,少了很多代碼可讀性的考量。因此,本文更多的是給大家帶來一些思路,當遇到類似的問題的使用能夠有更多的靈感。

最后

到此這篇關于CSS單標簽實現復雜的棋盤布局的文章就介紹到這了,更多相關單標簽 實現 棋盤布局內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: CSS HTML
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产极品模特精品一二| 久久五月天小说| 亚洲自啪免费| 91久久久久| 日韩中文欧美在线| 日韩和的一区二在线| 免费国产自久久久久三四区久久| 女主播福利一区| 亚洲色图网站| 久久国产人妖系列| 久久69成人| 香蕉久久精品| 亚洲主播在线| 欧美片第1页综合| 精品五月天堂| 欧美精品一区二区三区精品| 亚洲人成网77777色在线播放 | 色一区二区三区四区| 麻豆国产在线| 免费黄色成人| 日韩精品亚洲一区二区三区免费| 国产精品15p| 日本国产精品| 视频一区二区中文字幕| 国产欧美自拍一区| 日韩欧美在线中字| 丝袜a∨在线一区二区三区不卡| 日本精品另类| 波多视频一区| 亚洲精品动态| 福利一区和二区| 亚洲在线观看| 日韩精品视频在线看| 欧美国产小视频| 视频一区欧美精品| 久久伊人久久| 免费成人在线影院| 国产成人精品三级高清久久91| 午夜欧美在线| 国产黄色精品| 爽爽淫人综合网网站| 欧美精品导航| 亚洲欧美日本日韩| 精品91福利视频| 免费在线观看一区二区三区| 国产精品99在线观看| 99riav1国产精品视频| 亚洲精品麻豆| 私拍精品福利视频在线一区| 久久精品99久久久| 在线看片不卡| 日产午夜精品一线二线三线| 在线免费观看亚洲| 99久久久久国产精品| 国产美女亚洲精品7777| 午夜亚洲精品| 久久国产直播| 欧美a在线观看| 午夜亚洲福利| 香蕉国产精品| 久久91导航| 国产精品www994| 噜噜噜躁狠狠躁狠狠精品视频 | 久久精品资源| 美女91精品| 免费看av不卡| 国产精品久久国产愉拍| 亚洲少妇在线| 久久国产中文字幕| 欧美日韩91| 久久性天堂网| 午夜久久免费观看| 免费在线观看一区| 欧美亚洲综合视频| 亚洲国产一区二区三区在线播放| 久久精品午夜| 国产精品成人**免费视频| 亚洲专区视频| 亚洲午夜精品久久久久久app| 久久久久观看| 国产精品视频一区二区三区 | 欧美日韩高清| 美女久久久精品| 日韩精品国产精品| 日韩精品一二三区| 中文亚洲免费| 国产亚洲激情| 国产亚洲在线| 日韩视频精品在线观看| 一区二区三区视频免费观看| 国产一区二区三区久久 | 亚洲经典在线| 五月天久久网站| 美女久久久久| 欧美日韩国产探花| 欧美一区二区性| 神马午夜久久| 国产中文一区| 红桃视频欧美| 久久国产高清| 亚洲1区在线| 欧美亚洲自偷自偷| 国产伦理久久久久久妇女| 欧美日韩一区二区三区不卡视频| 青青青国产精品| 青青伊人久久| 国产精品天堂蜜av在线播放| 国产精品午夜一区二区三区| 久久中文精品| 日韩中文影院| 日本免费久久| 午夜日韩福利| 另类亚洲自拍| 日本午夜精品一区二区三区电影 | 亚洲影视一区二区三区| 欧美一级二级三级视频| 国产精品伊人| 福利一区二区免费视频| 日韩免费福利视频| 欧美在线资源| 日韩高清在线一区| 日本vs亚洲vs韩国一区三区二区| 国产午夜一区| 国产伦久视频在线观看| 蜜臀久久99精品久久一区二区| 老鸭窝亚洲一区二区三区| 奇米色欧美一区二区三区| 国产激情久久| 久久久噜噜噜| 日韩在线成人| 日韩av在线中文字幕| 欧美肉体xxxx裸体137大胆| 亚洲人成精品久久久| 美女在线视频一区| 亚洲va在线| 亚洲69av| 精品一区二区三区四区五区| 精品日韩视频| 天海翼亚洲一区二区三区| 美女久久久精品| 欧美理论视频| 91精品在线免费视频| 色一区二区三区四区| 久久国产精品毛片| 欧美激情 亚洲a∨综合| 亚洲高清成人| 久久国产麻豆精品| 欧美成a人免费观看久久| 日韩欧美在线精品| 精品一区电影| 久久亚洲影院| 国产精品一区二区三区av麻 | 国产精品综合| 黑丝美女一区二区| 欧美国产另类| 亚洲深爱激情| 福利一区和二区| 亚洲免费福利一区| 日韩精品久久久久久久电影99爱| 日本不卡高清| 欧美 日韩 国产一区二区在线视频| 欧美三级第一页| 欧美日韩视频| 国产精品毛片久久| 日韩中文字幕区一区有砖一区| 卡一精品卡二卡三网站乱码| 男女男精品网站| 日韩欧美1区| 国产欧美精品| 亚洲视频二区| 今天的高清视频免费播放成人| 国产区精品区| 亚洲综合婷婷| 午夜精品亚洲| 久久精品国语| 国产成人调教视频在线观看| 日韩一区精品| 免费在线观看精品| 欧美影院三区| 国产一区丝袜| 国产日韩欧美一区在线| 国产一级一区二区| 久久精品动漫| 日韩理论视频| 国产精品一级| 日韩精品免费视频人成| 亚洲黄色影院| 99成人在线视频| 久久久久久网| 美女久久99| 免费日韩成人| 国产精品一级| 国产丝袜一区| 人人精品久久| 国产毛片一区| 亚洲福利精品| 免费不卡中文字幕在线| 99精品综合| 久久激情网站| 久久久亚洲一区|