如何用 CSS 和 D3 创作一个用文字组成的心形图案

在这里插入图片描述

效果预览

在线演示

按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。

https://codepen.io/comehope/pen/xJvERW

可交互视频

此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。

请用 chrome, safari, edge 打开观看。

https://scrimba.com/p/pEgDAM/cm94eu6

源代码下载

本地下载

每日前端实战系列的全部源代码请从 github 下载:

https://github.com/comehope/front-end-daily-challenges

代码解读

定义 dom,容器中包含 3 个子元素,每个子元素中有一个单词:


<div class="love">
    <span>aaa</span>
    <span>bbb</span>
    <span>ccc</span>
</div>

居中显示:


body {
    margin: 0;
    height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    background-color: black;
}

定义容器尺寸:


.love {
    width: 450px;
    height: 450px;
}

设置文本样式:


.love {
    position: relative;
}

.love span {
    position: absolute;
    left: 0;
    color: goldenrod;
    font-size: 20px;
    font-family: sans-serif;
    text-shadow: 0 0 1em white;
}

定义文本左右往复移动的动画:


.love span {
    animation: x-move 10s ease-in-out infinite alternate;
}

@keyframes x-move {
    to {
        left: 450px;
    }
}

定义子元素的下标变量,设置动画延时,使各单词依次入场:


.love {
    --particles: 3;
}

.love span {
    animation-delay: calc(20s / var(--particles) * var(--n) * -1);
}

.love span:nth-child(1) {
    --n: 1;
}

.love span:nth-child(2) {
    --n: 2;
}

.love span:nth-child(3) {
    --n: 3;
}

增加文本沿心形运动的动画效果:


.love span {
    animation: 
        x-move 10s ease-in-out infinite alternate,
        y-move 20s linear infinite;
}

@keyframes y-move {
    0% { transform: translateY(180px); }
    10% { transform: translateY(45px); }
    15% { transform: translateY(5px); }
    18% { transform: translateY(0); }
    20% { transform: translateY(5px); }
    22% { transform: translateY(35px); }
    24% { transform: translateY(65px); }
    25% { transform: translateY(110px); }
    26% { transform: translateY(65px); }
    28% { transform: translateY(35px); }
    30% { transform: translateY(5px); }
    32% { transform: translateY(0); }
    35% { transform: translateY(5px); }
    40% { transform: translateY(45px); }
    50% { transform: translateY(180px); }
    71% { transform: translateY(430px); }
    72.5% { transform: translateY(440px); }
    75% { transform: translateY(450px); }
    77.5% { transform: translateY(440px); }
    79% { transform: translateY(430px); }
    100% { transform: translateY(180px); }
}

接下来用 d3 批量处理 dom 元素和 css 变量。
引入 d3 库:


<script src="https://d3js.org/d3.v5.min.js"></script>

声明一个数组,包含若干单词:


const words = ['aaa', 'bbb', 'ccc'];

用 d3 创建 dom 元素:


d3.select('.love')
    .selectAll('span')
    .data(words)
    .enter()
    .append('span')
    .text((d) => d);

用 d3 为 css 变量赋值:


d3.select('.love')
    .style('--particles', words.length)
    .selectAll('span')
    .data(words)
    .enter()
    .append('span')
    .style('--n', (d, i) => i + 1)
    .text((d) => d);

删除 html 文件中相关的 dom 元素和 css 文件中相关的 css 变量。

把数组元素改为“爱”在各种语言的单词:


const words = [
    '愛', 'Love', 'Amour', 'Liebe', 'Amore',
    'Amor', 'Любовь', 'الحب', 'प्यार', 'Cinta',
    'Αγάπη', '사랑', 'Liefde', 'Dashuri', 'Каханне',
    'Ljubav', 'Láska', 'Armastus', 'Mahal', 'אהבה', 
    'Szerelem', 'Grá', 'Mīlestība', 'Meilė', 'Любов', 
    'Љубовта', 'Cinta', 'عشق', 'Dragoste', 'Láska', 
    'Renmen', 'ፍቅር', 'munaña', 'Sevgi', 'Љубав', 
    'karout', 'amà', 'amôr', 'kærleiki', 'mborayhu', 
    'Upendo', 'sòòyayyàà', 'ljubav', 'Սեր', 'сүю', 
    'сүйүү', 'tia', 'aroha', 'KHAIR', 'प्रेम', 
    'kjærlighet', 'munay', 'jecel', 'Kärlek', 'soymek', 
    'Mahal', 'ярату', 'محبت', 'sopp', 'uthando', 
    'ความรัก', 'Aşk', 'Tình yêu', 'ליבע'];

