前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >单标签实现复杂的棋盘布局

单标签实现复杂的棋盘布局

作者头像
Sb_Coco
发布于 2022-10-05 09:10:32
发布于 2022-10-05 09:10:32
62800
代码可运行
举报
文章被收录于专栏:Coco的专栏Coco的专栏
运行总次数:0
代码可运行

最近,有群友问我,他们的一个作业,尽量使用少的标签去实现这样一个象棋布局:

用了 60 多个标签,而他的同学,只用了 6 个,问我有没有办法尽可能的做到利用更少的标签去完成这个布局效果。

其实,对于一个页面的布局而言,标签越少不一定是好事,我们在考虑 DOM 的消耗的同时,也需要关注代码的可读性,以及后续基于这个布局的制作的交互的难易性等等。

当然,仅仅从用更少的标签完成这个布局的角度而言,我们能够把标签数压缩到多少呢个?(不考虑 <body><html>

答案是 1 个

本文就尝试使用一个标签完成这个效果,当然,这仅仅是探索 CSS 的极限,不代表我推荐在实际业务中这样去写。

我们对整个布局进行一下拆分,大致可以分为三部分:网格 + 虚线交叉十字 + 特殊符号:

并且,像虚线交叉十字和特殊的符号都不止一个,这里必然会有一些技巧存在。

使用渐变实现网格

OK,首先,我们实现最简单的网格布局:

不考虑最外层的一圈边框,我们可以首先利用多重线性渐变实现一个网格布局:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="g-grid"></div>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.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 即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.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 进行分隔。

当然,我们也可以在最上层直接再叠一层纯白色渐变:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.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,可以怎么利用渐变去画交叉虚线十字呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div></div>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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° 过来,利用多重线性渐变,实现透明到白色的渐变效果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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),
        // 渐变 2
        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);
}

这样,我们就得到了一条虚线:

好吧,这一步有一些同学可能会有一点疑惑,怎么变过来的。

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

想象一下,上图的黑色部分,如果是透明的,就能透出原本的那条斜线没有被白色遮挡住的地方。

这里,需要提一下,在渐变中,越是先书写的渐变,层级越高。

好,有了上面的铺垫,我们基于上面的代码,再继续利用渐变,把上下两个交叉虚线十字补齐即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.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),
        // 棋盘上方的虚线1
        repeating-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),
        // 棋盘上方的虚线2
        repeating-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),
        // 棋盘下方的虚线1
        repeating-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),
        // 棋盘下方的虚线2
        repeating-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%, 
        // 交叉虚线 1
        100px 100px, 100px 100px, 100px 100px, 100px 100px,
        // 交叉虚线 2
        100px 100px, 100px 100px, 100px 100px, 100px 100px;
    background-position: 
        1px 201px, 0 0, 0 0, 
        // 交叉虚线 1
        151px 0, 151px 0, 151px 0, 151px 0,
        // 交叉虚线 2
        151px 350px, 151px 350px, 151px 350px, 151px 350px;
}

嚯,这渐变代码确实复杂了点,但是其实每一块的作用都是很清晰的,这样,我们的棋盘就变成了这样:

借助伪元素及 box-shadow 实现剩余符合

到这里,我们仅仅使用了元素本身,要知道,我们还有元素的两个伪元素没使用。要实现的只剩下多个的这个符合:

因为一共要实现 12 个这样的符号,有的符合还是不完整的,所有这些要在剩余的元素的两个伪元素中完成。可选的方法思来想去,也只有 box-shadow 了。

利用 box-shadow 能够非常好的复制自身。这个技巧其实也反复讲过非常多次了。

我们首先利用元素的一个伪元素,在这个位置,实现一个短横线:

代码大致如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.g-grid {
    // ...
    &::before {
        content: "";
        position: absolute;
        top: 95px;
        left: 35px;
        width: 10px;
        height: 1px;
        background: #000;
    }
}

我们利用 box-shadow 复制自身,可以完成一半横线效果。当然这里由于是个镜面布局,可以利用镜像 -webkit-box-reflect: below 减少一半的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.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;
    }
}

效果如下:

最后,利用另外一个伪元素,完成另外一半的竖向横线即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.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

好,实际中我确实不太推荐这么去写,纯粹是为了实现而实现,少了很多代码可读性的考量。因此,本文更多的是给大家带来一些思路,当遇到类似的问题的使用能够有更多的灵感。

最后

好了,本文到此结束,希望本文对你有所帮助 😃

