Arhn - архитектура программирования

Как я могу создавать изогнутые 3D-объекты с помощью html и css

У меня есть 3D-объект html/css, как на картинке 2. Я хочу сделать его немного изогнутым, как на картинке 1.

Есть ли у кого-нибудь идея, как этого можно достичь, или есть ли какая-либо другая технология, с помощью которой я могу формировать эти трехмерные объекты?

введите здесь описание изображения

введите здесь описание изображения

Это код моего объекта на картинке 2:

.container {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}

.cube {
  background: #dc2e2e;
  width: 200px;
  height: 50px;
  position: relative;
  margin: 50px;
  transform: rotate(32deg);
}

.cube::before {
  content: '';
  display: inline-block;
  background: #f15757;
  width: 200px;
  height: 2px;
  transform: skewX( -80deg);
  position: absolute;
  top: -2px;
  left: 6px;
}

.cube::after {
  content: '';
  display: inline-block;
  background: #9e1515;
  width: 12px;
  height: 50px;
  transform: skewY(-10deg);
  position: absolute;
  top: -1px;
  left: 100%;
}
<div class="container">
  <div class="cube"></div>
</div>

02.07.2021

  • Как вы спросили, есть ли какая-либо другая технология, с помощью которой я могу формировать эти 3D-объекты? Я думаю, что библиотека threejs.org отлично подойдет для такой сложной работы с 3D в браузере. 05.07.2021
  • Я хочу сделать его немного изогнутым, как на картинке 1 - это две совершенно разные картинки, что вы пытаетесь сделать? 05.07.2021
  • @ Spectric, сколько еще ты хочешь, чтобы он объяснил? Это две разные картинки, но он хочет согнуть свою форму в CSS и, возможно, затенить ее. Как это не сделать вывод? 10.07.2021
  • @ Дэвид, я хочу, чтобы это было немного криво, это очень расплывчато. На первом рисунке несколько блоков, а на втором — один. Это дает ответчику слишком много предположений и, следовательно, требует большего внимания. 10.07.2021

Ответы:


1

Создать дугу из элемента div не так просто. Также использование тега div для создания фигур и графики не является хорошим способом, вместо этого вы должны использовать масштабируемую векторную графику (SVG), HTML Canvas, WebGL или любые другие библиотеки JS.

Используя тег div, вы можете создать нижнюю дугу, добавив радиус нижней границы:

.cube {
  background: #dc2e2e;
  width: 200px;
  height: 50px;
  position: relative;
  margin: 50px;
  box-shadow: 0px 10px 16px -6px black;
  border-bottom-left-radius: 50%;
  border-bottom-right-radius: 50%;
}
<div class="container">
<div class="cube"></div>
</div>

Но вы не можете получить верхнюю дугу, используя верхний радиус границы, потому что его использование создаст дугу в противоположном направлении и, таким образом, создаст овал вместо арки.

Одна вещь, которую вы можете сделать, это наложить на верхнюю часть прямоугольника другой тег div белого цвета, чтобы создать эффект арки.

.arch {
  width: 200px;
  overflow: hidden;
}
.lowerarc {
  width: 240px;
  position: relative;
  right: -10px;  
  left: -20px;
  height: 80px;
  background-color: black; 
  border-bottom-left-radius: 50%;
  border-bottom-right-radius: 50%;
}
.upperarc {
  height: 80px;
  position: relative;
  width: 240px;
  top: -120px;
  right: -10px;
  left: -20px;
  background-color: white; 
  border-bottom-left-radius: 50%;
  border-bottom-right-radius: 50%; 
}
<div class="arch">
  <div class="lowerarc"></div>
  <div class="upperarc"></div>
</div>

Но это не выглядит хорошо. поэтому использование div, вероятно, не лучший способ получить желаемый результат.

Вместо этого попробуйте использовать SVG: в приведенном ниже примере мы создаем арку, используя линии и кривые, отображая значения пикселей и заливая форму определенным цветом.

M means move to, L to create a line, Q to draw curves, and z to close the path and the number corresponding to it are the values in pixel

<svg width="200">
<path d="M0,0 L0,50 Q100,80 200,50 L200,0 Q100,25 0, 0z" fill="black" />
</svg>

В приведенном ниже коде мы просто создаем кривую линию, но толщиной 50 пикселей.

<svg viewBox="0 0 1000 400">
  <path d="M 60,250 C 60,150 150,50 250,50" fill="none" 
stroke="green" stroke-width="50"></path>
</svg>

Используйте Canvas: Canvas похож на Svg, но использует javascript для создания пути и графики.

