Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Создание геометрических фигур на JS (https://javascript.ru/forum/misc/79167-sozdanie-geometricheskikh-figur-na-js.html)

Biotoxsin 26.12.2019 20:56

Создание геометрических фигур на JS
 
Здравствуйте.

Возможно ли в пустой области 100x100px div создать без вспомогательных HTML тегов чёрный квадрат 50x50px на чистом JS.
Меня интересует именно сам процесс как это делается, возможно вы посоветуете какие то гайды или библиотеки которые позволяют такое делать?

рони 26.12.2019 22:27

Biotoxsin,
https://developer.mozilla.org/ru/docs/Web/CSS/::before

Biotoxsin 26.12.2019 23:33

Цитата:

Сообщение от рони (Сообщение 518084)

Меня интересует возможно ли сделать это только на JS?

Biotoxsin 26.12.2019 23:34

Эта небольшая задачка поможет мне понять как справиться с моей проблемой.

Malleys 26.12.2019 23:54

Цитата:

Сообщение от Biotoxsin
Эта небольшая задачка поможет мне понять как справиться с моей проблемой.

Цитата:

Сообщение от Biotoxsin
Возможно ли в пустой области 100x100px div создать без вспомогательных HTML тегов чёрный квадрат 50x50px.

Да! Существует множество способов это сделать... Вот некоторые примеры... Все эти стили могут быть установлены через JS, не требуются псевдо-элементы
<div></div><div></div>
<div></div><div></div>
<div></div><div></div>
<div></div><div></div>
<div></div><div></div>
<div></div><div></div>
<div></div><div></div>
<style>
/* вспомогательные объявления, не относящиеся к примеру */
html {
	background: linear-gradient(45deg, red, blue);
	min-height: 100%;
}

div {
	width: 100px;
	height: 100px;
	margin: 1em;
	display: inline-block;
}

div:nth-child(2n) {
	margin-left: calc(-1em - 100px);
	border: 1px dashed rgba(0, 0, 0, 0.5);
	box-sizing: border-box;
}

/* примеры квадратов 100×100 c внутренним квадратом 50×50 */
div:nth-child(1) {
	box-sizing: border-box;
	background: padding-box black;
	border: 25px solid transparent;
}

div:nth-child(3) {
	background: linear-gradient(black, black) no-repeat 25px 25px / 50px 50px;
}

div:nth-child(5) {
	box-shadow: inset 0 0 0 25px white, inset 0 0 0 50px black; /* вариант на белом фоне */
}

div:nth-child(7) {
	background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">\
		<path d="M25,25 h50 v50 h-50Z"></path>\
	</svg>');
}

div:nth-child(9) {
	content: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">\
		<path d="M25,25 h50 v50 h-50Z"></path>\
	</svg>');
}

div:nth-child(11) {
	background: black;
	transform: scale(0.5); /* если не важна рамка, тень, другое содержимое и значение getBoundingClientRect */
}

div:nth-child(13) {
	background: black;
	clip-path: polygon(25px 25px, 75px 25px, 75px 75px, 25px 75px); /* если не важно содержимое */
}
</style>


Вариант №1 Любой способ, который был показан выше, может быть применён через JS например так...
<body><script>
const div = document.createElement("div");

Object.assign(div.style, {
	width: "100px",
	height: "100px",
	background: "linear-gradient(black, black) no-repeat 25px 25px / 50px 50px"
});

document.body.append(div);
</script>


Вариант №2 Также возможно сгенерировать картинку при помощи Canvas API.
<body><script>
const div = document.createElement("div");
const canvas = document.createElement("canvas");
canvas.width = 100;
canvas.height = 100;

const context = canvas.getContext("2d");
context.fillRect(25, 25, 50, 50);

Object.assign(div.style, {
	width: `${canvas.width}px`,
	height: `${canvas.height}px`,
	background: `url("${canvas.toDataURL()}") center / contain`
});

document.body.append(div);
</script>


ЕЩЁ Вариант №3 Также возможно сгенерировать картинку при помощи CSS Paint API.
<body><script>
function paintBox() {
	class Box {
		paint(context, size) {
			context.fillRect(0.5 * (size.width - 50), 0.5 * (size.height - 50), 50, 50);
		}
	}
	registerPaint("box", Box);
}

CSS.paintWorklet.addModule(
	`data:text/javascript,${`(${paintBox})();`}`
);

const div = document.createElement("div");

Object.assign(div.style, {
	width: "100px",
	height: "100px",
	background: "paint(box)"
});

document.body.append(div);
</script>

Aetae 27.12.2019 00:07

Biotoxsin, что значит "только на JS"?
Чтобы что-то появилось на экране, JS должен что-то изменить либо в HTML, либо в CSS. А дальше используем один из предложенных выше способов или придумываем ещё один.
Отобразить что-то на экране вообще не трогая CSS и HTML - как вы себе это представляете?

рони 27.12.2019 00:19

Biotoxsin,
не понимаю вопроса про js?
Malleys,
пример интересный, но как он связан с вопросом про js? ваше умение понять, что спросили, впечатляет.

рони 27.12.2019 00:20

Цитата:

Сообщение от Aetae
Отобразить что-то на экране вообще не трогая CSS и HTML - как вы себе это представляете?

:yes:

Malleys 27.12.2019 01:01

Цитата:

Сообщение от рони
пример интересный, но как он связан с вопросом про js? ваше умение понять, что спросили, впечатляет.

Что именно в сообщении №5 непонятно? Вариант №3 может не стоит использовать, если вам нужна поддержка старых браузеров.

Я не представляю, как поменять представление элемента не обращаясь к СSS. Даже встроенные компоненты используют CSS (например, <video>)

рони 27.12.2019 01:11

Цитата:

Сообщение от Malleys
Что именно в сообщении №5 непонятно?

к содержанию сообщения, а тем более в его дополненном виде, с примера ми на js, вопросов нет. для полноты картины не хватает примера с псевдо-элементами.

Alexandroppolus 27.12.2019 12:01

Цитата:

Сообщение от Aetae
Отобразить что-то на экране вообще не трогая CSS и HTML - как вы себе это представляете?

скорее всего, автор подразумевал, что изначально в верстке нет этих элементов, и надо их просто создать скриптом

Biotoxsin 27.12.2019 13:16

Цитата:

Сообщение от Alexandroppolus (Сообщение 518102)
скорее всего, автор подразумевал, что изначально в верстке нет этих элементов, и надо их просто создать скриптом

Неа. Именно без этих элементов. Разве JS не способен визуально создавать объекты (вроде квадрата) не создавая при этом элементы в html ?

рони 27.12.2019 13:57

Цитата:

Сообщение от Biotoxsin
не создавая при этом элементы в html ?

как показать то, что не существует?

Malleys 27.12.2019 13:59

Цитата:

Сообщение от рони
как показать то, что не существует?

Пишут ведь, что «в пустой области 100×100px div»

Цитата:

Сообщение от Biotoxsin
Возможно ли в пустой области 100x100px div создать без вспомогательных HTML тегов чёрный квадрат 50x50px на чистом JS.

Я вам показал в сообщении №5 как в пустом элементе размером 100×100px создать без вспомогательных HTML элементов чёрный квадрат размером 50×50px.

Цитата:

Сообщение от Biotoxsin
Именно без этих элементов. Разве JS не способен визуально создавать объекты (вроде квадрата) не создавая при этом элементы в HTML?

JS в совокупности с Canvas API — способен. Например, как я вам уже показывал, можно нарисовать на холсте.

Biotoxsin 27.12.2019 16:03

Цитата:

Сообщение от Malleys (Сообщение 518109)
Пишут ведь, что «в пустой области 100×100px div»

Я вам показал в сообщении №5 как в пустом элементе размером 100×100px создать без вспомогательных HTML элементов чёрный квадрат размером 50×50px.

JS в совокупности с Canvas API — способен. Например, как я вам уже показывал, можно нарисовать на холсте.

За это Вам отдельная благодарность.

Aetae 27.12.2019 21:18

Цитата:

Сообщение от Biotoxsin (Сообщение 518106)
Неа. Именно без этих элементов. Разве JS не способен визуально создавать объекты (вроде квадрата) не создавая при этом элементы в html ?

То что вы видите, интерфейс - это и есть html + css. JS - это язык программирования, он ничего не выводит на экран. Для вывода изображения он манипулирует css и html.
Цитата:

Сообщение от Malleys (Сообщение 518109)
JS в совокупности с Canvas API — способен. Например, как я вам уже показывал, можно нарисовать на холсте.

Только этот canvas изначально должен как-то оказаться в html или css. И мы возвращаемся к тому с чего начинали.

Malleys 28.12.2019 06:46

Цитата:

Сообщение от Aetae
Только этот canvas изначально должен как-то оказаться в html или css.

И в чём проблема? Написа́ли ведь, что «в пустой области 100×100px div»

Цитата:

Сообщение от Aetae
Для вывода изображения он манипулирует css и html.

А если без css и html в worker-е нарисовать картинку? Вопрос был про то, чтобы использовать только один элемент.

Aetae 28.12.2019 13:14

Цитата:

Сообщение от Malleys (Сообщение 518134)
А если без css и html в worker-е нарисовать картинку? Вопрос был про то, чтобы использовать только один элемент.

Ок, нарисовал. А как теперь ты её покажешь? Только "без рук"(не трогая html или css).

Malleys 28.12.2019 16:06

Цитата:

Сообщение от Aetae
Ок, нарисовал. А как теперь ты её покажешь? Только "без рук"(не трогая html или css).

Какие сложности! Речь шла о том, чтобы использовать только один HTML-элемент. Типа как тут — https://javascript.ru/forum/502228-post14.html

Aetae 28.12.2019 19:15

Malleys,
Цитата:

Сообщение от Biotoxsin (Сообщение 518087)
Меня интересует возможно ли сделать это только на JS?



Часовой пояс GMT +3, время: 12:30.