如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-09-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
时间序列GARCH模型分析股市波动率
在这篇文章中,我们将学习一种在价格序列中建立波动性模型的标准方法,即广义自回归条件异方差(GARCH)模型。
拓端
2022/03/11
2.6K0
时间序列GARCH模型分析股市波动率
深度 | 在R中估计GARCH参数存在的问题(续)
在之前的博客《在 R 中估计 GARCH 参数存在的问题》中,Curtis Miller 讨论了 fGarch 包和 tseries 包估计 GARCH(1, 1) 模型参数的稳定性问题,结果不容乐观。本文承接之前的博客,继续讨论估计参数的稳定性,这次使用的是前文中提到,但没有详尽测试的 rugarch 包。
量化投资与机器学习微信公众号
2019/02/26
2K0
R语言基于ARMA-GARCH-VaR模型拟合和预测实证研究分析案例
本文显示了如何基于潜在的ARMA-GARCH过程(当然也涉及更广泛意义上的QRM)来拟合和预测风险价值(VaR)。
拓端
2020/11/11
1K0
R语言基于ARMA-GARCH-VaR模型拟合和预测实证研究分析案例
R语言: GARCH模型股票交易量的研究道琼斯股票市场指数|附代码数据
我将建立道琼斯工业平均指数(DJIA)日交易量对数比的ARMA-GARCH模型。 ``
拓端
2023/09/12
3070
R语言用多元ARMA,GARCH ,EWMA, ETS,随机波动率SV模型对金融时间序列数据建模|附代码数据
本文将说明单变量和多变量金融时间序列的不同模型,特别是条件均值和条件协方差矩阵、波动率的模型
拓端
2023/05/06
4580
R语言基于ARMA-GARCH-VaR模型拟合和预
本文显示了如何基于潜在的ARMA-GARCH过程(当然也涉及更广泛意义上的QRM)来拟合和预测风险价值(VaR)。
拓端
2020/11/19
1.1K0
R语言基于ARMA-GARCH-VaR模型拟合和预
R语言股票市场指数:ARMA-GARCH模型和对数收益率数据探索性分析|附代码数据
最近我们被客户要求撰写关于ARMA-GARCH的研究报告,包括一些图形和统计输出。
拓端
2023/02/21
1.1K0
R语言使用多元AR-GARCH模型衡量市场风险|附代码数据
董事会感到关切的是,公司已连续第五个季度未能实现盈利预期。股东不高兴。罪魁祸首似乎是商品销售成本的波动。
拓端
2022/11/08
3800
R语言具有Student-t分布改进的GARCH(1,1)模型的贝叶斯估计|附代码数据
本说明介绍使用Student-t改进的GARCH(1,1)模型对汇率对数收益进行贝叶斯估计。
拓端
2023/09/13
2630
R语言股票市场指数:ARMA-GARCH模型和对数收益率数据探索性分析|附代码数据
本文将分析工业指数(DJIA)。工业指数(DIJA)是一个股市指数,表明30家大型上市公司的价值。工业指数(DIJA)的价值基于每个组成公司的每股股票价格之和(点击文末“阅读原文”获取完整代码数据)。
拓端
2022/11/01
6790
R语言单变量和多变量(多元)动态条件相关系数DCC-GARCH模型分析股票收益率金融时间序列数据波动率
当您处理金融时间序列时,我们通常可以获得相对高频的观察结果。例如,每天进行观察是很常见的。事实上,现在可以获得每小时、分钟、秒甚至毫秒的观测值。
拓端
2025/03/28
950
R语言单变量和多变量(多元)动态条件相关系数DCC-GARCH模型分析股票收益率金融时间序列数据波动率
garch模型的结果分析_管理学五力模型分析案例
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/17
4510
garch模型的结果分析_管理学五力模型分析案例
python中的copula:Frank、Clayton和Gumbel copula模型估计与可视化|附代码数据
你可能会问,为什么是copulas?我们指的是数学上的概念。简单地说,copulas是具有均匀边缘分布的联合分布函数 。
拓端
2023/01/04
1.9K0
Garch波动率预测的区制转移交易策略
本文提出了一种算法,可以根据市场波动性在均值回归和趋势跟随策略之间进行切换。研究了两种模型:一种使用历史波动率,另一种使用Garch(1,1)波动率预测。均值回归策略使用RSI(2)建模:RSI(2)时为Long,否则为Short。趋势跟踪策略以SMA 50/200交叉建模:当SMA(50)> SMA(200)时为Long,否则为Short。
拓端
2022/03/05
7720
Garch波动率预测的区制转移交易策略
R语言GARCH模型对股市sp500收益率bootstrap、滚动估计预测VaR、拟合诊断和蒙特卡罗模拟可视化|附代码数据
Box 等人的开创性工作(1994) 在自回归移动平均模型领域的相关工作为波动率建模领域的相关工作铺平了道路,分别由 Engle (1982) 和 Bollerslev (1986) 引入了 ARCH 和 GARCH 模型
拓端
2023/05/30
3630
在 R 中估计 GARCH 参数存在问题(基于 rugarch 包)
这是一篇本应早就写完的博客文章。一年前我写了一篇文章,关于在 R 中估计 GARCH(1, 1) 模型参数时遇到的问题。我记录了参数估计的行为(重点是 β ),以及使用 fGarch 计算这些估计值时发现的病态行为。我在 R 社区呼吁帮助,包括通过 R Finance 邮件列表发送我的博客文章。
量化投资与机器学习微信公众号
2019/02/26
4.4K0
ARMA-GARCH-COPULA模型和金融时间序列案例|附代码数据
这个想法是在这里使用一些多变量ARMA-GARCH过程。这里的启发式是第一部分用于模拟时间序列平均值的动态,第二部分用于模拟时间序列方差的动态。
拓端
2023/01/31
3840
R语言ARIMA-GARCH波动率模型预测股票市场苹果公司日收益率时间序列|附代码数据
最近我们被客户要求撰写关于ARIMA-GARCH的研究报告,包括一些图形和统计输出。
拓端
2023/01/09
5480
R语言HAR和HEAVY模型分析高频金融数据波动率|附代码数据
在本文中,在学术界和金融界,分析高频财务数据的经济价值现在显而易见。(点击文末“阅读原文”获取完整代码数据)
拓端
2022/11/04
7750
R语言实现:基于GARCH模型的股市危机预警
作者:huozi07 http://blog.csdn.net/huoz07/artile/details/48176587 为防范股票市场上的不确定性和风险,有效地度量股票指数收益率的波动性显得尤为重要。本文运用GARCH族模型拟合了股票指数收益率的波动性方程并实证研究了全球有代表性的上证综指、NASDAQ指数、德国DAX、日本日经指数。结果表明四个国家股票收益率均有聚集性、持续性,股票市场存在着冲击的非对称性。具体而言,美国、德国、日本股票市场对利空消息敏感,而对利好消息保持谨慎。而中国对利好利空消息均
机器学习AI算法工程
2018/03/14
5.3K0
R语言实现:基于GARCH模型的股市危机预警
推荐阅读
时间序列GARCH模型分析股市波动率
2.6K0
深度 | 在R中估计GARCH参数存在的问题(续)
2K0
R语言基于ARMA-GARCH-VaR模型拟合和预测实证研究分析案例
1K0
R语言: GARCH模型股票交易量的研究道琼斯股票市场指数|附代码数据
3070
R语言用多元ARMA,GARCH ,EWMA, ETS,随机波动率SV模型对金融时间序列数据建模|附代码数据
4580
R语言基于ARMA-GARCH-VaR模型拟合和预
1.1K0
R语言股票市场指数:ARMA-GARCH模型和对数收益率数据探索性分析|附代码数据
1.1K0
R语言使用多元AR-GARCH模型衡量市场风险|附代码数据
3800
R语言具有Student-t分布改进的GARCH(1,1)模型的贝叶斯估计|附代码数据
2630
R语言股票市场指数:ARMA-GARCH模型和对数收益率数据探索性分析|附代码数据
6790
R语言单变量和多变量(多元)动态条件相关系数DCC-GARCH模型分析股票收益率金融时间序列数据波动率
950
garch模型的结果分析_管理学五力模型分析案例
4510
python中的copula:Frank、Clayton和Gumbel copula模型估计与可视化|附代码数据
1.9K0
Garch波动率预测的区制转移交易策略
7720
R语言GARCH模型对股市sp500收益率bootstrap、滚动估计预测VaR、拟合诊断和蒙特卡罗模拟可视化|附代码数据
3630
在 R 中估计 GARCH 参数存在问题(基于 rugarch 包)
4.4K0
ARMA-GARCH-COPULA模型和金融时间序列案例|附代码数据
3840
R语言ARIMA-GARCH波动率模型预测股票市场苹果公司日收益率时间序列|附代码数据
5480
R语言HAR和HEAVY模型分析高频金融数据波动率|附代码数据
7750
R语言实现:基于GARCH模型的股市危机预警
5.3K0
相关推荐
时间序列GARCH模型分析股市波动率
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档