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, вопросов нет. для полноты картины не хватает примера с псевдо-элементами.


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