Вывести свойства в отдельный контейнер
Добрый день.
Подскажите, как при помощи скрипта вывести в отдельный div контейнер только свойство box-shadow одного из блоков при нажатии? их 4 https://jsfiddle.net/5usu50ep/ Т.е. я нажимаю на 1 и 2, а в контейнере выводятся класс и свойства тени каждого контейнера. |
Возможно, так даже будет легче https://jsfiddle.net/t6Lo1je7/
|
madeas,
если макет разместить тут, ответы появятся оперативнее ... <!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> .flex { display: flex; } .block { position: relative; width: 100px; height: 100px; margin: 20px; border: 0; background: #fff !important; } .block::after { content: ''; width: 100%; height: 100%; position: absolute; background-color: #fff; } .bShadow-1{-webkit-box-shadow:0px 1px 1px 1px rgba(0,0,0,0.06);-moz-box-shadow:0px 1px 1px 1px rgba(0,0,0,0.06);box-shadow:0px 1px 1px 1px rgba(0,0,0,0.06);} .bShadow-2{-webkit-box-shadow:0 0 20px 0 rgba(150,150,150,.1);-moz-box-shadow:0 0 20px 0 rgba(150,150,150,.1);box-shadow:0 0 20px 0 rgba(150,150,150,.1);} .bShadow-3{-webkit-box-shadow:0 20px 60px -10px rgba(0,0,0,.1);-moz-box-shadow:0 20px 60px -10px rgba(0,0,0,.1);box-shadow:0 20px 60px -10px rgba(0,0,0,.1);} .bShadow-4{-webkit-box-shadow:0 15px 45px -9px rgba(0,0,0,0.25);-moz-box-shadow:0 15px 45px -9px rgba(0,0,0,0.25);box-shadow:0 15px 45px -9px rgba(0,0,0,0.25);} </style> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <script> $(function() { var b = $(".block"), out = $(".out"), text; b.on("click", function() { text = this.className + " " + $(this).css("box-shadow") out.text(text) }) }); </script> </head> <body> <div class="flex numbers"> <input type="checkbox" class="block bShadow-1"> <input type="checkbox" class="block bShadow-2"> <input type="checkbox" class="block bShadow-3"> <input type="checkbox" class="block bShadow-4"> </div> <div class="out"></div> </body> </html> |
Вариант без jQuery
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <title>Пример</title> </head> <body> <div class="flex numbers"> <input type="checkbox" class="block bShadow-1"> <input type="checkbox" class="block bShadow-2"> <input type="checkbox" class="block bShadow-3"> <input type="checkbox" class="block bShadow-4"> </div> <div class="result"></div> <script > window.onload = function(){ var items = document.querySelectorAll('.flex input'); var result = document.querySelector('.result'); for(var i = 0; i < items.length; i++){ items[i].addEventListener("click", getShadow); } function getShadow(e){ var styleItem = getComputedStyle(e.target); result.innerHTML = styleItem.boxShadow; } } </script> <style type="text/css"> .flex { display: flex; } .block { position: relative; width: 100px; height: 100px; margin: 20px; border: 0; background: #fff !important; } .block::after { content: ''; width: 100%; height: 100%; position: absolute; background-color: #fff; } .bShadow-1{-webkit-box-shadow:0px 1px 1px 1px rgba(0,0,0,0.06);-moz-box-shadow:0px 1px 1px 1px rgba(0,0,0,0.06);box-shadow:0px 1px 1px 1px rgba(0,0,0,0.06);} .bShadow-2{-webkit-box-shadow:0 0 20px 0 rgba(150,150,150,.1);-moz-box-shadow:0 0 20px 0 rgba(150,150,150,.1);box-shadow:0 0 20px 0 rgba(150,150,150,.1);} .bShadow-3{-webkit-box-shadow:0 20px 60px -10px rgba(0,0,0,.1);-moz-box-shadow:0 20px 60px -10px rgba(0,0,0,.1);box-shadow:0 20px 60px -10px rgba(0,0,0,.1);} .bShadow-4{-webkit-box-shadow:0 15px 45px -9px rgba(0,0,0,0.25);-moz-box-shadow:0 15px 45px -9px rgba(0,0,0,0.25);box-shadow:0 15px 45px -9px rgba(0,0,0,0.25);} </style> </body> </html> |
Void, без библиотеки не выводит, почему-то.
А можно сделать вывод только класса bshadow, без .Block, где содержимое класса = выведенному в результат, со скобками и кроссом на новой строке? Вроде генератора |
Цитата:
Цитата:
text = this.className.match(/bS\S+/)[0] + " " + $(this).css("box-shadow") Цитата:
|
Ваш работает, void здесь не работает, может у меня проблема, не вижу результат просто
|
madeas,
а какой браузер? |
madeas,
1. Должно работать, проверил даже в IE. В демонстрации выше, вывод результата просто не помещается, надо прокрутить окошко (iframe), там ниже выводится. 2. Не понимаю, чего вы хотите добиться... Так? result.innerHTML = '.bshadow { ' + styleItem.boxShadow + ' }'; |
рони,
Яндекс. Работает, видимо заглючил. void(), да, спасибо. Только хотел в более полном виде: .bShadow-1 { -webkit-box-shadow:0px 1px 1px 1px rgba(0,0,0,0.06); -moz-box-shadow:0px 1px 1px 1px rgba(0,0,0,0.06); box-shadow:0px 1px 1px 1px rgba(0,0,0,0.06); } .bShadow-2 { -webkit-box-shadow:0 0 20px 0 rgba(150,150,150,.1); -moz-box-shadow:0 0 20px 0 rgba(150,150,150,.1); box-shadow:0 0 20px 0 rgba(150,150,150,.1); } и при нажатии на нужный input, чтобы он добавлялся или убирался из поля результата. Чтобы в конечном итоге получить несколько классов и их можно было скопировать. |
Можно так:
function getShadow(e){ var styleItem = getComputedStyle(e.target); result.innerHTML = '.bshadow{<br>' + '-webkit-box-shadow: ' + styleItem.boxShadow + '; <br>' + '-moz-box-shadow: ' + styleItem.boxShadow + '; <br>' + 'box-shadow: ' + styleItem.boxShadow + '<br>}'; } |
void(),
У меня получилось в итоге вот так https://jsfiddle.net/cog95xb1/ но скрипт не захватывает сами номера блоков (-1, -2 и т.д.), так как класс bShadow прописан нами вручную. Как это подправить? И второй вопрос, как вывести последующие нажатые блоки таким же образом? |
madeas,
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> .flex { display: flex; } .block { position: relative; width: 100px; height: 100px; margin: 20px; border: 0; background: #fff !important; } .block::after { content: ''; width: 100%; height: 100%; position: absolute; background-color: #fff; } .bShadow-1{-webkit-box-shadow:0px 1px 1px 1px rgba(0,0,0,0.06);-moz-box-shadow:0px 1px 1px 1px rgba(0,0,0,0.06);box-shadow:0px 1px 1px 1px rgba(0,0,0,0.06);} .bShadow-2{-webkit-box-shadow:0 0 20px 0 rgba(150,150,150,.1);-moz-box-shadow:0 0 20px 0 rgba(150,150,150,.1);box-shadow:0 0 20px 0 rgba(150,150,150,.1);} .bShadow-3{-webkit-box-shadow:0 20px 60px -10px rgba(0,0,0,.1);-moz-box-shadow:0 20px 60px -10px rgba(0,0,0,.1);box-shadow:0 20px 60px -10px rgba(0,0,0,.1);} .bShadow-4{-webkit-box-shadow:0 15px 45px -9px rgba(0,0,0,0.25);-moz-box-shadow:0 15px 45px -9px rgba(0,0,0,0.25);box-shadow:0 15px 45px -9px rgba(0,0,0,0.25);} </style> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <script> $(function() { function getShadow(e) { var s = getComputedStyle(e).boxShadow; return "{<br>" + "-webkit-box-shadow: " + s + "; <br>" + "-moz-box-shadow: " + s + "; <br>" + "box-shadow: " + s + "<br>}" } var b = $(".block"), out = $(".out"), text; b.on("click", function() { text = $.map(b.filter(":checked"), function(e) { return "<br>" + e.className.match(/bS\S+/)[0] + getShadow(e) }); out.html(text) }) }); </script> </head> <body> <div class="flex numbers"> <input type="checkbox" class="block bShadow-1"> <input type="checkbox" class="block bShadow-2"> <input type="checkbox" class="block bShadow-3"> <input type="checkbox" class="block bShadow-4"> </div> <div class="out"></div> </body> </html> |
madeas,
1. Вот вместо вручную прописанного класса - e.target.classList[1] Проверено, работает. Берет 2-й по счету класс, то есть как раз bShadow-1, bShadow-2 и т.д. 2. Вместо = ставим += . Типа так: result.innerHTML += '.bshadow{<br>' + Правда в этом случае если два раза нажать на один блок, добавится два одинаковых кода и надо еще это обойти. |
void(),
Поставил, работает. Обойти можно путем добавления в каждый input onClick="this.disabled=true" типо вот так: <input type="checkbox" class="block bShadow-4" onClick="this.disabled=true; this.value='Sending…';"> но не совсем понял про замену вручную... подскажите, как должно выглядеть? у меня скрипт получился такой // выводим нажатые блоки в поле result window.onload = function(){ var items = document.querySelectorAll('.flex input'); var result = document.querySelector('.result'); for(var i = 0; i < items.length; i++){ items[i].addEventListener("click", getShadow); } function getShadow(e){ var styleItem = getComputedStyle(e.target); result.innerHTML += '<br>.bshadow{<br>' + '-webkit-box-shadow: ' + styleItem.boxShadow + '; <br>' + '-moz-box-shadow: ' + styleItem.boxShadow + '; <br>' + 'box-shadow: ' + styleItem.boxShadow + ';<br>}'; } } |
result.innerHTML += e.target.classList[1]+'{<br>' + |
j0hnik,
в таком виде пропадает точка и перенос строки перед классом |
поправил
result.innerHTML += '<br>.' +e.target.classList[1]+'{<br>' + |
void(), j0hnik, рони, спасибо за помощь!
Вышло вроде не плохо https://madeas.github.io/box-shadows. При нажатии на кнопку "show in blocks" появляется возможность точной настройки странички и небольшой генератор из кода, собранного здесь. Не знаю, на сколько полезная вещь получилась, но надеюсь, кому-нибудь пригодится. Еще раз, большое спасибо за помощь и профессионального развития! |
Ребят, подскажите, а можно ли к этому результату добавить кнопку, чтобы при помощи js пользователи могли генерировать свой файл из выбранных стилей? в формат box-shadows.css или txt
Или здесь уже нужен php обработчик? |
Задачу решил, но пришлось применить библиотеку, убрать <br> из скрипта и заменить div.result на textarea.result https://jsfiddle.net/madeas/6og583b8/ - генерирует сразу css файл
Отсюда вылезли другие проблемы. void(), подскажите, пожалуйста. Можно ли настроить ваш код на переход по новым строкам для textarea? В ином случае он выводит все с сплошным текстом и показывает <br> Я убрал из кода перенос, получилось вот так: // выводим нажатые блоки в поле result window.onload = function(){ var items = document.querySelectorAll('.flex div.block'); var result = document.querySelector('.result'); for(var i = 0; i < items.length; i++){ items[i].addEventListener("click", getShadow); } function getShadow(e){ var styleItem = getComputedStyle(e.target); result.innerHTML += '.' +e.target.classList[1]+'{' + '-webkit-box-shadow:' + styleItem.boxShadow + ';' + '-moz-box-shadow:' + styleItem.boxShadow + ';' + 'box-shadow:' + styleItem.boxShadow + ';}'; } } |
madeas,
Неплохо :victory: Сохранять файлы можно. Я когда-то делал такую возможность для своего текстового редактора. Используется API в HTML5. Есть готовые библиотеки для работы с этим API в щадящем для мозга виде и разными фишками. Но в целом типа того - https://codepen.io/davidelrizzo/pen/cxsGb ----- Если я правильно понял задачу, то перенос строки в textarea осуществляется с помощью символов Или - \n |
Ну да, примерно на этом и реализовал.
Спасибо, все получилось https://madeas.github.io/box-shadows. Заменил <br>, все работает. |
void(),
еще немного помучаю, если не против. я тут собрал такой код: <textarea id=get_date> Здесь какой-то текст (тут дата и время) здесь продолжение текста без пробелов и отступов. </textarea> <script> var d=new Date(); var day=d.getDate(); var month=d.getMonth() + 1; var year=d.getFullYear(); var hours=d.getHours(); var minutes=d.getMinutes(); document.write(year + '' + month + '' + day + '' + hours + '' + minutes); get_date.innerHTML+=day+''+month+''+year+''+hours+''+minutes; </script> Надо чтобы в определенном месте textarea выводились указанные скриптом данные, т.е. текущие дата и время. Или после указанного слова. Это возможно? Сейчас, если убрать document.write(year + '' + month + '' + day + '' + hours + '' + minutes);получится просто текст с краю. |
Решил. Оставлю тут, может пригодится кому. В примере ниже генерируется нынешнее время в указанном скриптом месте. Между текстом.
<textarea class="result" id="result"></textarea> var d=new Date(); var day=d.getDate(); var month=d.getMonth() + 1; var year=d.getFullYear(); var hours=d.getHours(); var minutes=d.getMinutes(); result.innerHTML+= '/*!\n'+' * box-shadows.min.css v1.0.1'+'g' + day+''+month+''+hours+''+minutes+' - https://github.com/madeas/box-shadows.css\n'+' * \n'+' * Copyright (c) 2018 Andrej Sharapov\n'+' * Licensed under MIT (https://github.com/madeas/box-shadows.css/blob/master/LICENSE)\n'+' */\n'+'\n'; |
Я бы так сделал:
<textarea style="width:100%;min-height:100px;" id="result">/*! * box-shadows.min.css v1.0.1g#DAY#MONTH#HOURS#MONUTES - https://github.com/madeas/box-shadows.css * * Copyright (c) 2018 Andrej Sharapov * Licensed under MIT (https://github.com/madeas/box-shadows.css/blob/master/LICENSE) */ </textarea> <script> const date=new Date(); result.value=result.value .replace('#DAY',date.getDate()) .replace('#MONTH',date.getMonth()+1) .replace('#HOURS',date.getHours()) .replace('#MONUTES',date.getMinutes()); </script> |
Nexus,
Я пробовал сделать подобным образом. Это чуть проще, но не эффективно, поскольку ниже надо еще вывести данные нажатых блоков, а при заполненном содержимом поля, они не добавляются. Я вообще в скриптах не шарю, собственная "хотелка" заставила выкручиваться. Может если доработать ваш код, все и получится, но моих знаний не достаточно) Так что, пусть пока будет так. |
Цитата:
<textarea style="width:100%;min-height:150px;" id="result">/*! * box-shadows.min.css v1.0.1g#DAY#MONTH#HOURS#MONUTES - https://github.com/madeas/box-shadows.css * * Copyright (c) 2018 Andrej Sharapov * Licensed under MIT (https://github.com/madeas/box-shadows.css/blob/master/LICENSE) */ </textarea> <div id="press"> Содержание, которое надо еще добавить </div> <script> const date=new Date(); result.value=result.value .replace('#DAY',date.getDate()) .replace('#MONTH',date.getMonth()+1) .replace('#HOURS',date.getHours()) .replace('#MONUTES',date.getMinutes()); press.onclick = function() { result.value=result.value + this.textContent; } </script> |
Часовой пояс GMT +3, время: 11:56. |