最后,为第 1 个单词设置特殊的文字样式:


.love span:first-child {
    color: orangered;
    font-size: 3em;
    text-shadow: 
        0 0 0.1em black,
        0 0 1em white;
    z-index: 1;
}

大功告成!

原文地址:https://segmentfault.com/a/1190000016054581

### 回答1: 我可以用以下HTML和CSS代码画一个心形:<html> <head> <style> .heart { position: relative; width: 100px; height: 90px; } .heart:before, .heart:after { position: absolute; content: ""; left: 50px; top: 0; width: 50px; height: 80px; background: #f00; -moz-border-radius: 50px 50px 0 0; border-radius: 50px 50px 0 0; -webkit-transform: rotate(-45deg); -moz-transform: rotate(-45deg); -ms-transform: rotate(-45deg); -o-transform: rotate(-45deg); transform: rotate(-45deg); -webkit-transform-origin: 0 100%; -moz-transform-origin: 0 100%; -ms-transform-origin: 0 100%; -o-transform-origin: 0 100%; transform-origin: 0 100%; } .heart:after { left: 0; -webkit-transform: rotate(45deg); -moz-transform: rotate(45deg); -ms-transform: rotate(45deg); -o-transform: rotate(45deg); transform: rotate(45deg); -webkit-transform-origin: 100% 100%; -moz-transform-origin: 100% 100%; -ms-transform-origin: 100% 100%; -o-transform-origin: 100% 100%; transform-origin :100% 100%; } </style> </head> <body> <div class="heart"></div> </body> </html> ### 回答2: 要用HTML和CSS一个心形,可以按照以下步骤进行操作: 1. 创建一个HTML文件,并在文件中添加一个div元素作为容器。 2. 在CSS中,将div元素的宽度和高度设置为相同的值(比如200px),并将其position属性设置为relative,以便在后续的操作中能够对其内部元素进行定位。 3. 在该div元素内部创建两个span元素,分别表示心形的两部分。 4. 为两个span元素设置宽度和高度,同时设置它们的position属性为absolute,以便在父容器中准确地定位它们。 5. 使用transform属性将两个span元素进行旋转,并对其进行调整,使它们看起来像一个完整的心形。 6. 通过调整span元素的颜色和背景颜色,以及对容器的背景颜色进行设置,美化心形的外观。 7. 根据具体需求,可以通过调整span元素的位置和大小,以及对容器的宽度和高度进行调整来改变心形的大小和形状。 通过以上步骤,就可以使用HTML和CSS成功地画出一个心形。当然,这只是其中一种方式,根据个人的需求和创作灵感,可以选择不同的方式来绘制心形。 ### 回答3: 要用HTML和CSS一个心形,可以按照以下步骤进行操作: 1. 首先,创建一个HTML文件,并打开编辑器。在文件中创建一个div元素,给该div元素一个id或class以便样式化。 2. 接下来,在CSS部分设置div的宽度和高度为相同的值,可以使用`width`和`height`属性,也可以使用`padding`属性控制。 3. 为了形成一个心形,需要调整div的形状。在CSS中,将`border-radius`设置为50%,以使div变成一个圆形。 4. 为了使圆形变成心形,需要调整div的左右边框,将其缩小。可以使用`border-left`和`border-right`属性,将其设置为较窄的值。 5. 调整边框的颜色和填充颜色,可以使用`border-color`和`background-color`属性,将其设置为适合心形的颜色。 示例代码如下: HTML部分: ``` <div id="heart-shape"></div> ``` CSS部分: ``` #heart-shape { width: 100px; height: 100px; border-radius: 50%; border-left: 20px solid red; border-right: 20px solid red; border-bottom: 20px solid red; background-color: red; } ``` 以上代码会在页面上创建一个红色的心形。可以根据需要调整heart-shape元素的大小,边框的宽度和颜色,以达到所需的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值