#javascript #css #html
#javascript #css #HTML
Вопрос:
Мы отображаем текст, извлекая json….
Щелкнув текст, мы разрешаем пользователю добавлять больше текста….
Проблема :
Добавленный текст должен отображаться только внутри контейнера, если текст выходит за пределы контейнера, его следует скрыть как это 5-секундное видео , но теперь текст отображается за пределами контейнера, как в приведенном ниже коде….
let jsonData = {
"layers": [{
"x": 0,
"height": 300,
"layers": [
{
"justification": "center",
"font": "Coustard-Black",
"x": 190,
"y": 150,
"src": "0a7fb3015bb19745da114bc581e96947_Font248.ttf",
"width": 72,
"type": "text",
"color": "red",
"size": 32,
"text": "DATE",
"height": 17,
"name": "edit_date"
}
],
"y": 0,
"width": 300,
"type": "group",
"name": "fb_post_4"
}]
};
const containerElement = $('#container');
const fileUp = $('#fileup');
$(function() {
// IGNORE BELOW CODE
// Fetch text from json file
function getAllSrc(layers) {
let arr = [];
layers.forEach(layer => {
if (layer.src) {
arr.push({
src: layer.src,
x: layer.x,
y: layer.y,
height: layer.height,
width: layer.width,
name: layer.name
});
} else if (layer.layers) {
let newArr = getAllSrc(layer.layers);
if (newArr.length > 0) {
newArr.forEach(({
src,
x,
y,
height,
width,
name
}) => {
arr.push({
src,
x: (layer.x x),
y: (layer.y y),
height,
width,
name: (name)
});
});
}
}
});
return arr;
}
function json(data)
{
var width = 0;
var height = 0;
let arr = getAllSrc(data.layers);
let layer1 = data.layers;
width = layer1[0].width;
height = layer1[0].height;
let counter = 0;
let table = [];
// container dimensions
containerElement.css('width', width "px").css('height', height "px").addClass('temp');
//end
for (let {
src,
x,
y,
name
} of arr) {
var imageUrl1 = '';
var mask = $(".container").mask({
imageUrl: imageUrl1,
// Fetch Mask images
maskImageUrl: 'http://piccellsapp.com:1337/parse/files/PfAppId/' src,
// end
onMaskImageCreate: function(img) {
// Mask image positions
img.css({
"position": "absolute",
"left": x "px",
"top": y "px"
});
// end
},
id: counter
});
table.push(mask);
fileup.onchange = function() {
let mask2 = table[target];
const newImageLoadedId = mask2.loadImage(URL.createObjectURL(fileup.files[0]));
document.getElementById('fileup').value = "";
};
counter ;
}
// Text
drawText(data);
}
json(jsonData);
}); // end of function
// IGNORE ABOVE CODE
//Fetch text
const fonts = []; // caching duplicate fonts
function drawText(layer) {
if (layer.type === 'image') return;
if (!layer.type || layer.type === 'group') {
return layer.layers.forEach(drawText)
}
if (layer.type === 'text') {
const url = 'https://i.imgur.com/' layer.src;
if (!fonts.includes(url)) {
fonts.push(url);
$("style").prepend("@font-face {n"
"tfont-family: "" layer.font "";n"
"tsrc: url(" url ") format('truetype');n"
"}");
}
// Below is text Code
const lightId = 'light' layer.name
const lightIdString = '#' lightId
$('.container').append(
'<input id="font" style="display:none"><a id ="' layer.name '" '
'<div class="txtContainer" id = "text" contenteditable="true" '
'style="'
'left: ' layer.x 'px; '
'top: ' layer.y 'px; '
'font-size: ' layer.size 'px; '
'">' layer.text '</div></a>'
'<div id="light' layer.name '" class="white_content" style="'
'left: ' layer.x 'px; '
'top: ' layer.y 'px; ' '"> '
'</div> <div>'
);
}
}
// text end
// IGNORE BELOW CODE
(function($) {
var JQmasks = [];
$.fn.mask = function(options) {
// This is the easiest way to have default options.
var settings = $.extend({
// These are the defaults.
maskImageUrl: undefined,
imageUrl: undefined,
scale: 1,
id: new Date().getUTCMilliseconds().toString(),
x: 0, // image start position
y: 0, // image start position
onMaskImageCreate: function(div) {},
}, options);
var container = $(this);
let prevX = 0,
prevY = 0,
draggable = false,
img,
canvas,
context,
image,
timeout,
initImage = false,
startX = settings.x,
startY = settings.y,
div;
container.updateStyle = function() {
return new Promise((resolve, reject) => {
context.beginPath();
context.globalCompositeOperation = "source-over";
image = new Image();
image.setAttribute('crossOrigin', 'anonymous');
image.src = settings.maskImageUrl;
image.onload = function() {
canvas.width = image.width;
canvas.height = image.height;
context.drawImage(image, 0, 0, image.width, image.height);
div.css({
"width": image.width,
"height": image.height
});
resolve();
};
});
};
};
}(jQuery));
.container {
background: silver;
position: relative;
}
.container img {
position: absolute;
top: 0;
bottom: 250px;
left: 0;
right: 0;
margin: auto;
z-index: 999;
}
.masked-img {
overflow: hidden;
position: relative;
}
.txtContainer {
position: absolute;
color: #FFF;
white-space: pre;
}
.txtContainer:hover {
position: absolute;
background: red;
white-space: pre;
}
.pip {
display: inline-block;
margin: 0;
position: absolute;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<body style="background : green">
<input id="fileup" name="fileup" type="file" style="display:none" >
<div id="container"class="container">
</div>
Вот Codepen
Комментарии:
1. просто используйте
overflow:hidden
вcontainer div
2. измените свой CSS с помощью этого
.white_content { display: none; width: 70%; height: 40%; padding: 16px; border: 16px solid orange; background-color: white; z-index: 1002; overflow: auto; }
Ответ №1:
Добавить overflow: hidden;
в .container
.
.container {
background: silver;
position: relative;
overflow: hidden;
}
Комментарии:
1. спасибо, это сработало нормально, но есть проблема, если мы используем
overflow:hidden
, когда пользователь нажимает на текст, мы также показываем всплывающее окно, это всплывающее окно не будет отображаться полностью ….. codepen2. Попробуйте переместить всплывающее окно за пределы контейнера. В строке 334: использовать
$('.container').after(/*...*/)
вместо$('.container').append(/*...*/)
3. извините за задержку, я следил за вашим кодом, теперь я не могу видеть
dropdown
, что поможет изменить размер шрифта…. [ imgur.com/a/SnIQ3PO ] , прежде чем я увидел выпадающий список…. также текст теперь не будет скрываться за пределами контейнера,4. но по этой ссылке он работает нормально…..
5. Эх .. я не хочу слишком глубоко погружаться в ваш код. Вероятно, вы потеряли некоторые ссылки, перемещая всплывающее окно в другое место, чем раньше. Но что вам нужно, так это ввести текст внутри контейнера, в котором есть
overflow: hidden
и всплывающее окно за его пределами. Если вы посмотрите на рабочий сайт, вы увидите, что они сделали это именно так. Другие проблемы, вероятно, связаны с javascript.
Ответ №2:
У вас неправильная разметка
<a id="edit_date" <div="" class="txtContainer" contenteditable="true" style="left: 190px; top: 150px; font-size: 32px; ">DAdTE</a>