var canvas = document.getElementById('canvas');
var c = canvas.getContext('2d');

c.beginPath();
c.moveTo(60, 0);
c.lineTo(10, 0);
c.quadraticCurveTo(0, 170, 170, 250);
c.lineTo(195, 210);
c.quadraticCurveTo(50, 150, 60, 0);
c.fill();
<canvas id="canvas" width="622" height="1080"></canvas>

Хотя SVG и Canvas используются только для создания 2D-графики, тем не менее, вы можете использовать 2D-объекты вместе для создания 3D-иллюзии.

var canvas = document.getElementById('canvas');
var c = canvas.getContext('2d');

c.fillStyle="rgba(0, 0, 25, 0.7)";
c.beginPath();
c.moveTo(10, 0);
c.lineTo(0, 5);
c.quadraticCurveTo(-10, 180, 170, 260);
c.lineTo(195, 220);
c.lineTo(195, 210);
c.quadraticCurveTo(30, 250, 60, 0);
c.fill();

c.fillStyle="rgb(200, 210, 200)";
c.beginPath();
c.moveTo(60, 0);
c.lineTo(10, 0);
c.quadraticCurveTo(0, 165, 170, 250);
c.lineTo(195, 210);
c.quadraticCurveTo(50, 135, 60, 0);
c.fill();
<canvas id="canvas" width="622" height="1080"></canvas>
<script src="main.js">
</script>

Коды SVG и Canvas выглядят пугающе, но это не так сложно, как кажется. Вы можете прочитать документацию или посмотреть учебные пособия на Youtube, чтобы изучить его правильно.

05.07.2021

2

Создание изогнутых 3D-объектов на чистом html/css не очень просто, но выполнимо. Есть несколько способов сделать это, но вам нужно будет точно понять, чего вы хотите и как изменить число, чтобы достичь этого.

Вы можете сложить несколько элементов div, чтобы создать изогнутый 3D-эффект, а затем сместить ось Z для каждого из них. По сути, вы просто складываете множество элементов вместе, чтобы создать иллюзию изогнутого 3D-объекта. В приведенных ниже ссылках я использую радиальный градиент.

Я бы порекомендовал использовать для этого препроцессор, такой как SCSS, поскольку он позволяет вам запускать цикл для смещения каждого элемента, вырезая много кода, который вам пришлось бы писать для каждого элемента. Также имейте в виду, что если вы собираетесь анимировать это позже, это будет очень утомительно для обработки в зависимости от устройства. Если вы пытаетесь сделать его статическим, это не должно быть проблемой. СКСС

@for $i from 1 through 20 {
            $color: red;
            &:nth-child(#{$i}) {
              position: absolute;
              width: $width;
              height: $height;
              list-style: none;
              background: rgb(0, 0, 0);
              background: radial-gradient(
                circle at 50% 150%,
                rgba(0, 0, 0, 0) 0%,
                rgba(0, 0, 0, 0) 60%,
                darkred 60%,
                darkred 70%,
                rgba(0, 0, 0, 0) 70%,
                rgba(0, 0, 0, 0) 100%
              );
              transform: translateZ(-20px + (0.8px * ($i - 1)));
              filter: blur(0px) contrast(200%);
        }

пример простых кривых 1 0100

пример сложного искусства 2 https://codepen.io/jfirestorm44/pen/qBZYQBL

Как я уже сказал о производительности; Пример 2 потребует некоторой вычислительной мощности и может отставать. Объект можно вращать щелчком мыши.

05.07.2021

3

Я хотел бы добавить к ответу @Miran Firdausi о SVG (но пока не могу комментировать). Хороший способ создать SVG, а затем жестко закодировать их в CSS, — это использовать любую программу векторного рисования (например, Inkscape), чтобы нарисовать именно то, что вы хотите, а затем сохранить как SVG.

Вы можете открыть файл .svg в редакторе кода, и вы увидите разметку XML, включая коды, которые вы можете скопировать в свой HTML, как в примере @Miran:

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" version="1.1" role="img" aria-hidden="true" focusable="false">
   [copy the <path> elements here]
</svg>

Или сохраните файл .svg где-нибудь и обратитесь к нему в CSS:

/* Add calendar icon */
.wp-social-link.my-calendar-icon > a {
    background-image: url(assets/images/my-calendar.svg);
    background-repeat: no-repeat;
    background-position: center;
    background-size: 36px;
        width: 54px;
        height: 54px;
        filter: invert(100%) brightness(100%) contrast(100%);
}
10.07.2021
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..